Schema Markup for Shopify
What schema Shopify Dawn ships by default, what it leaves out, and how to add JSON-LD manually to earn rich results in Google.
In this article
Most Shopify stores I audit have the same blind spot: they think they aren’t doing anything with schema markup, and it turns out Shopify is already injecting half of it for them. The real issue isn’t “Shopify ships no schema”. The issue is that it ships just enough for a basic listing, leaves out everything that could actually move the needle in rich results, and when you stack apps on top you end up with duplicated JSON-LD that breaks rendering in Google.
According to the official Google Search Central documentation, a correctly implemented Product markup is the hard requirement to show up in product rich results with stars, price and availability. Google doesn’t invent that visual block: it reads it from your page’s JSON-LD. If your theme doesn’t emit it, or emits it poorly, you lose that visual real estate to the competitor who does. This guide is the technical inventory your theme developer should hand you but almost never does. If you landed here after reading the pillar Shopify SEO guide, this is the missing deep dive.
Key Takeaways
- Shopify Dawn auto-generates
Product,OfferandOrganizationinproduct.json.liquid, but it won’t reliably emitFAQPage,HowTo,ArticleorBreadcrumbList(Shopify.dev, 2025)- Product pages with valid
Product+AggregateRatingmarkup are eligible for star rich results, but only when reviews come from verified customers (Google Search Central, 2025)- Google’s Rich Results Test checks eligibility for visual features; the Schema Markup Validator checks pure syntax
- Duplicating schema (app + theme + another app) is the most common mistake I see: Google can ignore all of it when it detects a conflict
- A well-integrated reviews app usually costs less than paying a developer for a custom snippet, if you have a high product volume
Contents
- What is schema markup and why does Google reward it with rich results?
- What schema does Shopify Dawn generate automatically?
- What schema does Shopify NOT generate, and should you add yourself?
- How do you add JSON-LD to custom pages with theme snippets?
- When does FAQPage make sense on product pages?
- Product + AggregateRating: when can you use it safely?
- How do you validate your schema before publishing?
- Schema apps or your own code? What changes on the invoice
- Frequently asked questions
- Schema only matters if the page backs it up
What is schema markup and why does Google reward it with rich results?
Schema markup is a structured vocabulary defined at Schema.org, a collaborative project founded by Google, Microsoft, Yahoo and Yandex. The recommended way to implement it is JSON-LD, confirmed as the preferred format by Google Search Central. Without that markup, Google reads your page as plain text. With it, Google understands there’s a product, a price and stock.
The visible reward is rich results: star ratings, price range, availability, expandable FAQ, breadcrumb in the snippet. Google doesn’t hand these out by decree. It grants them when it detects valid markup, content that matches what’s marked up and a minimum reputation on the URL. That last point gets forgotten a lot. You can have pristine JSON-LD and still get no rich results because Google thinks your page is weak.
The confusion I run into most: people think schema markup hands them rankings. It doesn’t. Google’s documentation states plainly that it isn’t a direct ranking factor. What it does is raise the odds that, when you already rank, your snippet takes up more pixels on the SERP and earns a higher CTR. That gap can move traffic. But if you don’t rank, piling on more schema won’t put you at the top.
Citable capsule: Schema markup is a structured vocabulary from Schema.org, implemented in JSON-LD format per Google Search Central. It isn’t a direct ranking factor, but it enables rich results (stars, price, availability, FAQ) that boost the snippet’s visual presence on the SERP. Source: Google Search Central, 2025.
What schema does Shopify Dawn generate automatically?
Dawn is Shopify’s free reference theme. According to the Shopify.dev product templates documentation, the product.json.liquid file builds a default Product JSON-LD block containing name, description, image, SKU, brand and at least one Offer with price, currency and availability. That block is emitted by the layout itself, not by an app.
Product schema (Product + Offer)
This is what Dawn injects into every /products/* page:
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Camiseta básica algodón orgánico",
"url": "https://tu-tienda.com/products/camiseta-basica",
"image": "https://cdn.shopify.com/s/files/1/.../camiseta-basica.jpg",
"description": "Camiseta de algodón orgánico certificado GOTS.",
"brand": {
"@type": "Brand",
"name": "Tu Marca"
},
"sku": "CAM-BAS-001",
"offers": {
"@type": "Offer",
"price": "29.90",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"url": "https://tu-tienda.com/products/camiseta-basica"
}
}
The actual code that generates it in Dawn lives in the snippets/product-media.liquid snippet and in sections/main-product.liquid. Values are read from the Liquid product object, so if you change the name or price in the admin, the JSON-LD updates on the next build.
Organization schema (Organization)
On the home page, Dawn emits a simple Organization block with name and logo, as long as you’ve uploaded a logo in theme settings. It won’t emit sameAs with social links unless you add them yourself. If your Google Business profile or Knowledge Panel is built on your social accounts, that matters.
What looks like schema but isn’t
Shopify also emits Open Graph meta tags and Twitter Cards. They’re useful for Facebook and X, but they don’t count as structured data for Google. Don’t mix them up when you’re doing your inventory.
When auditing stores running older custom themes (pre-2021, before Dawn launched), I often find schema in microdata format instead of JSON-LD, or Product blocks missing priceCurrency or availability. Google tolerates microdata, but the Rich Results Test tends to complain more with those themes. If you’re migrating to an OS 2.0 theme, that’s the moment to clean it up.
Citable capsule: Shopify Dawn injects JSON-LD by default with the types
Product,OfferandOrganization. TheProductblock on product pages includes name, image, SKU, brand, price, currency and availability, pulled from the Liquidproductobject. Source: Shopify.dev, 2025.
What schema does Shopify NOT generate, and should you add yourself?
Here’s the real gap. Dawn doesn’t emit FAQPage in any default template, it doesn’t emit HowTo (it never has), and it generates BreadcrumbList inconsistently depending on the template. On blog pages (article.json.liquid) it doesn’t emit Article with all the fields Google asks for to appear in Top Stories either.
Gap inventory by page type
| Page | Dawn generates | Missing | Impact if you add it |
|---|---|---|---|
| Product | Product, Offer | AggregateRating, Review, FAQPage | Stars and FAQ on SERP |
| Collection | Nothing reliable | ItemList, BreadcrumbList | Better context, little visual |
| Home | Minimal Organization | sameAs, WebSite with SearchAction | Sitelinks Searchbox |
| Blog post | Partial Article | Full author, ISO datePublished, structured image | Top Stories eligibility |
| Custom page | Nothing | Whatever the page needs | Depends on content |
Why are they missing?
Schema.org has hundreds of types. Shopify can’t presume what you want to mark up: it doesn’t know if your product page has a real FAQ, if your reviews come from verified customers, or if your blog is editorial journalism. Loading schema that doesn’t match the content is worse than not loading any. According to the official documentation, Google can apply a manual action for structured data spam.
That’s why the sane approach is: you decide what to mark up based on real content. If you don’t have a genuine FAQ on the page, don’t add FAQPage. If you don’t have reviews collected by a verified app, don’t invent AggregateRating.
A detail that almost never shows up in tutorials: since 2023, Google has drastically restricted FAQPage rich result eligibility to “official or government authority” sites for most queries, per the Google policy update. Marking up your FAQ is still useful for AI Overviews and for ChatGPT Search, but expecting the classic expandable panel on the SERP is no longer realistic for most stores.
How do you add JSON-LD to custom pages with theme snippets?
The sane pattern is to create a Liquid snippet, render it only where it applies, and pass variables from the template. According to the Shopify Liquid documentation, render isolates variables and avoids conflicts, unlike the deprecated include. That gives you maintainable schema and doesn’t inject dead code on pages where it doesn’t belong.
Step 1: create the snippet
In the theme code editor, create snippets/schema-faq.liquid:
{%- comment -%} snippets/schema-faq.liquid {%- endcomment -%}
{%- if faq_items and faq_items.size > 0 -%}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{%- for item in faq_items -%}
{
"@type": "Question",
"name": {{ item.question | json }},
"acceptedAnswer": {
"@type": "Answer",
"text": {{ item.answer | json }}
}
}{%- unless forloop.last -%},{%- endunless -%}
{%- endfor -%}
]
}
</script>
{%- endif -%}
Liquid’s | json filter escapes quotes, line breaks and unicode characters automatically. Skip that filter and drop in raw text, and your JSON will break the moment an answer contains an apostrophe.
Step 2: call the snippet from the template
In templates/page.faq.json or in a section block:
{% assign faq_items = section.blocks | where: "type", "faq_item" %}
{% render 'schema-faq', faq_items: faq_items %}
If your page uses metafields, pass faq_items: product.metafields.custom.faq.value. If it uses a theme block, assign the array from section.blocks.
Step 3: validate
Before publishing the theme, paste the page URL into the Rich Results Test. If it flags a syntax error, it’s almost always an unescaped quote, a trailing comma or an empty required field.
The mistake that keeps showing up in audits is dropping JSON-LD into the global <head> block of theme.liquid. The result: every page on the site announces the same FAQ, including checkout, cart and 404. Google penalizes the inconsistency. Render the snippet only where it belongs.
Citable capsule: To add custom JSON-LD in Shopify, the recommended pattern is to create a Liquid snippet with the
| jsonfilter to escape values, render it with{% render %}only on templates where it applies, and validate with Google’s Rich Results Test. Source: Shopify.dev, 2025.
When does FAQPage make sense on product pages?
It makes sense when the FAQ visibly exists on the page, answers real customer questions and doesn’t overlap with the description. According to Google’s structured data policy, all content marked up as FAQPage has to be visible to the user and can’t be promotional or contradict the page.
When yes, when no
- Yes: a block with 4-6 real questions about sizing, materials, shipping, returns
- Yes: questions that resolve pre-purchase doubts and cut down on support tickets
- No: an invisible FAQ, buried just for the schema
- No: questions copied from the shipping page
- No: promotional content dressed up as FAQ (“Why are we the best brand?”)
Even though the classic rich result has been restricted since 2023, marking up the FAQ still delivers two measurable benefits: it improves page comprehension for AI systems that summarize products (AI Overviews, ChatGPT Search, Perplexity), and it raises the chance of being cited as a source in those answers.
Minimum working code
Reusing the snippet from the previous section, the output on a product page looks like this:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What's the right size?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The t-shirt has a regular cut. If you're between two sizes, pick the larger one for a relaxed fit."
}
},
{
"@type": "Question",
"name": "How long will the order take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Domestic shipping in 24-48 business hours. International in 3-7 days."
}
}
]
}
Product + AggregateRating: when can you use it safely?
Only when the reviews are collected by a verifiable system and displayed visibly on the page. Google explicitly requires, in its review snippet guidelines, that reviews come from real customers, live at the URL that’s marked up, and aren’t self-submitted by the business.
Which apps actually comply
The Shopify review apps (Judge.me, Loox, Yotpo, Okendo, Shopify Product Reviews) all emit their own JSON-LD with AggregateRating when you install them with the review block on the product page. You don’t need to touch any code. What you do need to check is that there’s no duplication with Dawn’s native schema.
The double schema problem
I see this constantly: the theme emits Product with a price. The review app emits another Product block with AggregateRating, repeating name, image and offer. Google detects two Product blocks on the same URL and can ignore both. The standard fix is to merge them into a single block.
Code that merges both in the theme snippet (requires the app to expose the data as a metafield or Liquid variable):
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Camiseta básica algodón orgánico",
"sku": "CAM-BAS-001",
"brand": {"@type": "Brand", "name": "Tu Marca"},
"offers": {
"@type": "Offer",
"price": "29.90",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128"
}
}
For it to work without duplicates, turn off schema emission in the app (most have a toggle in settings) and have the theme read the aggregated data from the app via metafield or API.
How do you validate your schema before publishing?
With two complementary tools: the Google Rich Results Test and the Schema.org Markup Validator. They do different jobs. According to the Google Search Central documentation, the first checks whether your page is eligible for visual features on the SERP; the second checks Schema.org syntax independently of whether Google uses it.
Two-step validation workflow
First, paste the URL (or the code if it’s still on staging) into Rich Results Test. It tells you which rich result you’re eligible for and which errors block that eligibility. Typical errors: missing priceCurrency, image in relative format instead of absolute, availability with an invalid string.
Second, if the page passes Rich Results but your schema is broader (it includes types Google doesn’t use but other agents do, like Product with material, extended color, weight), validate it in Schema Markup Validator. It tells you if your JSON is syntactically valid and if the types exist in the vocabulary.
What to do after publishing
After 2-3 days, check Google Search Console in the “Enhancements” section. It shows detected types, URLs per status and specific errors. If a URL comes back as “Valid with warnings”, fix the warnings: they don’t block, but they limit performance.
A cosmetics client came to me with 400 products and AggregateRating on every one. After running Rich Results Test URL by URL during the audit, we discovered the review app was emitting reviewCount: 0 on products with no reviews, and Google was ignoring all the schema because of that empty field. We filtered the emission so it only appeared on products with at least 3 reviews. The rich result showed up on the SERP in under two weeks.
Schema apps or your own code? What changes on the invoice
It depends on the volume, the catalog complexity and how long the theme will stay in use. According to the official Shopify marketplace, there are dozens of schema markup apps, with monthly prices ranging from free to $30-50 a month. A custom snippet written by a certified Shopify developer usually runs $300-800 at most European agencies, based on published rate cards.
App advantages
- Zero code for the merchant
- Automatic updates when Google’s rules change
- Plug-and-play integration with reviews, FAQ, variants
- Support included
Custom code advantages
- One-off cost, not recurring
- Full control over the output
- No risk that the app injects JS and slows the page
- No dependency on the app still being around in 3 years
When to pick each option
- Small catalog (under 50 products) and a theme you’re not changing soon: custom code
- Large catalog, active reviews, little technical time: review app with built-in schema
- Site with an in-house developer: custom code almost always wins
- Store with no technical resources: an app, even a free one like JSON-LD for SEO
The healthiest hybrid I see working: an app only for reviews (which they handle well because they also manage the UI), and custom code in snippets/schema-*.liquid for FAQ, BreadcrumbList and Article. That way you don’t pay recurring fees for things that don’t need them.
Citable capsule: The comparative cost of implementing schema in Shopify ranges from monthly apps at $0-50 to custom development at $300-800 paid once, based on published rate cards. The recommended hybrid is an app for reviews and your own Liquid snippets for FAQ and BreadcrumbList. Source: Shopify App Store, 2025.
Frequently asked questions
Does Shopify generate schema markup automatically on every theme?
It does on Dawn and on most OS 2.0 themes in the official theme store, but not on every custom theme or legacy theme. The guaranteed block is Product on product pages and Organization on the home page if you’ve uploaded a logo. Everything else depends on the theme. Check your product.json.liquid or run a product URL through the Rich Results Test before you assume coverage.
Can I add schema without touching the theme code?
Yes, with a schema markup app from the Shopify App Store. Apps like JSON-LD for SEO, Smart SEO or Schema Plus add FAQ, BreadcrumbList, Article and AggregateRating without editing Liquid. The risk is duplication with the native schema and with review apps, which can cancel out the effect. If you use an app, turn off the types your theme already emits to avoid conflicts.
Why aren’t my stars showing up in Google even though my schema is valid?
Having valid schema is necessary, not sufficient. According to Google Search Central, Google grants the stars rich result only when it decides the URL has enough reputation and the reviews come from a verifiable system. For new stores or stores with few reviews, it can take weeks or months before the stars show up, even with perfect schema.
Does schema markup help with ChatGPT, Perplexity and AI Overviews?
Yes, more than it used to help with traditional Google. Generative AI systems extract structured data to cite products, prices and answers. Marking up your content with Product, FAQPage and Article increases the odds those systems cite you as a source. It’s the main reason to keep investing in FAQ schema even though the classic rich result has been restricted since the 2023 update.
How do I avoid duplicating schema between theme and apps?
Run an inventory: open View Source on a product page, search for application/ld+json and count the blocks. If there’s more than one with @type: Product, you have duplication. The fix is to turn off emission in the app (app settings) or in the theme (comment out the snippet), leaving just one source. Never both. The Rich Results Test flags duplication explicitly.
Schema only matters if the page backs it up
Schema markup is one of the few technical SEO elements where the ratio of effort to visible impact is high and direct. It won’t lift your rankings, but when you do rank, it expands the real estate your snippet occupies. On a Shopify store, that difference shows up fast: stars, visible price, availability, FAQ, breadcrumbs. Each of those elements cuts click friction.
What doesn’t change is the underlying principle: Google rewards schema that matches real content. Marking up what doesn’t exist on the page is asking for a penalty. What works is inventorying what Dawn gives you for free, identifying the gaps in your specific case, and closing them with your own snippets or a well-configured app. No duplicates. Validated before publishing. Reviewed in Search Console afterward.
If your store is at the point where you know there’s schema but you don’t know if it’s complete or if your apps are breaking it, a technical audit saves you weeks of trial and error. Book 30 minutes with no commitment and I’ll tell you what your Shopify has today and what’s missing. 30-min session · No commitment.
Could your ad campaigns
perform better?
30 minutes to review your situation and tell you exactly what I would change. No pitch, no sales proposal.