Most Shopify stores already output product structured data, because modern themes include it. The problems are usually what's missing, what's duplicated by apps, and what no longer matches the page. This guide is for store owners, marketers and developers who want product schema that's accurate, eligible for Google's merchant listing features, and consistent with the data AI shopping tools read.
Key takeaways
- Shopify's free themes, including Dawn and Horizon, output product JSON-LD with the Liquid
structured_datafilter. Products with variants are output asProductGroup. - Google has two product experiences: merchant listings (pages where you sell) and product snippets (review or editorial pages). Store product pages should target merchant listings.
- Google recommends defining return and shipping policies once at the organization level and referencing them, instead of repeating them on every product.
- FAQ rich results stopped appearing in Google Search on May 7, 2026. Don't add FAQ markup expecting stars or dropdowns.
- The most common issue I find is duplicate Product markup from the theme plus review and SEO apps.
Why structured data still matters
Structured data won't get you into AI Overviews by itself. Google says no special markup is needed for AI features. But it still does three useful jobs:
- It makes product pages eligible for rich results: price, availability, shipping, returns and review stars in search.
- Google uses it alongside your Merchant Center feed to understand and verify your products. Google says using both maximizes eligibility.
- It forces you to keep one consistent version of the truth about price, availability and policies, which is what every machine reader, including AI assistants, rewards.
Merchant listings vs product snippets
| Merchant listings | Product snippets | |
|---|---|---|
| Use for | Pages where customers can buy from you | Pages where people can't buy directly (reviews, editorial) |
| Required | name, image, offers with price and currency | name, plus a review, rating or offers |
| Price | Must be greater than zero; use Offer, not AggregateOffer | More flexible |
| Extras | Shipping, returns, apparel sizing, variants, member pricing | Pros and cons on editorial reviews |
If your product page meets the merchant listing requirements, Google says it's also potentially eligible for product snippets.
What your Shopify theme outputs
Open your theme code and search for structured_data. In Shopify's own themes, you'll find something like this in the product section:
<script type="application/ld+json">
{{ product | structured_data }}
</script>Shopify's documentation says the filter outputs a schema.org Product for products without variants and a ProductGroup for products with variants. It also supports article objects for blog posts.
The documented example output includes name, description, image, brand, category, url and an offers block with availability, price and priceCurrency. It doesn't include GTIN, aggregateRating, shippingDetails or hasMerchantReturnPolicy. Your real output may differ depending on the product, so test your own pages rather than assuming either way.
Older or heavily customized themes often have hand-written JSON-LD instead of the filter. Hand-written markup is fine if it's maintained, but it's a common source of stale data, such as a hardcoded currency or availability that never changes.
Recommended properties worth adding
Google's merchant listing documentation lists these recommended properties. Here's how they map to Shopify data:
| Property | Shopify source | Notes |
|---|---|---|
gtin / mpn / sku | Variant barcode, SKU, or metafields | Use real identifiers only; never make them up |
brand.name | Product vendor | Make sure vendor is your brand, not a supplier code |
aggregateRating, review | Your reviews app | The rating must be visible on the page |
color, size, material | Variant options or category metafields | Helps variant understanding |
availability, itemCondition | Inventory; usually "new" | Keep availability live, not hardcoded |
priceValidUntil, validFrom, validThrough | Sale dates | Google added sale duration guidance in July 2026 |
shippingDetails, hasMerchantReturnPolicy | Your policies | Better defined at the organization level |
Sale prices
Google's July 2026 update spells out how to mark up a sale. Mark the original price with priceType set to https://schema.org/StrikethroughPrice, don't put priceType on the active sale price, and use validFrom and validThrough (or priceValidUntil) with full ISO 8601 dates and time zones. Google warns your listing may not display if priceValidUntil is in the past, a common bug when a sale end date is hardcoded and forgotten.
Return and shipping policies at the organization level
Google recommends putting your store-wide return policy under Organization markup, and using offer-level hasMerchantReturnPolicy or shippingDetails only to override it. Since November 2025, Google also supports merchant-level shipping policy markup.
A minimal return policy example, usually placed once in your theme layout or homepage. Replace every value with your actual policy:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Store Name",
"url": "https://www.example.com",
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
}The values must match your published refund policy and your Merchant Center settings exactly. If your policy says 14 days and your markup says 30, you've created a trust problem, not an SEO win.
Pro tip: You can also set return policies and shipping in Merchant Center. Keep the policy page, Merchant Center and your markup in sync, and check all three whenever the policy changes.
Reviews: what's allowed
On a product page, marking up genuine customer reviews of that product is allowed, but the reviews and rating must be visible on the page. Google's self-serving review restriction applies to LocalBusiness and Organization markup: you can't mark up reviews of your own business on your own site for stars. Remove any app setting that adds an aggregate rating to your homepage or Organization markup.
Step-by-step audit
This is the process I use on a Shopify store:
- Pick test URLs. A simple product, a product with many variants, a sold-out product, a product on sale, a collection page and a blog post.
- Run each through Google's Rich Results Test. Note which items are detected (Product, ProductGroup, Merchant listing, Review snippet, Breadcrumb, Organization) and any critical errors.
- Count the Product blocks. If you see two or three, find the sources. Typical offenders are review apps, SEO apps and old snippets left from uninstalled apps. Keep one complete version.
- Compare markup to the page. Price, currency, availability and ratings must match what a shopper sees. Check a sale product and a sold-out product specifically.
- Check variants. Each variant should have its own URL (Shopify's
?variant=URLs work) and correct price and availability. - Check Search Console. Review the Merchant listings and Product snippets reports for errors and warnings across the whole site, not just your test URLs.
- Compare with Merchant Center. Mismatches between your feed and your page markup cause disapprovals. Fix the source in Shopify, not just the feed.
- Add organization-level policies if they're missing, then re-test.
- Remove dead markup. FAQ markup no longer produces rich results. Leaving correct markup is harmless, but don't spend time adding it.
Common mistakes
- Hardcoded availability (
InStockon every product, including sold-out items). - Wrong currency on multi-currency stores using Shopify Markets. Test with a non-default market.
- GTINs filled with SKUs or placeholder numbers. Leave the field empty if you don't have a real identifier.
- Review stars with no visible reviews, or ratings imported from another platform without the review content.
- Markup left behind by an uninstalled app. Shopify warns that some apps add theme code that isn't removed automatically. See our app stack audit guide.
FAQ
Does Shopify add product schema automatically?
Shopify's free themes output product structured data through the structured_data Liquid filter. Third-party or older themes vary, so check your theme code and test your pages.
Do I need an SEO app for structured data?
Usually not for basic product markup. An app can help add missing properties or organization policies, but make sure it replaces your theme's markup rather than duplicating it.
Does structured data help with AI search?
Google says it's not required for AI Overviews or AI Mode. It still helps with rich results and keeps product data consistent, which helps any system that reads your pages. Our AI search optimization guide covers the rest.
Should I still add FAQ schema?
Not for Google rich results. Google stopped showing FAQ rich results in May 2026. A visible FAQ section can still help shoppers.
Next steps
Run the nine-step audit on six representative URLs this week. Fix duplicates and data mismatches first, then add organization-level return and shipping policies. If your theme is heavily customized or you run multiple markets, book a Shopify consultation.
Sources
- Google Search Central: Merchant listing (Product, Offer) structured data
- Google Search Central: Introduction to Product structured data
- Google Search Central: Review snippet structured data
- Google Search Central: AI features and your website
- Google Search Central: Latest documentation updates
- Google Rich Results Test
- Shopify.dev: structured_data Liquid filter
- Shopify Dawn theme on GitHub
- Shopify Horizon theme on GitHub
- Shopify Help Center: Uninstalling apps
