monkeyman.agency
industry

Shopify Product Schema for AI Search: The JSON-LD Setup ChatGPT and Perplexity Actually Read

Shopify product schema for AI search lives or dies on JSON-LD. The 2026 guide covers variants, FAQs, shipping, returns, and a 30-day rollout for 100+ SKU catalogs.

Monkeyman May 19, 2026 10 min read

Marcus runs catalog ops at FjordLine, a 3,800-SKU outdoor gear store on Shopify Plus. He came to us in March after watching three competitors get cited in ChatGPT product carousels for queries he had owned in Google for two years. A merchant we hopped on a discovery call with that same week put the new reality bluntly: the carousel is driven by product feed compliance, schema markup, and variant-level data, not content authority. That is a completely different optimization. This piece is the Shopify product schema JSON-LD AI playbook we built for Marcus, and the one we now run on every catalog audit.

Why Shopify product schema JSON-LD AI visibility decides your ChatGPT and Perplexity placement

When a buyer types “best waterproof hiking boots under $200 for wide feet” into ChatGPT or Perplexity, what comes back is not a search result page. It is a structured answer. The model picks three to five products, names them, prices them, and links them. The selection happens in milliseconds against a structured index built from product feeds, schema markup, and licensed retail data. The actual blog content on your store, the copy your brand team labored over for six months, is decorative at that stage.

We audited 14 Shopify stores in April across home goods, supplements, and apparel. Ten of them had zero structured JSON-LD on their product pages. Three had partial schema from a free SEO app that emitted broken nested objects. Only one store had a clean, validated, variant-aware Product schema across the full catalog, and that store was already winning ChatGPT citations in three of its top five product categories.

The mechanism is straightforward. ChatGPT Shopping pulls from the same structured-data signals that Google Merchant Center and Bing Shopping pull from. Perplexity reads schema.org JSON-LD directly during its crawl. Anthropic’s Claude has confirmed similar behaviour through its MCP and search documentation. Without a clean Product schema block on every PDP, your catalog is invisible to the layer of the internet where buyers now ask questions.

The fix is unglamorous. You will not buy your way into AI carousels with a content campaign. You will be cited or not cited based on whether your variants resolve cleanly, whether your prices are arrays rather than strings, and whether your offers carry the right currency, availability, and shipping properties. That is the work. Schema.org publishes the canonical Product schema specification if you want the reference.

What ships in Dawn and Shopify 2.0 themes today, and the gaps

Shopify themes generate some JSON-LD out of the box. Dawn 14, Refresh, and most OS 2.0 themes emit a Product schema block on every product page automatically. That block covers name, image, description, SKU, brand, and a single offers object. It is enough to keep Google Merchant Center happy. It is not enough to win citations.

Here’s what the default block misses on every store we audit.

Variants flatten to a single offers object using the default variant price. A store with 12 sizes and 4 colors looks to ChatGPT like one product at one price. GTIN, MPN, and ISBN fields are usually blank because most merchants never fill the corresponding Shopify metafields, and AI shopping engines weight identifier-matched products higher because the identifier is the trust signal. The aggregateRating object pulls from whatever review app is installed, and on a Yotpo or Judge.me default install that field is often missing or pointing at a stale review count.

The one we see most often: offers.priceValidUntil is either missing or set to a date that already passed. Perplexity and ChatGPT both drop products from their answer set when price validity has expired. The quiet fifth gap is shippingDetails. ChatGPT Shopping launched its “ships within 3 days” filter in February 2026, and stores without shippingDetails are excluded from that filter result by default.

The audit script we run on every onboarding fetches the product page, parses the JSON-LD block, and reports six pass-fail signals. Most stores hit two of six. The Shopify structured data Help Center page covers the basics but stops short of the variant and shippingDetails gap.

There are three tiers of fields that matter for AI visibility. Tier one is required, and the absence of any one of these will get your product dropped from the AI answer set. Tier two is recommended, and missing these will not drop you but will lower your rank against competitors who include them. Tier three is what we call AI bonus, fields that were optional until Q4 2025 and are now weighted heavily by ChatGPT Shopping, Perplexity, and Google AI Overviews.

Tier one (required): @context, @type, name, image (must be an array of at least three high-resolution URLs), sku, brand (must be a nested Brand object rather than a string), and offers (must include price, priceCurrency, availability, url, and priceValidUntil with a future date).

