Shopify Product Schema Markup: The Complete Guide for AI Commerce

Shopify product schema markup is the structured JSON-LD code that tells search engines and AI agents exactly what your product is, what it costs, whether it is in stock, and what customers think of it. In 2026, schema markup is not just an SEO tactic -- it is the primary mechanism by which AI shopping agents parse product eligibility for recommendations. Stores without complete, accurate schema are invisible to agentic queries regardless of how well-written their product descriptions are.

This guide covers what Shopify outputs by default, what it does not, and how to fill the gaps.

Key Takeaways

- Shopify's default themes output basic product schema (name, price, availability, image) but omit review schema, offer schema, and category-specific properties unless explicitly configured

- Review schema is the most commonly missing element -- AI agents weight social proof heavily in recommendation decisions

- The @type: Product schema should include at minimum: name, description, image, offers (price, availability, currency, seller), aggregateRating, and brand

- Breadcrumb schema helps AI agents understand product category hierarchy and improves featured snippet eligibility

- Testing your schema with Google's Rich Results Test before and after any theme change is the fastest way to catch regressions

What Schema Markup Is and Why It Matters for AI Commerce

Schema markup is structured data embedded in your page's HTML as JSON-LD (JavaScript Object Notation for Linked Data). It tells machine readers -- search engines, AI agents, price comparison tools -- the specific attributes of what your page represents.

A product page without schema markup presents prose to machine readers:

"Our premium stainless steel water bottle keeps drinks cold for 24 hours and hot for 12 hours. Available in matte black, brushed silver, and arctic white. 750ml capacity. BPA-free."

A product page with complete schema markup presents structured attributes:

`json

{

"@type": "Product",

"name": "Summit Pro Water Bottle 750ml",

"description": "Stainless steel vacuum-insulated...",

"brand": {"@type": "Brand", "name": "Summit"},

"material": "Stainless steel, BPA-free",

"color": "Matte black",

"offers": {

"@type": "Offer",

"price": "34.99",

"priceCurrency": "USD",

"availability": "https://schema.org/InStock",

"seller": {"@type": "Organization", "name": "Your Store"}

},

"aggregateRating": {

"@type": "AggregateRating",

"ratingValue": "4.8",

"reviewCount": "247"

}

}

`

The second version is what AI shopping agents can reliably query. The first requires interpretation.

What Shopify Outputs by Default

Most of Shopify's default themes (Dawn, Sense, Refresh) output a basic product schema. The standard output includes:

  • @type: Product
  • name (product title)
  • image (first product image)
  • description (product description)
  • offers (price, availability, URL)

What is typically missing from default Shopify schema:

  • aggregateRating and Review (requires a review app that outputs schema)
  • brand
  • sku
  • gtin / mpn (important for Google Shopping and product feed matching)
  • material, color, size (product variant attributes)
  • Category-specific properties (nutritionInformation for food, wearableSize for apparel)
  • breadcrumb schema

How to Audit Your Current Schema Output

Step 1: Open your product page in Chrome, right-click > View Page Source.

Step 2: Search for ld+json in the source code. This is where JSON-LD schema lives.

Step 3: Copy the JSON object and paste it into Google's Rich Results Test (search.google.com/test/rich-results).

The Rich Results Test shows you what schema Google detects and flags any errors or missing recommended properties.

Alternatively, use Schema.org's validator at validator.schema.org for a more comprehensive check.

What to look for:

  • Is the Product type detected?
  • Is aggregateRating present?
  • Is offers complete (price, availability, seller)?
  • Are there any errors (red flags) or warnings (orange flags)?

Errors prevent rich results eligibility. Warnings indicate missing recommended properties.

Adding Missing Schema Elements

Adding Review Schema

Review schema (aggregateRating) requires your review app to output it. Check your review app's documentation.

Judgeme: Outputs aggregateRating schema by default. Verify it is appearing in your page source.

Okendo: Outputs review schema, configurable per product page layout.

Stamped: Outputs schema, check settings for confirmation.

If your review app outputs star ratings visually but not in JSON-LD schema, contact their support. This is a common gap and a quick fix for most established review apps.

Adding Brand Schema

Shopify does not include brand in its default schema output. You need to add it to your theme's product structured data snippet.

In your theme code (Online Store > Edit code > Snippets, look for product-structured-data.liquid or similar):

Add to the existing JSON-LD object:

`json

"brand": {

"@type": "Brand",

"name": "{{ product.vendor }}"

}

`

Shopify's product.vendor field maps to brand for most stores.

Adding SKU and GTIN

SKU:

`json

"sku": "{{ product.selected_or_first_available_variant.sku }}"

`

GTIN (requires a metafield with the barcode/GTIN value):

`json

"gtin": "{{ product.metafields.product.gtin }}"

`

If you have barcode values in your product data, map them to a metafield and include them in schema. GTIN matching is how AI agents and Google Shopping connect products to manufacturer records.

Adding Breadcrumb Schema

Breadcrumb schema tells AI agents and search engines the category hierarchy of your product.

`json

{

"@context": "https://schema.org",

"@type": "BreadcrumbList",

"itemListElement": [

{

"@type": "ListItem",

"position": 1,

"name": "Home",

"item": "{{ shop.url }}"

},

{

"@type": "ListItem",

"position": 2,

"name": "{{ collection.title }}",

"item": "{{ shop.url }}/collections/{{ collection.handle }}"

},

{

"@type": "ListItem",

"position": 3,

"name": "{{ product.title }}",

"item": "{{ shop.url }}/products/{{ product.handle }}"

}

]

}

`

This goes in a separate