HomeBlog › ChatGPT Shopping 30-day playbook

2026-06-04  •  ~16 min read  •  CatalogScan

ChatGPT Shopping for Shopify: a 30-day setup and audit playbook

Most Shopify stores enabled Agentic Storefronts and waited. Three months later, nothing. Here's why — and the 30-day sequence that actually closes the gap between "the toggle is on" and "ChatGPT Shopping is sending revenue."

73%
of Shopify stores fail at least one crawl-access check that prevents ChatGPT Shopping indexing
61%
have no Product JSON-LD at all, or only the JS-injected version that OAI-SearchBot can't read
+31%
average conversion rate premium for AI-referred traffic vs. direct search
2–4 wk
typical time from structured data fix to OAI-SearchBot re-crawl and index update

Why the next 30 days matter more than the last 90

On March 24, 2026, Shopify enabled Agentic Storefronts by default for every eligible US merchant. The marketing framing implied: toggle on, get visible in ChatGPT. What actually happened: stores got the toggle, and ChatGPT Shopping visibility stayed the same for most of them.

The toggle is a necessary condition but not a sufficient one. The Agentic Storefronts toggle opens a catalog API channel — it doesn't fix your structured data, add your GTINs, expand your product descriptions, or register your store with Google Merchant Center. ChatGPT Shopping can now transact through your store, but it still needs to be able to find, crawl, and understand your products before it will recommend them.

The compounding effect: ChatGPT Shopping re-crawls at a cadence. If you fix a signal today and the crawler picks it up in two weeks, you have two weeks of re-indexing before your products start appearing in more queries. If you wait another month to start, you're a month further behind. The merchants who started optimizing in April are already seeing measurable referral traffic. The merchants who haven't started are leaving every week's compounding on the table.

The other reason the next 30 days matter specifically: Google AI Mode is aggressively expanding its Shopping Graph ingestion in the first half of 2026. If you're not already in Google Merchant Center with a clean, structured feed, you're also missing the fastest-growing AI shopping surface — and it shares most of its optimization requirements with ChatGPT Shopping.

How ChatGPT Shopping actually discovers and ranks your products

Understanding the mechanics helps you prioritize the right fixes. ChatGPT Shopping doesn't work like Google Shopping or a comparison shopping engine. It works in two overlapping layers:

Layer 1: Direct crawl by OAI-SearchBot

OpenAI's crawler — identified by the user-agent string OAI-SearchBot — visits your product pages directly, the same way Googlebot does. It reads server-rendered HTML. It does not execute JavaScript. It looks for Product JSON-LD in <script type="application/ld+json"> blocks injected server-side (i.e., via your Shopify Liquid theme), not via JavaScript-injected blocks added by apps at runtime.

If your Product JSON-LD is added by a Shopify app that injects it via JavaScript (which is the default for most review apps and some SEO apps), OAI-SearchBot reads it as missing. It sees the HTML, it skips the JavaScript execution, and it finds no structured product data.

Layer 2: Index ingestion from Google and Bing Shopping

ChatGPT Shopping also ingests product data from the Google Shopping index and Bing Shopping index. This means products that are already in Google Merchant Center with complete, validated data can appear in ChatGPT Shopping even before OAI-SearchBot crawls the product page directly. It also means Google Merchant Center feed errors affect your ChatGPT Shopping visibility — not just your Google Shopping campaigns.

Related reading

Ranking within ChatGPT Shopping responses

Once a product is discoverable, ChatGPT Shopping ranks it against competitors based on:

  1. Structured data completeness — Product JSON-LD with all core properties present and valid
  2. GTIN coverage — exact-variant matching requires a valid GTIN; products without GTINs match less precisely and rank lower for specific product queries
  3. Description relevance — the body of your product description is used for query matching; generic 50-word descriptions match far fewer queries than 200+ word descriptions with use-case language
  4. Price signal clarity — price with priceCurrency, priceValidUntil where relevant; stale or missing prices reduce confidence
  5. Review authority — AggregateRating with a meaningful ratingCount; stores with reviews visible in structured data rank higher for purchase-intent queries
  6. Brand entity strength — Organization sameAs links to your social profiles, brand consistency between your homepage and product pages

Day 0: the baseline audit before you touch anything

Don't start making changes until you have a baseline. Changes made without a baseline are impossible to attribute — you won't know which fix moved the score, and you won't know if something you changed made things worse.