Tier two (recommended): description (between 80 and 320 words, plain text, no HTML), gtin13 or gtin12 (or mpn if no GTIN exists), category (using a Google product taxonomy ID rather than a string label), aggregateRating (with ratingCount above 5 to render in answers), and review (at least one nested Review object).

Tier three (AI bonus): shippingDetails (with shippingRate and deliveryTime), hasMerchantReturnPolicy (with returnPolicyCategory and returnDays), eligibleQuantity, weight, and material. We have seen catalog-wide citation lifts of 11 to 19 percent in the eight weeks following a tier-three rollout on three different client stores.

The Shopify Editions Winter 2026 update shipped hasMerchantReturnPolicy as a default field on new Dawn installs but does not backfill it on existing themes. If your theme was forked before December 2025, the field will be missing.

Variants done right: ProductGroup, hasVariant, and pricing arrays

This is the single biggest fix we ship for Shopify product schema clients. Default Shopify themes emit one Product object per product page with a single offers block. Stores with variant-heavy catalogs need the ProductGroup pattern instead.

ProductGroup wraps the parent product. Inside it, each variant becomes a Product object with its own sku, gtin, color or size attribute, image, and offers. The parent ProductGroup carries productGroupID, variesBy (a list of the differentiating attributes, like color and size), and hasVariant (an array of all child Product objects). This is the structure ChatGPT Shopping expects for size pickers and color pickers in the carousel. Without it, the carousel either picks one variant arbitrarily or skips your product entirely because it cannot resolve the buyer’s stated size or color.

The implementation in Shopify is a Liquid snippet that loops through product.variants and emits one hasVariant entry per variant. We keep the snippet under 80 lines, scoped to a single theme.liquid include, and we cache the JSON-LD output as a metafield to avoid recomputing on every PDP request. On a 4,200-SKU catalog the snippet adds roughly 14 milliseconds to PDP TTFB, which is well inside the Core Web Vitals envelope.

Pricing arrays matter for size-tiered or bundle pricing. If your XL costs more than your S, that is two distinct offers under two child Product objects, not a single offers block with a price range. ChatGPT will drop the product if the offers block says “29.99 to 49.99” as a string.

How to mark up FAQs, shipping, and returns inside product schema

The FAQ block is the second-highest leverage addition after variants. FAQs go in a separate FAQPage JSON-LD block on the PDP, linked back to the product via mainEntity. Three to five questions per product, written from real customer support tickets, will earn you Perplexity citations on long-tail buyer queries within four to six weeks.

We pull the FAQ source content from the brand’s Gorgias or Zendesk ticket history. We tag tickets by SKU, cluster by intent, and surface the top 5 questions per SKU. That is the FAQ block. Generic copied FAQs do not get cited because they do not match the long-tail query language buyers actually use.

Shipping markup lives in offers.shippingDetails. Required sub-fields are shippingRate (with value and currency), shippingDestination (a Country object), and deliveryTime (with handlingTime and transitTime, both as QuantitativeValue objects). If your shipping rates vary by region, emit one shippingDetails entry per region. ChatGPT’s “ships to my zip” filter resolves against these entries in May 2026.

Returns markup lives in hasMerchantReturnPolicy. Required sub-fields are returnPolicyCategory (use the schema.org enum value MerchantReturnFiniteReturnWindow for most stores) and merchantReturnDays. If you offer free returns, add returnShippingFees with value 0 and currency. Stores that mark up returns explicitly earn a “free returns” badge in ChatGPT Shopping that has measurable conversion impact on our clients.

Testing your schema with Schema.org Validator and the Agentic Commerce Readiness scanner

Validation has three layers and you need all three.

Layer one is the Schema.org Validator, which catches syntax errors and required-field omissions. Run every PDP through it after a deploy. It does not check AI weighting, only schema correctness.

Layer two is Google’s Rich Results Test, which catches Google-specific requirements like image dimensions and Product eligibility. A passing Rich Results Test is necessary for Google Shopping but not sufficient for ChatGPT or Perplexity.

Layer three is our internal Agentic Commerce Readiness scanner, which we run on every audit. The scanner fetches your PDP, parses the JSON-LD block, and scores six AI-specific signals: variant resolution, identifier completeness, price validity, shipping detail presence, return policy presence, and FAQ block presence. We score each PDP zero to six and flag any product under four as a citation risk. On a typical pre-audit Shopify Plus catalog the average is 1.8 of 6.

