Product Structured Data for Ecommerce: Complete Guide
How to implement Product structured data: merchant listings vs product snippets, required properties, offers, shipping, returns, reviews, variants and testing.
Quick answer
Product structured data is JSON-LD that describes a product page to search engines. For pages where shoppers can buy, Google's merchant listing experiences require the product's name, image and an offer with price and currency, and recommend availability, brand, GTIN, shipping details, return policy, ratings and reviews. Use ProductGroup for variants, mark up only what the page visibly shows, keep data in sync with the page and your Merchant Center feed, never mark up fake reviews, and validate with the Rich Results Test and Search Console reports.
What Product Structured Data Does
Structured data doesn't change what shoppers see on your page. It gives search engines precise facts about the product in a standard vocabulary, so they don't have to infer price or stock from the layout. That makes pages eligible for richer results such as price, availability, ratings, shipping and returns information, and for shopping experiences in Google Search.
This guide focuses on Google's documentation, the most detailed public reference. Other search engines and AI systems also read schema.org markup. It's one part of ecommerce SEO; category pages are covered in category page SEO.
Product Snippets vs Merchant Listings
Google describes two kinds of product results (Google Search Central).
| Type | For | Emphasis |
|---|---|---|
| Product snippets | Editorial and review pages where you can't buy directly | Review information, pros and cons |
| Merchant listing experiences | Pages where shoppers can buy the product | Price, availability, shipping, returns, sizing |
Worth noting
Google states that only pages where a shopper can purchase are eligible for merchant listing experiences, not pages linking to other sellers.
Required and Recommended Properties
From Google's merchant listing documentation (Google Search Central):
| Property | Status | Notes |
|---|---|---|
| name | Required | The product's name |
| image | Required | Crawlable product images |
| offers | Required | A nested Offer |
| offers.price | Required | Greater than zero for merchant listings |
| offers.priceCurrency | Required | ISO 4217 code, e.g. USD, EUR, INR |
| offers.availability | Recommended | InStock, OutOfStock, PreOrder, etc. |
| brand | Recommended | The brand name |
| gtin / sku | Recommended | Global identifiers help matching |
| itemCondition | Recommended | New, refurbished, used |
| shippingDetails | Recommended | Rates and delivery times |
| hasMerchantReturnPolicy | Recommended | Return window and method |
| aggregateRating, review | Recommended | Only if genuine and visible |
A Minimal Example
Here is a simplified Product with an Offer. Values are placeholders; your markup should come from real product data and match what the page shows.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Example Linen Shirt – White",
"image": ["https://example.com/images/linen-shirt-white.jpg"],
"description": "Relaxed-fit shirt in washed linen.",
"sku": "LS-WHT-M",
"gtin13": "0000000000000",
"brand": { "@type": "Brand", "name": "Example Brand" },
"offers": {
"@type": "Offer",
"url": "https://example.com/products/linen-shirt",
"price": "49.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}
</script>Variants and ProductGroup
For products sold in several sizes, colours or materials, Google supports ProductGroup with productGroupID (the parent SKU), variesBy (the dimensions that differ) and hasVariant (the individual Product variants) (Google Search Central). Two patterns exist:
- Each variant has a unique SKU or GTIN
- Each variant can be preselected with a distinct URL
- Variant names are more specific than the group name
| Pattern | Requirements |
|---|---|
| Single-page variants | One canonical URL for the ProductGroup; variants selected by parameters such as ?color=green |
| Multi-page variants | Each variant page repeats the ProductGroup definition with full markup |
Shipping and Returns
Shipping details and return policies help shoppers compare offers. You can include them in Offer markup, and Google also lets merchants configure them in Merchant Center. Keep whichever source you use accurate for each market; a mismatch between markup, page and feed undermines trust in your data.
Reviews and Ratings
Google's review snippet guidelines require that marked-up reviews be readily available to users on the page and prohibit fake or undisclosed incentivized reviews (Google Search Central). Pages using Organization or LocalBusiness markup for reviews the business controls about itself aren't eligible for star review features. For product pages, mark up only genuine reviews shown on that page, and never invent ratings. See product reviews UX for how to display them.
Structured data errors in Search Console?
ZSpace fixes product markup at the template level so it stays accurate as prices, stock and reviews change.
Keep Markup, Page and Feed in Sync
The most common problems aren't syntax errors. They're mismatches: markup showing a price the page no longer shows, stock marked available when the page says sold out, or a sale price in the feed but not on the page. Generate markup from the same data the page uses, update it whenever prices or availability change, and keep your Merchant Center feed on the same source. Google notes that providing both structured data and a feed helps it verify your data.
Platform Notes
Shopify says its themes include product schema automatically, but coverage varies by theme; check for missing brand, identifiers, shipping and returns, and for duplicate Product blocks added by reviews or SEO apps. On headless and custom builds, you own the markup entirely. See Shopify product SEO and Shopify Hydrogen.
Other Useful Schema for Stores
| Type | Use |
|---|---|
| BreadcrumbList | Category and product hierarchy; see internal linking |
| Organization | Your business identity, logo and contact details on the homepage or about page |
| WebSite | Site name |
| Article | Guides and blog posts |
| FAQPage | Visible FAQs; Google currently shows FAQ rich results only for well-known government and health sites |
Testing and Monitoring
- Rich Results Test on a sample of product templates and variants
- Search Console merchant listing and product snippet reports for site-wide errors
- Check that markup changes with price, sale and stock changes
- Confirm only one Product block per page
- Re-test after theme or app updates
Want product data that search engines can trust?
Talk to ZSpace about ecommerce development and Shopify theme fixes for structured data.
Common Mistakes
- Marking up reviews or ratings that aren't visible
- Price or availability in markup out of sync with the page
- Duplicate Product blocks from theme and apps
- Product markup on category pages
- Missing identifiers on products that have them
- Hard-coded markup that doesn't change with the variant selected
Conclusion
Product structured data works when it's complete, accurate and generated from the same data as the page and feed. Cover the required properties, add the recommended ones you can support, handle variants with ProductGroup, mark up only genuine visible reviews, and monitor it. For the broader picture, see ecommerce SEO.
Common questions
Machine-readable information, usually JSON-LD using schema.org vocabulary, that describes a product on a page: its name, images, brand, identifiers, price, availability, shipping, returns and reviews.