The Day 0 audit takes about 20 minutes and produces four numbers you'll track across the 30 days.

Audit 1: Run a CatalogScan

Go to catalogscan.com, enter your store URL, and let the scan run. The report gives you a 0–100 score broken into 18 signals across five categories: crawl access, structured data, description quality, feed/discovery, and trust signals. Screenshot the score and save the PDF. This is your day-0 baseline.

Pay attention to the signals marked Critical and High in the report — those are the ones that affect whether ChatGPT Shopping can find and include your products at all. Medium signals affect ranking quality, not inclusion.

Audit 2: Check OAI-SearchBot access

curl -A "OAI-SearchBot/1.0" https://yourstore.com/robots.txt
curl -A "OAI-SearchBot/1.0" -I https://yourstore.com/products/your-product-handle

The first command shows what your robots.txt says to OAI-SearchBot specifically. Look for Disallow: / under User-agent: OAI-SearchBot or under User-agent: *. The second confirms the product page returns a 200 and not a 403 or challenge page.

Audit 3: Check current JSON-LD output

On a representative product page, right-click → View Page Source (not Inspect — you need the server-rendered HTML, not the JavaScript-executed DOM). Press Cmd+F (or Ctrl+F) and search for application/ld+json. Count the blocks. For each Product block, verify it contains: @type: "Product", name, description, offers with price and priceCurrency, and ideally sku or gtin13.

If you see zero JSON-LD blocks in the source HTML, your theme either doesn't generate them or does it via JavaScript. If you see blocks but they're missing the offers/price structure, you have partial JSON-LD that passes schema validation but fails practical crawl use.

Audit 4: Check your current GA4 AI referral baseline

In GA4, go to Reports → Acquisition → Traffic acquisition. Filter by Session source contains chatgpt.com. Note the sessions and any revenue. This is your week-0 revenue baseline. Even zero is useful — it confirms you're not already seeing traffic that would complicate attribution of your fixes.

Day 0 checkpoint — record these numbers before proceeding

CatalogScan score: _____ / 100  |  OAI-SearchBot: allowed / blocked  |  JSON-LD blocks: _____  |  GA4 chatgpt.com sessions (last 30 days): _____

Week 1 (Days 1–7): crawl access and JSON-LD foundations

Week 1
Crawl access + JSON-LD foundations
These are inclusion signals — without them, the rest doesn't matter
  • Confirm OAI-SearchBot, PerplexityBot, Google-Extended, and ClaudeBot are allowed in robots.txt
  • Add server-side Product JSON-LD to your Shopify theme (via Liquid, not an app)
  • Confirm JSON-LD appears in View Page Source for product pages, not just in the browser inspector
  • Remove or suppress any JavaScript-only JSON-LD that duplicates your Liquid output

The robots.txt fix: less is more

Your Shopify-generated robots.txt is likely fine out of the box. The problems come from custom rules added for other purposes — blocking scrapers, restricting admin paths, preventing duplicate-content indexing of collection pages. Many stores have a wildcard pattern like User-agent: * / Disallow: /collections/ that inadvertently catches AI shopping crawlers.

The safe pattern: create explicit Allow: rules for each AI crawler under a User-agent: * block that would otherwise restrict them:

User-agent: OAI-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: Google-Extended
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: *
Disallow: /admin
Disallow: /cart
Disallow: /checkout

The specific User-agent blocks take precedence over the wildcard, so you can still restrict non-AI bots while letting AI shopping crawlers through.

⚠ Cloudflare users: A passing robots.txt check doesn't mean AI crawlers can actually reach your store. If you use Cloudflare, Bot Fight Mode and the AI Scrapers managed ruleset can block AI crawlers at the CDN layer — before they see your robots.txt at all. Check Cloudflare Security → Bots → Bot Fight Mode first. See our Cloudflare AI crawlers guide for the safe configuration.

The JSON-LD fix: move it out of JavaScript

The most common JSON-LD failure pattern we see in scans: a store has a popular SEO app that injects Product JSON-LD, the developer tools inspector shows it perfectly, and the store owner assumes everything is fine. But View Page Source — the actual server-rendered HTML that OAI-SearchBot reads — shows no JSON-LD at all.

The fix is a Liquid snippet added directly to your theme. Here's the minimal viable version for sections/main-product.liquid or in a standalone snippet:

