Schema Markup for Shopify Products: The Complete Guide
Shopify stores that implement Product schema see up to 30% higher click-through rates on Google Search. The reason is simple: Product schema unlocks rich snippets — star ratings, prices, availability badges, and image carousels that make your listing visually dominant on the results page. This guide walks you through exactly how to add Product JSON-LD to your Shopify store, with or without an app, and how to avoid the mistakes that cause Google to ignore your markup.
Why Product schema is non-negotiable for Shopify
Google processes over 3.5 billion searches per day. A significant percentage of those are product-related: "best running shoes under $100", "organic cotton t-shirt", "wireless earbuds sale". When Google displays product results, it does not read your page copy to extract price and availability. It reads your structured data.
Without Product schema, your Shopify listing is a plain blue link. With Product schema, it is a product card with stars, price, and stock status. In A/B tests conducted by Google, rich results consistently deliver 20–35% higher CTR than plain results for the same ranking position.
Method 1: Using a Shopify app
The fastest way to add Product schema is with a dedicated app. SchemaGens for Shopify, JSON-LD for SEO, and Smart SEO are the three most popular options. These apps automatically inject Product schema into your product pages by reading your Shopify product data.
The downside of apps is limited customization. Most apps only support basic Product schema and do not let you add advanced fields like aggregateRating, hasVariant, or isRelatedTo. If you need custom schema or want to combine Product with FAQPage and HowTo on the same page, you will need to edit your theme code.
Method 2: Manual theme editing
For full control, edit your Shopify theme directly. Navigate to Online Store → Themes → Edit Code → product.liquid (or product.json for Shopify 2.0 themes). Add a JSON-LD script tag that pulls data from Shopify's Liquid variables.
{%- assign current_variant = product.selected_or_first_available_variant -%}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.title | json }},
"description": {{ product.description | strip_html | json }},
"url": {{ shop.url | append: product.url | json }},
"sku": {{ current_variant.sku | json }},
"brand": {
"@type": "Brand",
"name": {{ product.vendor | json }}
},
"offers": {
"@type": "Offer",
"price": {{ current_variant.price | divided_by: 100.00 | json }},
"priceCurrency": {{ shop.currency | json }},
"availability": "https://schema.org/{% if current_variant.available %}InStock{% else %}OutOfStock{% endif %}",
"url": {{ shop.url | append: product.url | json }}
},
"image": {{ product.featured_image | img_url: '1200x1200' | prepend: 'https:' | json }}
}
</script>This template dynamically generates valid JSON-LD for every product page using Shopify's Liquid variables. The divided_by: 100.00 filter converts Shopify's cent-based prices to dollars.
Required vs recommended Product schema fields
Google's Rich Results Test validates your schema against a set of required and recommended fields. Missing required fields prevents rich results entirely. Missing recommended fields reduces your eligibility score.
Required fields
- name — The product name.
- offers — Must contain @type: Offer, price, and priceCurrency.
- offers.availability — InStock, OutOfStock, or PreOrder.
Recommended fields
- aggregateRating — Star rating and review count. Minimum 1 review required.
- brand — Brand name as a Brand object.
- sku — Stock keeping unit for inventory matching.
- gtin — Global Trade Item Number for Google Shopping integration.
- image — At least one image, preferably 1200×1200 pixels.
- description — A concise product description (not the full page copy).
Adding aggregateRating for star snippets
Star ratings in search results are one of the most powerful CTR boosters in e-commerce. To show stars, you need aggregateRating with a minimum ratingValue and ratingCount of at least 1. Most Shopify review apps (Judge.me, Loox, Yotpo) can inject this automatically.
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"ratingCount": "128",
"bestRating": "5",
"worstRating": "1"
}Critical: Do not fabricate ratings. Google's spam algorithms detect fake review markup with high accuracy. If you have no reviews yet, omit aggregateRating entirely and add it once you have genuine customer feedback.
Handling product variants
If your product has multiple variants (size, color, material), you have two schema options. Option A: Use a single Product with an offers array containing one Offer per variant. Option B: Use a ProductGroup with hasVariant linking to individual Product objects. Option A is simpler and sufficient for most Shopify stores.
"offers": [
{
"@type": "Offer",
"price": "29.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemOffered": {
"@type": "Product",
"name": "Organic Cotton T-Shirt — Medium / Navy"
}
},
{
"@type": "Offer",
"price": "29.99",
"priceCurrency": "USD",
"availability": "https://schema.org/OutOfStock",
"itemOffered": {
"@type": "Product",
"name": "Organic Cotton T-Shirt — Large / Navy"
}
}
]Testing your Shopify Product schema
After implementing your schema, validate it before relying on it for rich results. Use these tools in order:
- Schema Markup Validator (validator.schema.org) — Validates syntax against schema.org standards.
- Google Rich Results Test (search.google.com/test/rich-results) — Validates eligibility for Google rich results specifically.
- Google Search Console → Enhancements → Products — Monitors live product schema health after deployment.
Run the Rich Results Test on at least three product pages: one in stock, one out of stock, and one with variants. This catches edge cases that a single test might miss.
Common Shopify schema mistakes
These mistakes cause more Shopify schema failures than any others:
- Price format errors — Shopify stores prices in cents (2999), but schema requires dollars (29.99). Always divide by 100.
- Duplicate schema — Many Shopify themes include basic Product schema by default. Adding a second script tag creates duplicates. Check your theme's existing schema before adding new markup.
- Missing availability — Out-of-stock products without availability: OutOfStock can still show "In Stock" in rich results, leading to customer frustration and returns.
- Description truncation — Some apps truncate descriptions at 500 characters. Google prefers full descriptions between 50 and 5000 characters.
- Image size — Images smaller than 1200 pixels wide do not qualify for large image thumbnails in Google Search.
Keeping schema synchronized with inventory
The biggest operational challenge with Product schema is keeping it synchronized with real inventory. When a product sells out, your schema must update to OutOfStock within minutes — not days. Stale availability data damages trust and conversion rates.
For Shopify, this means either using a real-time app that hooks into inventory webhooks, or running an automated drift monitor that checks your live schema against your actual product data and alerts you when they diverge. SchemaGens offers automated drift detection and one-click redeploy for Shopify stores.
The bottom line
Product schema is the highest-ROI technical SEO investment for any Shopify store. It takes under an hour to implement, costs nothing if you do it manually, and can increase organic CTR by 20–30%. In a competitive e-commerce landscape, that is the difference between a profitable store and one that struggles to attract traffic.
Frequently asked questions
Does Shopify include Product schema by default?
Some Shopify themes include basic Product schema, but it is often incomplete. Check your theme's product.liquid file for existing <script type="application/ld+json"> tags. If present, decide whether to enhance the existing schema or replace it entirely.
Can I add Product schema without a Shopify app?
Yes. Edit your theme's product.liquid (or product.json for Shopify 2.0) file and add a <script type="application/ld+json"> tag with Liquid variables. This gives you full control but requires basic familiarity with Shopify theme code.
How do I show star ratings in Google Search for my Shopify products?
Add aggregateRating to your Product schema with ratingValue and ratingCount. You need at least 1 genuine review. Use a review app like Judge.me, Loox, or Yotpo to collect reviews, then integrate their rating data into your JSON-LD. Never fabricate ratings.
Why is my Product schema not showing rich results?
Common causes: missing required fields (name, offers, price), invalid JSON syntax, duplicate schema blocks, or Google has not yet crawled your page. Use the Rich Results Test to diagnose the exact issue.
How do I handle product variants in schema markup?
Use an offers array with one Offer per variant, or use ProductGroup with hasVariant for complex variant structures. For most Shopify stores, the offers array approach is simpler and equally effective.
How often should I update my Product schema?
Update Product schema whenever price, availability, or description changes. For high-velocity stores, this means real-time updates via webhooks. For smaller stores, daily or weekly checks are sufficient. Use automated drift monitoring to catch mismatches before customers do.
What image size does Google require for Product rich results?
Google recommends images at least 1200 pixels wide for large image thumbnails. The image should be in JPG, PNG, or WebP format and accessible without login or paywall.
Can I combine Product schema with other schema types on the same page?
Yes. Use a @graph array to combine Product with FAQPage, HowTo, or BreadcrumbList on the same page. This is especially powerful for product pages that include instructional content or customer FAQs.