Shopify Schema Markup: Fix the Gaps and Get Rich Results in Google

Last Updated: February 25, 2026 · 16 min read

Shopify themes ship with Product schema built in — at least the popular ones do. Dawn, Debut, and most themes in the Shopify theme store include basic Product JSON-LD output through their Liquid templates. That is good news. The bad news is that the default output covers only the bare minimum: product name, price, and image. The fields that actually make a difference in search — star ratings, shipping details, return policies, and product identifiers — are almost always missing. This guide walks through exactly what Shopify generates, what it misses, and how to fix it.

1. What Shopify themes generate by default

In most Shopify themes, product schema is output inside the product.liquid or a snippet it includes. It typically looks like this:

{
  "@context": "http://schema.org/",
  "@type": "Product",
  "name": "{{ product.title }}",
  "url": "{{ shop.url }}{{ product.url }}",
  "image": "{{ product.featured_image | img_url: 'grande' }}",
  "description": "{{ product.description | strip_html }}",
  "sku": "{{ product.selected_or_first_available_variant.sku }}",
  "offers": {
    "@type": "Offer",
    "priceCurrency": "{{ cart.currency.iso_code }}",
    "price": "{{ product.selected_or_first_available_variant.price | money_without_currency | remove: ',' }}"
  }
}

Two problems with the default output

  • 1. It uses http://schema.org/ (no trailing slash, and HTTP not HTTPS). Google accepts this but HTTPS is the current standard.
  • 2. The offers block is missing availability, url, priceValidUntil, and shippingDetails — all recommended or required for maximum rich result eligibility.

2. The improved product schema template for Shopify

Edit your product.liquid template (go to Online Store → Themes → Edit code) and replace the existing schema block with this improved version:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": {{ product.title | json }},
  "url": "{{ shop.url }}{{ product.url }}",
  "image": {{ product.featured_image | img_url: '1024x' | json }},
  "description": {{ product.description | strip_html | json }},
  "sku": {{ product.selected_or_first_available_variant.sku | json }},
  "brand": {
    "@type": "Brand",
    "name": {{ product.vendor | json }}
  },
  {% if product.metafields.reviews.rating.value %}
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "{{ product.metafields.reviews.rating.value }}",
    "reviewCount": "{{ product.metafields.reviews.rating_count.value }}"
  },
  {% endif %}
  "offers": {
    "@type": "Offer",
    "priceCurrency": {{ cart.currency.iso_code | json }},
    "price": "{{ product.selected_or_first_available_variant.price | money_without_currency | remove: ',' }}",
    "availability": {% if product.available %}"https://schema.org/InStock"{% else %}"https://schema.org/OutOfStock"{% endif %},
    "url": "{{ shop.url }}{{ product.url }}",
    "seller": {
      "@type": "Organization",
      "name": {{ shop.name | json }}
    }
  }
}
</script>

3. Getting star ratings into Shopify schema

Shopify does not have built-in product reviews. You need a review app. The review app you choose determines whether star ratings appear in your schema. Here is how the most popular options handle this:

Review appAdds AggregateRating schema?Notes
Shopify Product Reviews (free)✅ Via metafieldsStores rating in product.metafields.reviews — use the template above
Judge.me✅ Built inAutomatically injects AggregateRating JSON-LD. No template edits needed.
Loox✅ Built inAdds AggregateRating automatically. Strong for photo review displays.
Yotpo⚠️ Premium onlyFree plan does not include schema. Premium plan adds structured data.
Okendo✅ Built inOutputs AggregateRating in product JSON-LD automatically.
Stamped.io✅ Built inAdds AggregateRating. Check the schema settings are enabled.

4. Fixing the most common Shopify schema errors

Error: Two Product schema blocks on the same page

Cause: Your theme has one, and the review app added another. Both get processed — but Google may pick only one, and conflicting properties cause errors.

Fix:

Remove the theme's original schema block and let the review app handle the full Product output. Or, edit the theme schema to remove AggregateRating since the app will add it.

Error: Price formatted with comma (e.g. "1,299.00")

Cause: Liquid's money filter includes thousands separators. The schema.org specification requires numeric price values — "1299.00" not "1,299.00".

Fix:

Always use | money_without_currency | remove: ',' in your Liquid schema output.

Error: Availability is always InStock even for sold-out products

Cause: The conditional check for product.available is missing from the offers block.

Fix:

Use {% if product.available %} to output InStock or OutOfStock based on real stock status.

Error: No breadcrumb path in search results

Cause: BreadcrumbList schema is not included in the theme, or the category hierarchy is not set up in Shopify collections.

Fix:

Add BreadcrumbList schema to your product.liquid, or install a Shopify SEO app that adds this automatically.

Error: Missing shippingDetails in schema

Cause: No Shopify theme includes shippingDetails in its default schema. This field is increasingly used by Google to show delivery estimates.

Fix:

Add shippingDetails manually in product.liquid, or use a schema app that supports it.

5. Adding Organisation and WebSite schema to Shopify