{% if template contains 'product' %}
{% assign p = product %}

{% endif %}

This is a starting point. Week 2 will add GTIN, AggregateRating, and description depth. But getting a clean server-side JSON-LD block live is the prerequisite for everything else.

Week 1 checkpoint

View Page Source on three product pages. Each should show at least one application/ld+json block with @type: Product, name, description, and offers/price. Confirm OAI-SearchBot returns HTTP 200 with the curl test from Day 0.

Week 2 (Days 8–14): structured data depth

Week 2
GTIN coverage, description richness, AggregateRating
These are ranking signals — they move you from "included" to "quoted first"
  • Add GTINs to your 20 highest-traffic products via Shopify admin (Products → Barcode field)
  • Expand product descriptions on those same 20 products to 150+ words with use-case and specification language
  • Verify your review app injects AggregateRating server-side (View Page Source check)
  • If review app uses JavaScript injection, add server-side AggregateRating via Storefront API or metafields

GTINs: the exact-match unlock

When a user asks ChatGPT Shopping "where can I buy a Sony WH-1000XM5 for under $300," ChatGPT Shopping resolves the query against the Sony GTIN — it's looking for exact-variant matches across every merchant that has that GTIN. Without a GTIN on your product, your listing is a candidate for the query (it might match on brand + name + description tokens), but it won't appear in the exact-match lookup that surfaces specific branded products.

For branded goods you resell, GTINs are usually on the packaging and in your supplier data. Enter them in Shopify admin under Products → [product] → Barcode. For your own manufactured products without assigned GTINs, use "identifier_exists": false in your JSON-LD's Offer block — this tells AI crawlers you're not withholding data, the GTIN genuinely doesn't exist for this product.

Our scan data shows GTIN coverage varies dramatically by category: fashion and apparel stores average 23% GTIN coverage; electronics and consumer goods stores average 61%. If you're in a non-branded category, the GTIN gap matters less for exact-match but you should still work through the rest of the signals.

Descriptions: the 150-word threshold

ChatGPT Shopping extracts product descriptions in two ways: from the Product JSON-LD description field, and from the body_html field in /products.json (after stripping HTML). Both read the same source — your Shopify product description.

Products under 150 words are semantically thin for AI query matching. They don't have enough signal tokens for multiple query intents to land on them. A 40-word description of a running shoe ("Lightweight mesh upper with cushioned sole. Available in 6 colors. Machine washable.") can't match "best wide-fit running shoe for plantar fasciitis," "lightweight shoes for hot weather running," or "washable shoes for everyday gym use" — three different queries, each of which could convert, all of which bounce off a thin description.

Focus the week 2 description work on your 20 highest-traffic products. Add:

Deep dive

AggregateRating: the most commonly broken signal

Our scan data shows 9 in 10 stores fail AggregateRating — even stores with visible star ratings on every product page. The disconnect: review apps (Judge.me, Yotpo, Loox, Stamped, Okendo) render the stars on screen and inject the AggregateRating JSON-LD via JavaScript. OAI-SearchBot reads the static HTML and finds no AggregateRating at all.

The quickest fix that works across all review apps: pull your review aggregate from the Storefront API and cache it in a product metafield. Then emit it from Liquid in your server-side JSON-LD block. This decouples your structured data from the review app's JavaScript and makes it crawler-readable.

For a simpler temporary fix: check if your review app has a "server-side JSON-LD" setting. Judge.me has one under Settings → Theme integration → JSON-LD. Okendo has one in their Shopify theme app embed settings. Enable it, then verify via View Page Source.

Week 2 checkpoint

Run a second CatalogScan after deploying week 2 changes. Compare scores on the GTIN signal, description quality signal, and AggregateRating signal against your day-0 baseline. These three signals alone are worth 30–40 points on a typical under-optimized store.

Week 3 (Days 15–21): feed and entity signals

Week 3
Google Merchant Center, sameAs, BreadcrumbList, shippingDetails
These signals affect index ingestion and brand entity resolution
  • Verify your store is active in Google Merchant Center with no critical feed errors
  • Submit a product sitemap to GMC if you don't have one
  • Add Organization sameAs links to your Shopify theme's homepage JSON-LD
  • Add BreadcrumbList and shippingDetails to your product JSON-LD
  • Add priceValidUntil to sale prices using a metafield-driven approach

