Product Schema Markup: The Minimum for Google Rich Results
Adding Product structured data unlocks price, stock, and rating snippets in Google search. Here's the minimum schema your e-commerce site actually needs.
Search for any product category in Google and look closely at the results. Some listings show a price, a star rating, an "In stock" badge — useful information for the shopper before they ever click. Others show nothing beyond the page title. The difference isn't ranking. The difference is Product schema.
If your store doesn't ship Product structured data on every product page, you're competing with one hand tied behind your back. The fix isn't a redesign or a new SEO strategy — it's roughly twenty lines of JSON-LD in the <head> of each product page, and it's free.
What Product schema actually does
Product schema is a piece of structured data — JSON-LD — that tells Google what a page is selling, for how much, in what currency, and whether it's in stock. Google reads it during the normal crawl, then decides whether to enrich your search listing with that information.
When it works, your SERP listing transforms from a plain blue link into something closer to a product card: title, snippet, price, currency, availability, and (if you've added ratings) a star score with review count. That's real estate competitors without schema simply can't claim.
The official reference is on Google's developer site: Product (Product, Review, Offer) structured data. The reference is exhaustive. Most of it you don't need.
The minimum viable Product schema
Google requires exactly five fields for a Product page to be eligible for product rich results:
nameimageoffers.priceoffers.priceCurrencyoffers.availability
Everything else is optional. Here's a copy-pasteable starting point:
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Hand-Stitched Leather Wallet",
"image": "https://yourstore.example/products/wallet-front.jpg",
"offers": {
"@type": "Offer",
"price": "59.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock"
}
}
</script>
Drop that in <head>, replace the values with your product's data, and you're eligible. Render it server-side if you can — Googlebot processes client-rendered JSON-LD but it's slower and less reliable.
The optional fields that actually move the needle
Beyond the minimum, three additions consistently produce richer SERP treatment:
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Hand-Stitched Leather Wallet",
"image": "https://yourstore.example/products/wallet-front.jpg",
"brand": {
"@type": "Brand",
"name": "Atelier Praha"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128"
},
"review": [
{
"@type": "Review",
"author": { "@type": "Person", "name": "M. Novak" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Beautiful stitching, arrived in four days."
}
],
"offers": {
"@type": "Offer",
"price": "59.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"url": "https://yourstore.example/products/leather-wallet"
}
}
</script>
brandclarifies the manufacturer or maker — useful when you're not the only seller of a third-party product.aggregateRatingis what unlocks star snippets. The data must come from genuine reviews displayed on the page itself, per Google's policy.reviewlets Google quote individual reviews. Including 1–3 representative ones is enough; don't dump your entire review database into JSON-LD.
Where the JSON-LD goes
Use <head> for JSON-LD so it loads early and isn't blocked by render — both <head> and <body> placements are valid per Google's structured data spec, but <head> consistently gives the most reliable parsing during crawls.
For Shopify, this typically means editing theme.liquid (the layout file) or your product template, not the product description. For WooCommerce, it's usually a function in functions.php hooked to wp_head, or a dedicated SEO plugin. For custom builds — Next.js, Nuxt, custom Rails — render it server-side in your product page template.
Common mistakes that nullify your schema
The schema engine is unforgiving about details. Four mistakes show up constantly in audits:
Price mismatch with the displayed price. Your JSON-LD says "price": "59.00" but the page shows €69.00 because of a regional pricing rule or an active sale. Google's validator flags this; if it slips through, your rich result eventually disappears.
Wrong currency code. "priceCurrency": "EU" or "priceCurrency": "EURO" are invalid. The correct ISO 4217 code is "EUR". Three letters, all caps.
availability typo. It's "https://schema.org/InStock", not "InStock", not "in_stock", not "available". The full URL is required.
aggregateRating without visible reviews on the page. Google specifically prohibits ratings that aren't displayed to users. Schema-injected ratings without a corresponding visible reviews block get the page flagged for spammy structured data.
Validating before you ship
Three tools, used in this order:
- Schema.org Validator — catches syntax errors in the JSON-LD itself.
- Google's Rich Results Test — confirms Google can parse it and tells you which rich result types you're eligible for.
- EshopAuditor — runs both checks across your entire sitemap, not just one URL, and flags pages where the schema is missing, malformed, or inconsistent with displayed content.
The third one matters when you have a 500-product catalog and a recent theme update. Manually testing every PDP isn't practical. An audit that walks your sitemap is.
A real example from our demo
The audit on the EshopAuditor landing page runs against a 14-page product catalog where most pages are missing Product schema entirely. It's not a contrived example — it's the most common finding we see on real e-commerce audits. Stores ship product pages, build category structure, run ads, and never check whether their schema is in place. The cost is invisible until you sit down with Search Console and compare against a competitor who got it right.
If you only do one technical SEO task on your store this quarter, ship Product schema with the five required fields on every product page. Everything else compounds from there.
Run a free audit of your store at eshopaudit.io — no signup required for the first scan.