Shopify themes rarely include Organisation or WebSite schema. These are important for your brand entity and the sitelinks searchbox. Add them to your theme.liquid file, inside the <head> tag, so they appear on every page:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "{{ shop.url }}/#organization",
  "name": {{ shop.name | json }},
  "url": {{ shop.url | json }},
  "logo": {
    "@type": "ImageObject",
    "url": {{ settings.logo | img_url: '512x' | prepend: 'https:' | json }}
  },
  "sameAs": [
    "REPLACE_WITH_FACEBOOK_URL",
    "REPLACE_WITH_INSTAGRAM_URL"
  ]
}
</script>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "{{ shop.url }}/#website",
  "name": {{ shop.name | json }},
  "url": {{ shop.url | json }},
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "{{ shop.url }}/search?q={search_term_string}"
    },
    "query-input": "required name=search_term_string"
  }
}
</script>

6. After making changes: validation checklist

1

View page source on a product page — you should see the updated JSON-LD with correct availability, no commas in prices, and your brand name in the seller field.

2

Paste the product URL into SchemaValidator.org. Check for errors on Product type — especially missing required fields and formatting issues.

3

Go to the Google Rich Results Test and enter a product URL. Confirm it detects Product, Offer, and AggregateRating (if you have reviews).

4

Check Google Search Console → Enhancements → Products for existing errors. After your edits deploy, errors should reduce and valid items should increase.

5

Test on a product with zero reviews and a product with reviews. Both should validate cleanly — one without AggregateRating, one with it.

Frequently Asked Questions

Does Shopify automatically add JSON-LD structured data to my store?

Most paid Shopify themes (Dawn, Debut, Prestige, etc.) include basic Product JSON-LD output, but only for product pages and only with minimal fields — typically name, price, and image. Category/collection pages, the homepage, About page, and blog posts typically have no schema. Shopify itself does not add Organisation, WebSite, or BreadcrumbList schema. For a complete schema strategy, you will need to either edit your Liquid templates or use a dedicated Shopify SEO app.

My Shopify product pages show schema errors in Google Search Console. What are the most likely causes?

The four most common causes: (1) Price formatted with commas — "1,299.00" instead of "1299.00" — fix by adding | remove: ',' to your Liquid money filter. (2) Missing availability field — Google requires InStock/OutOfStock in the offers block. (3) Two conflicting Product schema blocks — one from your theme and one from a review app — causing duplicate or contradictory data. (4) Missing required fields like offerCount or seller in multi-variant products. Use SchemaValidator.org to paste your product page URL and see exactly which errors are present.

Which is better for Shopify schema: editing Liquid templates or using an app?

Editing Liquid templates gives you full control and zero ongoing app cost, but requires developer access and maintenance. Apps like TinyIMG, Smart SEO, or JSON-LD for SEO handle it automatically and update when Shopify changes. The best approach depends on your situation: if you have a developer and a custom theme, editing templates is cleaner. If you are on Dawn or a standard theme and not comfortable with code, a well-maintained SEO app is more reliable. Review apps like Judge.me add review schema automatically regardless of which approach you choose for other schema types.

Does Shopify support shippingDetails in product schema?

Not by default — no Shopify theme includes shippingDetails in its product schema output. Google increasingly uses shippingDetails to show estimated delivery times in search result rich snippets. You can add it manually to your product.liquid template using Shopify variables for your shipping zones and rates, but it is complex to implement correctly for stores with multiple shipping zones and carrier-calculated rates. The JSON-LD for SEO app (by Ilana Davis) supports shippingDetails with Shopify Markets integration.

I am using Yotpo reviews. Will star ratings appear in my Shopify product schema automatically?

Yotpo adds AggregateRating schema automatically on paid plans — but not on the free tier. On the free plan, Yotpo only provides on-page review widgets without JSON-LD output. If you are on a free Yotpo plan and need review schema, switch to Judge.me (which includes schema on all plans including free), or upgrade to a Yotpo paid plan. Always verify by running your product URL through the Rich Results Test to confirm AggregateRating is detected.

Should my Shopify collection pages have schema?

Collection pages are a common schema blind spot on Shopify. They should have BreadcrumbList schema (showing Home > Collection Name), and optionally ItemList schema listing the products in the collection. Most Shopify themes do not include ItemList schema for collections. While Google does not currently use ItemList for rich results on collection pages, it improves Google's understanding of your product catalogue structure and can help with internal entity linking between products and their categories.

How do I add schema to a Shopify blog post?

Shopify blog posts are a missed opportunity — they usually have no Article schema by default. Add Article or BlogPosting JSON-LD in your blog post template (article.liquid). Include: headline (the post title), datePublished, dateModified, author (Person with name and optionally URL), image (the featured image), and publisher (Organisation). This can unlock Google Discover appearances and Top Stories eligibility if you are approved as a Google News publisher. You can inject this via a code block in article.liquid or using a custom snippet.

My Shopify store sells internationally. How do I handle multiple currencies in product schema?

For international stores using Shopify Markets, the recommended approach is to output the store's primary/base currency in the schema offers block. Use cart.currency.iso_code to output the currency dynamically based on the current session, but be aware this can cause inconsistent schema if Googlebot crawls in a different locale than your base currency. Most SEO practitioners recommend hardcoding the base currency in schema (e.g. "USD") for consistency with Google's index, while relying on Shopify's storefront for actual currency conversion display.

Validate Your Shopify Product Schema

Enter a product URL from your Shopify store. Get an instant report on availability formatting, missing AggregateRating, and rich result eligibility.

Validate Shopify Schema →