Google Merchant Center: the index shortcut

Submitting your catalog to Google Merchant Center is the fastest path to ChatGPT Shopping visibility that doesn't require waiting for OAI-SearchBot's 2–4 week crawl cycle. ChatGPT Shopping ingests from the Google Shopping index, so a clean GMC feed can put your products in front of ChatGPT Shopping users faster than direct crawl.

The prerequisite: your GMC account must be in "approved" status with no critical feed errors. Go to Google Merchant Center → Products → Diagnostics. If you see errors for "missing required attribute [gtin]," "invalid price," "mismatched price," or "missing [availability]" — those are the same signals you're fixing in your structured data. Fix them in both places. A GMC feed error means your product is also invisible in Google AI Mode.

If you're not in GMC at all: install the Google & YouTube channel app from the Shopify App Store (free). It creates an automated product feed and handles GMC submission. Products typically appear in GMC within 3–5 days of feed acceptance.

Organization sameAs: brand entity resolution

When ChatGPT processes a query for "running shoes from [your brand name]," it tries to resolve your brand against its knowledge graph. Strong brand entity signals tell it unambiguously that "your brand name" maps to your domain. Weak entity signals result in lower confidence scores and lower ranking for branded queries.

Add sameAs links to the Organization JSON-LD on your homepage, pointing to your brand's established profiles:

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "{{ shop.name }}",
  "url": "{{ shop.url }}",
  "logo": "{{ shop.url }}/assets/logo.svg",
  "sameAs": [
    "https://twitter.com/yourbrand",
    "https://www.instagram.com/yourbrand/",
    "https://www.facebook.com/yourbrand",
    "https://www.linkedin.com/company/yourbrand"
  ]
}

Consistency matters: the name in your Organization JSON-LD should match the name on those social profiles exactly. Inconsistencies lower the entity confidence score.

ShippingDetails and priceValidUntil: the trust signals

ChatGPT Shopping weights price confidence and shipping transparency higher than most SEO-optimized content strategies do. A product with a clearly stated price, an explicitly set priceValidUntil, and defined shipping costs ranks better than one with the same GTIN and description that omits these — because the AI can make a confident recommendation with accurate information.

Add shippingDetails to your Offer:

"shippingDetails": {
  "@type": "OfferShippingDetails",
  "shippingRate": {
    "@type": "MonetaryAmount",
    "value": "0",
    "currency": "USD"
  },
  "shippingDestination": {
    "@type": "DefinedRegion",
    "addressCountry": "US"
  },
  "deliveryTime": {
    "@type": "ShippingDeliveryTime",
    "handlingTime": { "@type": "QuantitativeValue", "minValue": 0, "maxValue": 1, "unitCode": "DAY" },
    "transitTime": { "@type": "QuantitativeValue", "minValue": 3, "maxValue": 5, "unitCode": "DAY" }
  }
}

For priceValidUntil: only add it if you store a sale end date in a product metafield. Never hardcode a date — a stale priceValidUntil in the past lowers ranking confidence. The safe pattern is a Liquid conditional that omits the field entirely when no sale date is set.

Week 3 checkpoint

In Google Merchant Center: zero critical errors in Diagnostics. In your homepage HTML source: Organization JSON-LD present with at least two sameAs links. On your product page source: shippingDetails present in the Offer block. Run a third CatalogScan to confirm the feed/discovery signals moved.

Week 4 (Days 22–30): measure, iterate, and close the loop

Week 4
Attribution setup, verification, first measurement cycle
You need to see the signal before you can optimize further
  • Set up GA4 custom channel group for AI Shopping Agents
  • Run a final CatalogScan — compare against day-0 baseline
  • Check server logs for OAI-SearchBot crawl activity on product pages
  • Review Google Search Console Product tab for impression changes
  • Prioritize the next 20 products for GTIN + description work based on your traffic data

GA4 custom channel group: making the invisible visible

By default, ChatGPT Shopping traffic lands in GA4's "Referral" channel. Perplexity traffic also goes to Referral. Google AI Mode traffic goes to Organic Search (indistinguishable from regular organic). You need a custom channel group to separate and measure AI shopping sources.

In GA4: Admin → Data display → Channel groups → Create new channel group → Add channels:

