CatalogScan

Schema Markup

Shopify Schema Markup: What AI Agents Actually Read

Shopify generates Product JSON-LD automatically on every product page — but the default output is missing the fields that matter most for AI shopping recommendations. Here is what is there, what is not, and how to fix the gaps.

TL;DR Shopify's Online Store 2.0 themes output a Product schema block on every product page. The required fields (name, price, availability) are usually present. The fields AI agents cite in recommendations — aggregateRating, brand as a structured entity, gtin, and rich description — are missing from most default themes. Fixing these three fields has the highest impact on AI shopping discoverability.

What Shopify generates by default

Shopify's product.json_ld Liquid object outputs a Product schema block. On a typical Dawn-theme store, a product page includes something like this (simplified):

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "Product",
  "name": "Merino Wool Crew Neck",
  "image": ["https://cdn.shopify.com/s/files/..."],
  "description": "Our softest sweater yet. Made from traceable merino wool.",
  "sku": "MW-CREW-S",
  "brand": {
    "@type": "Brand",
    "name": "Allbirds"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://allbirds.com/products/merino-wool-crew-neck",
    "priceCurrency": "USD",
    "price": "98.00",
    "availability": "https://schema.org/InStock",
    "seller": { "@type": "Organization", "name": "Allbirds" }
  }
}
</script>

This is a valid Product schema. Google will accept it. But for AI shopping agents — which use structured data to generate comparison responses, cite specific product features, and resolve product identity across databases — this output is incomplete.

The fields AI agents prioritize

Field Default Shopify theme Why AI agents need it
name Present Product identification — core field, always present
offers.price Present AI agents cite price directly from JSON-LD
offers.availability Present In-stock / out-of-stock filter in shopping recommendations
image Present Product image shown in AI shopping UI
brand Partial Often just {"@type":"Brand","name":"X"} — entity markup (@id to Wikidata) missing
description Partial Often truncated; AI agents use full description for feature extraction
aggregateRating Missing Star rating cited in comparison responses; most themes omit entirely
gtin / gtin13 Missing Used to cross-reference product across databases (Google, Open Food Facts, etc.)
sku Present Present via Shopify default but only the first variant SKU
offers (multiple) Partial Shopify default outputs one Offer (first variant); multi-variant products need AggregateOffer or multiple Offer blocks

How to add the missing fields

aggregateRating — star ratings

If your Shopify store uses a reviews app (Okendo, Judge.me, Yotpo, Stamped, Product Reviews by Shopify), that app typically provides a Liquid snippet or theme block that outputs an aggregateRating block. Enable it in your theme settings. Here is what the output should look like:

"aggregateRating": {
  "@type": "AggregateRating",
  "ratingValue": "4.8",
  "reviewCount": "312",
  "bestRating": "5",
  "worstRating": "1"
}

If your reviews app does not provide a JSON-LD block, check its documentation for a "structured data" or "schema.org" setting. Most major Shopify review apps support this natively. See our aggregateRating signal guide for the exact theme edit.

gtin / gtin13 — product barcodes

Add your product barcodes in Shopify Admin → Products → (select product) → "Barcode (ISBN, UPC, GTIN)". Once populated, edit your theme's product JSON-LD Liquid snippet (typically in snippets/product-json-ld.liquid or inside sections/main-product.liquid) to include:

{% if product.selected_or_first_available_variant.barcode != blank %}
  "gtin": "{{ product.selected_or_first_available_variant.barcode }}",
{% endif %}

GTIN matters most for AI agents that cross-reference product identity across databases — if a user asks ChatGPT "is this the same product sold cheaper on Amazon?", the GTIN is how ChatGPT confirms it is the same physical item.

brand as a named entity

Shopify's default output uses {"@type":"Brand","name":"YourBrand"}. AI agents perform better entity resolution when the brand has a Wikidata or Google Knowledge Graph ID. If your brand has a Wikidata entry, add it:

"brand": {
  "@type": "Brand",
  "name": "Allbirds",
  "@id": "https://www.wikidata.org/wiki/Q63088386"
}

For brands without a Wikidata entry, a consistent brand URL ("url": "https://allbirds.com") helps AI systems resolve the entity.

Validating your schema markup

After making changes, verify with Google's Rich Results Test (search.google.com/test/rich-results) and Schema.org's validator (validator.schema.org). Both parse the JSON-LD on your product page and flag missing required fields or errors.

For bulk validation across your catalog — checking if every product page has the correct fields, not just one sample — use CatalogScan. The scan checks schema completeness across your product pages as part of its 13-signal audit.

Check which schema fields are missing across your Shopify store in under 2 minutes.

Scan my store's schema →

Common questions

Does Shopify's default schema markup pass Google's validation?

Yes — Shopify's default Product JSON-LD passes Google's Rich Results Test for basic Product schema. However, passing validation and being optimized for AI shopping recommendations are different things. Google's validator checks required fields. AI agents extract every field they can find and use it to generate recommendations. A minimal schema passes validation but provides fewer signals for AI agents to work with.

Which Shopify themes output the best schema markup by default?

Dawn (Shopify's reference theme), Debut, and most premium themes from reputable developers include reasonable Product JSON-LD. The variation is mostly in whether they include aggregateRating (almost never, since that requires a reviews app integration) and multi-variant offers (inconsistent). The biggest gap across all themes is GTIN, because it requires merchants to populate the barcode field for every product variant.

Should I use JSON-LD or microdata for Shopify schema markup?

JSON-LD. Google, Bing, and all AI shopping agents recommend JSON-LD as the preferred format. It is easier to inject via Liquid, does not couple markup to HTML structure, and can include structured data for types not visible in the page content. Shopify's own Liquid uses JSON-LD. Avoid microdata (inline itemprop= attributes) for new implementations — it is harder to maintain and provides no advantages.