Product schema markup: a practical JSON-LD guide for e-commerce
Product schema is the difference between Google reading your page as words on a screen and reading it as a product with a price, a rating, and stock it can display directly in search.
This guide is the implementation companion to our AEO and SEO articles. It covers exactly which properties matter, when to use merchant listing versus product snippet markup, how to handle variants, and how to validate — with JSON-LD you can adapt directly for a Shopify or WooCommerce store.
What is product schema markup?
Product schema markup is structured data — code in a standardised, machine-readable format — that describes a product to search engines: its name, price, availability, brand, and reviews. Google recommends implementing it as JSON-LD, and when it is correct and matches the visible page, it makes the page eligible for product rich results in Search, Images, and Lens.
Search engines read your page content with algorithms, but structured data removes the guesswork. Google's own documentation puts it plainly: when you add structured data to your product pages, your product information can appear in richer ways across Google Search, Images, and Lens — showing price, availability, and review ratings right in the results.
The vocabulary itself is defined by schema.org, an open standard maintained collaboratively by Google, Microsoft, Yandex, and Yahoo. Google supports many — but not all — of the types schema.org defines, so the practical reference for e-commerce is always Google's structured data documentation, not schema.org alone.
"Structured data removes ambiguity. It is the difference between Google inferring your price from page text and Google being told your price, currency, and stock status explicitly."
ThinkLab — Technical SEO PracticeWhy JSON-LD, not Microdata
schema.org markup can be written in three formats — JSON-LD, Microdata, and RDFa — but Google recommends JSON-LD as the primary format. JSON-LD sits in a single <script> block in the page head and does not interleave with your visible HTML, which makes it far easier to maintain than Microdata scattered through your markup. Every example in this guide uses JSON-LD.
Product snippets vs merchant listings
Google defines two main classes of Product structured data. Choosing the right one is the first real decision — they overlap, but they serve different page types and unlock different rich-result features.
For pages where people can't directly purchase the product — such as an editorial product review or a roundup. This class has more options for review information, including pros and cons on editorial review pages.
For pages where customers can buy the product from you. This class supports richer detail — apparel sizing, shipping cost and delivery estimates, and return policy information. This is what most store product pages need.
Beyond individual products, Google recommends structured data for your business policies nested under Organization markup — merchant return policy and any loyalty program you offer.
The two Product structured-data classes plus Organization-level policy markup. Store product pages almost always want merchant listings.
If a customer can add the item to a cart and check out on the page, use merchant listing markup. Reserve product snippet markup — especially the pros and cons properties — for editorial review pages, which are the only pages eligible for the pros and cons appearance.
Required vs recommended properties
You must include the required properties for your structured data to be eligible at all. Recommended properties are not mandatory, but the more valid detail you provide, the higher-quality — and more visible — the result can be.
| Property | Status | What it holds |
|---|---|---|
| name | Required | The product title |
| offers | Required | An Offer with price, priceCurrency, availability, itemCondition |
| image | Recommended | One or more product image URLs |
| description | Recommended | Unique product description text |
| brand | Recommended | A nested Brand object |
| sku / mpn / gtin | Recommended | Product identifiers (SKU, manufacturer part number, barcode) |
| review / aggregateRating | Recommended | Individual reviews and/or a summary rating |
| color / material / size | Recommended | Attribute detail, especially for apparel |
Only name and offers are strictly required. Everything else is recommended — and each valid property increases result quality.
The availability enumeration
The availability property inside Offer does not take free text — it uses a fixed schema.org enumeration. Use the exact values: https://schema.org/InStock, OutOfStock, PreOrder, BackOrder, or Discontinued. Using anything else means Google may not read the stock status at all.
Google requires that structured data be a true representation of the page content. If your visible page says one price and your markup says another — or your markup describes reviews that aren't shown — the markup can be ignored or treated as spam. Keep price, availability, and reviews in the markup identical to what the customer sees.
A complete Product JSON-LD example
Here is a merchant-listing Product with all the high-value properties: a nested Brand, a nested Offer with price and availability, and an aggregate rating. Adapt the values to your product and drop it in the page <head>.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Merino Wool Crew Knit",
"image": [
"https://example.com/knit-front.jpg",
"https://example.com/knit-back.jpg"
],
"description": "Mid-weight crew-neck jumper in 100% traceable merino wool.",
"sku": "KNIT-CREW-NVY",
"mpn": "MW-2201",
"gtin13": "9312345678907",
"brand": { "@type": "Brand", "name": "ThinkLab Apparel" },
"color": "Navy",
"material": "Merino wool",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/merino-crew-knit",
"priceCurrency": "AUD",
"price": "149.00",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock"
}
}
</script>A merchant-listing Product in JSON-LD. Note the availability enumeration and the nested Offer and Brand objects.
Put it in the initial HTML
Google recommends that merchants optimising for all shopping surfaces put Product structured data in the initial HTML for the best results. Dynamically generating the markup with JavaScript can make Shopping crawls less frequent and less reliable — a real risk for fast-changing data like price and availability. If you must generate it with JavaScript, make sure your server can handle the increased crawl traffic.
- 1BreadcrumbListCommunicates site hierarchy and supports the breadcrumb rich result.
- 2OrganizationBusiness information, plus a home for return-policy and loyalty-program markup.
- 3Review / AggregateRatingProduct feedback that can surface star ratings in results.
- 4VideoObjectFor product videos you want understood and eligible for video features.
Google names these among the structured-data types particularly relevant for e-commerce sites, alongside Product and ProductGroup.
Marking up product variants
Many products — apparel, shoes, furniture, luggage — are sold in variations by size, colour, material, or pattern. To help Google understand which products are variations of the same parent, use the ProductGroup type with variesBy, hasVariant, and productGroupID, in addition to Product markup. This also makes variants eligible for display with variant information in merchant listing experiences.
<script type="application/ld+json">
[
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"@id": "#knit_parent",
"name": "Merino Wool Crew Knit",
"description": "Mid-weight crew-neck jumper in 100% merino wool.",
"brand": { "@type": "Brand", "name": "ThinkLab Apparel" },
"material": "Merino wool",
"productGroupID": "KNIT-CREW",
"variesBy": [
"https://schema.org/color",
"https://schema.org/size"
]
},
{
"@context": "https://schema.org",
"@type": "Product",
"isVariantOf": { "@id": "#knit_parent" },
"sku": "KNIT-CREW-NVY-M",
"name": "Merino Wool Crew Knit, Navy, M",
"color": "Navy",
"size": "M",
"offers": {
"@type": "Offer",
"url": "https://example.com/merino-crew-knit?color=navy&size=m",
"priceCurrency": "AUD",
"price": "149.00",
"availability": "https://schema.org/InStock"
}
}
]
</script>A ProductGroup with one variant. Shared attributes (brand, material) live on the group; variant-determining attributes (color, size) and the Offer live on each Product.
Keep shared properties — brand, material, review information — on the ProductGroup to reduce duplication, and put the variant-determining attributes and the Offer on each individual Product. On multi-page variant setups, the ProductGroup definition is repeated on each variant page.
Testing, deploying, and monitoring
Schema is easy to get subtly wrong, so treat validation as part of deployment, not an afterthought. The workflow is consistent across platforms:
- Validate syntax — run the page through Google's Rich Results Test to preview eligibility, and the Schema Markup Validator to catch schema.org syntax errors, before you ship.
- Deploy in the initial HTML — server-render the JSON-LD where you can, so crawlers see it reliably on first fetch.
- Request a recrawl — use the URL Inspection tool in Google Search Console to confirm Google can see the markup and, if needed, request indexing.
- Monitor the reports — watch the Merchant listings and Product snippets reports in Search Console for warnings and errors on live pages over the following weeks.
Google is explicit: using structured data enables a rich result to be present, but does not guarantee it will appear. Results are shown at Google's discretion based on query, device, and whether the markup faithfully represents the page. Valid markup is necessary but not sufficient — the rest is content quality and trust.
"Correct schema is table stakes. It makes your page eligible. Whether the rich result shows is then a question of relevance, accuracy, and trust — which is where SEO and AEO take over."
ThinkLab — Technical SEO PracticeFrequently asked questions
What is product schema markup?+
Product schema markup is structured data — code added to a product page in a standardised, machine-readable format — that tells search engines the product's name, price, availability, brand, and reviews. Google recommends implementing it as JSON-LD. When added correctly it makes the page eligible for product rich results, which can show price, availability, and star ratings directly in search.
What properties are required for Product structured data?+
For a Product to be processed by Google, the name and offers properties must be present, with the Offer containing price, priceCurrency, and availability. Google also uses recommended properties — brand, image, description, sku, gtin, mpn, color, material, and review or aggregateRating — to enrich the result. Merchant listings additionally support shipping and return details.
What is the difference between product snippets and merchant listings?+
Google defines two classes of Product structured data. Product snippets are for pages where the product can't be directly purchased, such as editorial reviews, and support pros and cons markup. Merchant listings are for pages where customers can buy the product, and support richer detail like shipping, returns, and apparel sizing. Pages where you sell products should use merchant listing markup.
How do I mark up product variants?+
Use the ProductGroup type for products that vary by size, colour, material, or pattern. Define shared properties (brand, material) once on the ProductGroup, list the variant-determining attributes in variesBy, and connect each variant Product with isVariantOf and a productGroupID. This helps Google understand which products are variations of one parent.
Does schema markup guarantee rich results?+
No. Google states that using structured data enables a feature to be present but does not guarantee it will appear. Rich results are shown at Google's discretion based on many factors including query, device, and whether the markup accurately represents visible page content. Markup that misrepresents the page or describes hidden content can be ignored or flagged.
Should schema be in the HTML or added with JavaScript?+
Google recommends putting Product structured data in the initial HTML for the best results. JavaScript-generated markup can make Shopping crawls less frequent and less reliable, which is a problem for fast-changing data like price and availability. If you use JavaScript, ensure your server can handle increased crawl traffic.
How do I test product schema markup?+
Validate your markup with Google's Rich Results Test and the Schema Markup Validator to catch syntax errors, then monitor the Merchant listings and Product snippets reports in Google Search Console after deployment. The Rich Results Test previews eligibility; Search Console reports surface warnings and errors on live pages.
Sources & further reading
Every claim in this guide is drawn from the primary documentation below. Where our own experience is stated as opinion, it is attributed to ThinkLab, not to these sources.
- Intro to Product Structured Data on GoogleGoogle Search Central — the two Product classes, rich-result eligibility, and Organization-level policy markup. developers.google.com/search/docs/appearance/structured-data/product
- How To Add Merchant Listing Structured DataGoogle Search Central — merchant listing requirements, shipping and return details, initial-HTML recommendation. developers.google.com/search/docs/appearance/structured-data/merchant-listing
- Product Snippet Structured DataGoogle Search Central — product snippet class, pros and cons for editorial reviews, JavaScript-markup caveats. developers.google.com/search/docs/appearance/structured-data/product-snippet
- Product Variant Structured Data (ProductGroup, Product)Google Search Central — ProductGroup, variesBy, hasVariant, productGroupID, and isVariantOf. developers.google.com/search/docs/appearance/structured-data/product-variants
- Structured Data for Ecommerce SitesGoogle Search Central — BreadcrumbList, Organization, Review, VideoObject and other ecommerce-relevant types. developers.google.com/search/docs/specialty/ecommerce/include-structured-data-relevant-to-ecommerce
- General Structured Data GuidelinesGoogle Search Central — the "enables but does not guarantee" rule and the accuracy / true-representation requirements. developers.google.com/search/docs/appearance/structured-data/sd-policies
- Product — Schema.orgThe Product type definition and vocabulary, including the ItemAvailability enumeration. schema.org/Product
- Supported structured data attributes and valuesGoogle Merchant Center Help — attribute mapping and a canonical Product JSON-LD example. support.google.com/merchants/answer/6386198
Documentation reflects Google Search Central guidance current as of mid-2026. Google updates its structured-data requirements regularly — always check the Rich Results Test and the linked docs before shipping.
Related reading: SEO vs AEO vs GEO, Product Page SEO Best Practices, and the Complete Shopify SEO Checklist.
Want your schema implemented and validated for you?
ThinkLab builds and audits structured data for Shopify and WooCommerce stores as part of a technical SEO engagement.
Get in touch