Home › Blog › ChatGPT Shopping 30-day playbook
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."
In this post
- Why the next 30 days matter more than the last 90
- How ChatGPT Shopping actually discovers and ranks your products
- Day 0: the baseline audit before you touch anything
- Week 1: crawl access and JSON-LD foundations
- Week 2: structured data depth — GTIN, descriptions, AggregateRating
- Week 3: feed and entity signals
- Week 4: measure, iterate, close the loop
- After day 30: the monthly review cadence
- FAQ
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 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
- ChatGPT Shopping, Perplexity, and Google AI Mode: how each agent picks from your catalog — signal priority table for all three platforms
- AI shopping agent product ranking factors — the 6 ranked signals with per-agent impact matrix
Ranking within ChatGPT Shopping responses
Once a product is discoverable, ChatGPT Shopping ranks it against competitors based on:
- Structured data completeness — Product JSON-LD with all core properties present and valid
- GTIN coverage — exact-variant matching requires a valid GTIN; products without GTINs match less precisely and rank lower for specific product queries
- 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
- Price signal clarity — price with priceCurrency, priceValidUntil where relevant; stale or missing prices reduce confidence
- Review authority — AggregateRating with a meaningful ratingCount; stores with reviews visible in structured data rank higher for purchase-intent queries
- 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.
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
- 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.
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.
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
- 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:
- Specific use case: who uses it, for what activity, in what context
- Materials or ingredients with specifics (not "premium materials" — "14-gauge 304 stainless steel")
- The problem it solves, stated as the constraint a customer would search for
- Quantified claims (numbers are the most extractable unit for AI agents)
- What it replaces or how it compares to the category default (activates "alternative to" query matching)
Deep dive
- Shopify product descriptions for AI shopping agents: the six signals ChatGPT, Perplexity, and Google AI Mode extract — includes a full before/after rewrite example
- Technical implementation guide: product descriptions for AI agents — the JSON-LD description connection and word-count threshold table
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.
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
- 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.
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
- 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
- Shopify AI shopping agent attribution: how to see exactly what ChatGPT, Perplexity, and Google AI Mode are sending you — complete GA4 setup guide with every referrer signature
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:
- Monthly GTIN sweep: Add GTINs to the next batch of 20 products, prioritized by organic traffic volume. Goal: 80%+ GTIN coverage across your catalog within 3 months.
- Monthly description audit: Identify the 20 products most frequently crawled by OAI-SearchBot (from server logs) that still have descriptions under 150 words. Expand them.
- Monthly score check: Run a CatalogScan. If any category dropped below 70% of its maximum, investigate why — a theme update, new app installation, or GMC sync issue can quietly undo structured data fixes.
- Monthly revenue review: In GA4, pull AI Shopping Agents channel revenue vs. prior month. Identify the top 5 landing pages by revenue from AI referrals — those are your highest-leverage products for further optimization.
- Quarterly GMC audit: Check Google Merchant Center Diagnostics for any new feed errors. New product categories, price changes, and currency shifts commonly introduce validation errors that didn't exist when you initially cleaned the feed.
FAQ
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.
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.
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.
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".
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
- ChatGPT Shopping 30-day setup guide — the week-by-week checklist format with progress tables and verification commands
- Structured data validation errors — the 4 critical errors with exact Liquid fixes
- Shopify Agentic Storefronts — what the March 2026 default-on rollout actually changed
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