Channel name Rule
ChatGPT Shopping Session source exactly matches chatgpt.com
Perplexity Shopping Session source exactly matches perplexity.ai
Claude.ai Referral Session source exactly matches claude.ai
Google AI Overview Session source contains google.com AND Session medium = organic AND landing page URL contains srsltid

Apply this channel group retroactively to your last 90 days of data. This surfaces any ChatGPT Shopping traffic that was already landing before you started optimizing.

The day-30 audit: measuring your gains

Run a final CatalogScan on day 30 and compare to your day-0 baseline. The typical outcome for a store that executed all four weeks faithfully:

Signal category Typical day-0 score Typical day-30 score Expected lift
Crawl access 15 / 20 20 / 20 +5 pts
Structured data completeness 8 / 25 20 / 25 +12 pts
Description quality 4 / 15 10 / 15 +6 pts
Feed & discovery 5 / 20 14 / 20 +9 pts
Trust signals 6 / 20 14 / 20 +8 pts
Total 38 / 100 78 / 100 +40 pts

Score improvement doesn't equal immediate revenue — the re-crawl and re-index cycle means GA4 revenue impact typically lags structured data fixes by 3–6 weeks. But the CatalogScan score is the leading indicator: it tells you whether your fixes are correctly deployed before waiting for crawler confirmation.

Attribution deep dive

After day 30: the monthly review cadence

The 30-day playbook covers the foundation. The stores that see compounding gains run a monthly review cycle after that:

The compounding math: A store that goes from 38 to 78 on its CatalogScan score in 30 days, then adds 5 more points each month through the GTIN + description sweep, hits 93/100 within 6 months. Our scan data shows stores above 85 generate roughly 4× the AI referral revenue of stores in the 40–60 range — not because the algorithm rewards high scores, but because the signals that produce high scores are exactly the signals AI shopping agents use to make confident recommendations.

FAQ

How is ChatGPT Shopping different from Google Shopping for Shopify merchants?

Google Shopping ranks products based on bid + Quality Score + feed completeness. ChatGPT Shopping doesn't accept bids — it ranks entirely on catalog signal quality: structured data completeness, GTIN coverage, description richness, review data, and brand entity strength. There's no ad spend lever, which means well-optimized small stores can outrank large stores that relied on spend. The other key difference is discovery: Google Shopping is keyword-triggered; ChatGPT Shopping is query-intent triggered, so optimizing for natural language queries ("best lightweight running shoes for flat feet under $120") requires description signals that traditional SEO rarely emphasizes.

How do I know if ChatGPT Shopping is already sending traffic?

In GA4, go to Reports → Acquisition → Traffic acquisition, filter by Session source = chatgpt.com. In Shopify Analytics, check the Referrer report for chatgpt.com rows. Server logs will also show OAI-SearchBot and ChatGPT-User crawl activity, which predicts future referral traffic 2–4 weeks ahead of actual sessions.

What's the minimum to appear in ChatGPT Shopping within 30 days?

Three things: (1) Allow OAI-SearchBot in robots.txt. (2) Add server-side Product JSON-LD with at minimum name, description (150+ words), price, priceCurrency, and availability. (3) Add GTINs to your top 20 highest-traffic products. These three changes address the most common exclusion reasons in our scan data. The full 30-day playbook adds AggregateRating, GMC submission, and brand entity signals — those add ranking quality on top of basic inclusion.

Why isn't my CatalogScan score improving after I made fixes?

Score changes require OAI-SearchBot to re-crawl after the fix — typically 2–4 weeks. CatalogScan shows the current live state of your pages, not what OAI-SearchBot has cached. If CatalogScan score improved, the JSON-LD output is correct. If the score didn't move, the fix either didn't deploy to the live theme, or a JavaScript-injected block is overriding your Liquid JSON-LD. Check for duplicate Product JSON-LD blocks: View Page Source → Cmd+F "application/ld+json".

Should I prioritize ChatGPT Shopping, Perplexity, or Google AI Mode first?

The underlying signals overlap about 80%. Run the 30-day playbook optimized for ChatGPT Shopping first, then use the final audit week to add Perplexity-specific signals (AggregateRating weight is higher) and Google AI Mode signals (feed freshness matters more, srsltid parameter). You don't need three separate optimization tracks.

The tactical checklist version of this guide

Audit your store before you start

Run a free CatalogScan to get your day-0 baseline — 18 signals, 90 seconds, no login required.

Run a free scan