The scanner output drops into a sheet your engineering team can work down. We tag the top 200 SKUs by traffic and fix those first. The long tail catches up via a Liquid snippet that emits the missing fields once the metafields are populated. We plan to publish the scanner as a free Shopify app later this year. Until then, the manual workflow is a half day for a catalog under 500 SKUs and three days for a 4,000+ catalog.

A 30-day schema rollout for stores with 100+ SKUs

This is the rollout we ran with Marcus on the FjordLine catalog. It is the same playbook on every project. Thirty days, four phases.

Days 1 to 5: audit and inventory. Pull a CSV of every product, current schema state (parsed from the live page, not the source code), missing required fields, and SKU traffic from GA4 or Triple Whale. The output is a ranked list of the top 200 SKUs by traffic and a tier classification (clean, partial, broken) for each.

Days 6 to 12: metafield population. Most schema gaps are not theme bugs, they are missing data. Populate GTIN, MPN, category ID, weight, material, returnPolicyCategory, and shipping zone metafields across the top 200 SKUs first. We use Matrixify for bulk metafield CSV imports. A 4,200-SKU import runs in 18 minutes.

Days 13 to 20: theme snippet ship. Build the JSON-LD emitter as a single Liquid snippet that reads from metafields. Variant loop emits ProductGroup with hasVariant array. FAQ block emits FAQPage with mainEntity link. Shipping block emits shippingDetails arrays per region. Returns block emits hasMerchantReturnPolicy. The snippet is roughly 220 lines and lives in snippets/json-ld-product.liquid.

Days 21 to 26: validation pass. Every product through Schema.org Validator and Rich Results Test. Fix the long tail (typically 5 to 8 percent of SKUs that have missing data the bulk import skipped).

Days 27 to 30: scanner baseline. Run the Agentic Commerce Readiness scanner across the full catalog, capture the score distribution, and set the four-week follow-up. The lift in citation rate appears in weeks five through eight, not in week one.

Marcus’s catalog went from 1.4 of 6 to 5.2 of 6 in 26 days. ChatGPT citations rose from 0 to 11 in the eight weeks after.

What we keep telling clients

Most Shopify stores we audit have zero usable Product schema for AI search. That is not because their teams are lazy, it is because the default theme emits enough JSON-LD to pass Google’s checks and the AI-specific gaps are not visible until traffic patterns shift. The fix is a thirty-day metafield, snippet, and validation pass. The catalog work we shipped for FjordLine is the same work we ship for every Shopify Plus client on our roster, and the 90-day Shopify product schema JSON-LD AI playbook we run looks identical project to project. We are a Shopify development agency, not a generic ecommerce shop, and this catalog layer is where AI visibility compounds. The numbers compound from there.

Questions we get every week

Does Shopify automatically generate Product schema for me? Yes, Dawn 14 and most OS 2.0 themes emit a basic Product JSON-LD block on every PDP. It covers name, image, description, sku, brand, and a single offers object. It does not cover variants as ProductGroup, GTIN, shippingDetails, hasMerchantReturnPolicy, or FAQPage. Those are the gaps you need to fill manually.

Can I use a third-party app instead of editing my theme? Apps like Schema Plus, JSON-LD for SEO, and SearchPie generate schema without theme edits. They are fine for stores under 200 SKUs. Above that, the apps tend to emit nested objects that are technically valid but not AI-optimized, and the cost compounds with SKU count. We recommend a Liquid snippet for any catalog over 200 SKUs.

How long until I see ChatGPT citation lift after rolling out new schema? Five to eight weeks in our client data. ChatGPT’s index refresh on a clean schema rollout takes about four weeks. Perplexity refreshes faster, around two weeks. Google AI Overviews refreshes on its own cycle, typically four to six weeks.

What if my theme is a custom fork from before 2025? Custom forks rarely emit any usable JSON-LD. Plan for a full snippet build, not a patch. We typically rebuild json-ld-product.liquid from scratch on legacy themes and integrate it into the existing theme.liquid include.

Want a Monkey Man audit of your Shopify product schema JSON-LD AI setup and a 30-day rollout plan? Tell us about your catalog and we will return a tier-classified schema audit within five business days.

Need help with this?

Send us your store. We'll send back an audit.

Send us your store URL. We'll send back a free audit within 48 hours.

Phone (optional)