Product schema: the fields Google reads and the ones it requires
You add Product schema to make your product pages eligible for rich results. This guide shows the fields Google reads, which ones it requires, how offers differ for merchant listings, and the errors that trip small stores. You get a full JSON-LD example you can ship today.
By Théophile Louvart, founder of Porteur · Updated 14 September 2026 · Markdown
Product snippets versus merchant listings
Google shows two shapes for products: product snippets and merchant listings. Both read Product, Review and Offer structured data. They differ in what fields must be present and where they appear.
- Product snippets: show name, price or rating, and image beside a normal blue link. These can appear on any product detail page, even if you do not sell the item yourself.
- Merchant listings: show detailed shopping cards with price, shipping and returns. These apply to pages where a product can be bought. They read shipping and return policy fields.
For a small store, snippets lift click-through on “/products/…” pages. Merchant listings add price, availability and policies that reduce doubt before a click. You control eligibility with the fields below, not rankings overall. Structured data is not a ranking factor in itself, it makes the page eligible and clearer to machines.
The minimum Google requires for Product rich results
For Product rich results, Google requires name and at least one of review, aggregateRating or offers. Without these, the Rich Results Test will say the page is not eligible.
- name: the product title as a string. Match the visible H1 on the page.
- One of: review, aggregateRating, offers. Use offers on a page that sells the product. Use aggregateRating when you have ratings about the product. Use review for a specific review instance.
- offers: when present, include price, priceCurrency, availability and url. These are required inside offers for Google’s features.
- Recommended with Product: image, brand, sku, gtin. These make your result clearer and help matching across the web.
A fixed example on “/products/coffee-scale” has a name, an Offer with a numeric price, and an AggregateRating with ratingValue and ratingCount. The image is a full absolute URL to a crawlable JPEG. The brand is a simple text name or a Brand entity.
Offers for snippets and merchant listings
Offers power price, currency and stock, and they enable merchant listings when you also provide shipping and return details. Keep one clear, current Offer per purchasable variant URL. If you have variants, tie the schema to the current selection URL.
- price: a decimal number, not text and not with a currency sign.
- priceCurrency: a three-letter currency code like USD, GBP or EUR.
- availability: a schema.org ItemAvailability value such as InStock, OutOfStock, PreOrder, PreSale or BackOrder. Use the full URL form when you can.
- url: the canonical URL where the offer is available.
For merchant listings on pages where a product can be bought, add OfferShippingDetails and MerchantReturnPolicy. You can nest these under Offer or under your Organization as global defaults. Since 2024, Google also reads merchant fields on Organization, which is useful for sitewide policies on “/returns” and “/shipping”.
- OfferShippingDetails: shippingRate, shippingDestination and deliveryTime windows.
- MerchantReturnPolicy: returnPolicyCategory, merchantReturnDays, returnMethod and returnFees.
A fixed “/products/espresso-tamper” page would show an InStock Offer with priceCurrency GBP, OfferShippingDetails set to the countries you serve, and a MerchantReturnPolicy that matches your visible returns page. The Rich Results Test will confirm merchant listing eligibility when these are complete and the page sells the item.
Ratings and reviews that are allowed
Google can show a rating snippet for Product when you provide aggregateRating or review. The rating must be about the product on the page, not your business as an organisation. Self-serving star ratings for LocalBusiness or Organization are not eligible for rich results.
- aggregateRating: include ratingValue and ratingCount, or reviewCount. Keep ratingValue within your scale. If you use bestRating and worstRating, ensure the value sits within them.
- review: include reviewRating with ratingValue and bestRating, and author with name. Add datePublished in ISO 8601 where you have it.
If you syndicate reviews, only mark up the reviews that are visible on the page. Markup for content not visible is a policy violation and the test will flag it. For a SaaS, consider SoftwareApplication if the product is an app, see below.
A complete Product JSON-LD example you can ship
This example covers Product snippets and merchant listings on a product detail page that sells the item. Update the URLs, currency and policy text to match your site. Keep absolute URLs. Keep the price as a number. Availability uses the schema.org URL form. All numbers below are examples, typical formats, not measured on your site.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://yourstore.com/#org",
"name": "Your Store Ltd",
"url": "https://yourstore.com/",
"logo": {
"@type": "ImageObject",
"url": "https://yourstore.com/static/logo-112x112.png",
"width": 112,
"height": 112
},
"sameAs": [
"https://www.facebook.com/yourstore",
"https://www.instagram.com/yourstore"
],
"merchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
},
{
"@type": "Product",
"@id": "https://yourstore.com/products/coffee-scale/#product",
"name": "Precision Coffee Scale",
"image": [
"https://yourstore.com/images/coffee-scale/main.jpg",
"https://yourstore.com/images/coffee-scale/alt-1.jpg"
],
"description": "A compact metal coffee scale with 0.1 g accuracy and USB-C charging.",
"sku": "CS-1000",
"gtin": "0123456789012",
"brand": {
"@type": "Brand",
"name": "BrewRight"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"ratingCount": 127
},
"review": {
"@type": "Review",
"author": {"@type": "Person", "name": "Sam Patel"},
"datePublished": "2026-06-12",
"reviewBody": "Accurate and quick to tare. The display is bright and the battery lasts a week.",
"reviewRating": {
"@type": "Rating",
"ratingValue": 5,
"bestRating": 5
}
},
"offers": {
"@type": "Offer",
"url": "https://yourstore.com/products/coffee-scale",
"price": 89.99,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": 0,
"currency": "USD"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": ["US", "CA"]
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitText": "business day"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 2,
"maxValue": 5,
"unitText": "business day"
}
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://yourstore.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Scales",
"item": "https://yourstore.com/collections/scales"
},
{
"@type": "ListItem",
"position": 3,
"name": "Precision Coffee Scale"
}
]
}
]
}
</script>Where to put the markup and how to ship it
Use JSON-LD. It is the recommended format and is easier to manage. You can place it in the head or in the body. A page may carry several types in one @graph as shown in the example.
Pick the right template
Add Product to product detail pages. Add Organization sitewide. Add BreadcrumbList on pages that sit in a clear path.
Fill the minimum fields
Set Product.name and at least one of offers, review or aggregateRating. For offers, add price, priceCurrency, availability and url.
Keep URLs absolute
Use full URLs for image, url, availability and breadcrumb item. Relative URLs cause Rich Results Test errors.
Match what is on the page
Only mark up content that is visible. Keep price and availability in sync with what a user sees.
Handle variants cleanly
If colour or size changes price or stock, reflect the current selection in the Offer for the current URL.
Google renders pages, so JSON-LD injected by JavaScript can be read. Some answering AI crawlers do not run scripts, so prefer server-side rendering for them if you care about their previews. For Google Search rich results, either approach works as of 2026 when the rendered page contains the markup.
Test, validate and monitor errors
Use the right tool for the job. One checks Google’s rules, one checks schema.org syntax. Your flow is test, fix, deploy, then watch Search Console for sitewide issues the crawler finds over the next days.
- Rich Results Test: search.google.com/test/rich-results. It says which Google rich results the page is eligible for and what is missing.
- Schema Markup Validator: validator.schema.org. It checks syntax against schema.org and whether your graph resolves, without Google’s product rules.
- Structured Data Testing Tool: retired in 2020. Do not use old links or screenshots in docs.
In Search Console, you get an enhancement report for each rich result type Google finds. Fix errors first, then warnings. A missing required field blocks eligibility. A warning often means an optional field that would improve your result but is not mandatory. The validator and the test read the rendered page, so markup added after load is found by Google’s test.
- Common errors: a missing required field.
- A relative URL where an absolute one is needed, often image or breadcrumb item.
- A date not in ISO 8601 on a review.
- A price as text with a currency sign.
- A rating out of range versus bestRating and worstRating.
- Markup for content not visible on the page, a policy violation.
- Two types nested in a way that breaks the graph.
Images, brand and identifiers that help Google match
Google recommends image, brand, sku and gtin with Product. These help match your product to reviews, price comparisons and knowledge panels. They also produce a richer snippet with an image preview on some queries.
- image: use one or more absolute URLs. The images must be crawlable. Use your main hero and one alternate if you have it.
- brand: a text name is fine. If you run a brand store, link a Brand entity with a name.
- sku and gtin: add these when you have them. If you do not have a gtin, leave it out rather than invent one.
A fixed “/products/wireless-mouse” page would show image URLs under your domain, brand set to your brand, and a sku that matches the variant on that URL. The Rich Results Test will then show complete coverage with only optional warnings if anything is missing but not required.
Software apps versus physical products
If your product is software, use SoftwareApplication. Google has a separate rich result for apps. It reads name, offers.price, offers.priceCurrency and a rating via aggregateRating or a review. applicationCategory and operatingSystem are recommended.
On “/pricing” for a SaaS, mark up a SoftwareApplication with offers.price 0 if the app is free. You can still use Product on a hardware page like “/devices/”. Do not mix SoftwareApplication and Product on the same app page unless you know why, keep one clear type for one thing.
What a small store gains from Product schema
Clear price and stock on the results page reduce low intent clicks. Ratings set expectations. Merchant shipping and returns shown upfront cut bounce on “cheap” searches. These changes lift click-through and the quality of traffic, not rankings per se.
Start with your top ten sellers by impressions in Search Console. Add offers with priceCurrency and availability, and one aggregateRating. Fix the errors the Rich Results Test shows. Watch the Search appearance report for Product snippets over the next 28 days. Porteur reads your site and the searches around it from a URL and can point to pages that merit this work first.
Questions
Product schema is structured data that marks up a product detail page for machines. Google reads it to decide if the page is eligible for rich results like price and rating snippets or merchant listings. It does not boost rankings by itself, it clarifies what the page is about.
Yes. A minimal example has Product with name and an Offer that includes price, priceCurrency, availability and url. Add image, brand, sku and gtin when you have them. If you do not sell the product, provide aggregateRating or review instead of offers to meet eligibility.
You need a buyable page with a complete Offer, and you should add OfferShippingDetails and a MerchantReturnPolicy. These can sit under the Offer on the product page or on your Organization as sitewide defaults. The Rich Results Test will say when the page is eligible.
Use SoftwareApplication for a software app rich result. It requires name, offers.price and offers.priceCurrency, and a rating via aggregateRating or a review. Use Product for physical items you sell, or for a software device bundle that behaves like a product.
Place JSON-LD in the head or the body. Google renders pages and can read JSON-LD injected by JavaScript. For broader crawler support, render it server-side when you can. Keep the markup in sync with the visible content on the page.
Check that price is a number without a currency sign, priceCurrency is set, availability uses a schema.org value, and url is absolute. Fix any Rich Results Test errors and wait for Google to recrawl. If the page is not a purchase page, you may get a snippet but not a merchant listing.
Sources
Check my site, free
Paste a product URL and get a free check in about thirty seconds that reads your page, the searches around it and your rivals, and shows three findings.
- Free check, no card
- Read-only, your own accounts
- Readable by your agent
Read next
- GuideJSON-LD: how to write it, where to put it, how to test it
- GuideThe Rich Results Test: what it checks and what it does not
- GuideSoftwareApplication schema for a SaaS: an example that validates
- GuideOrganization schema: the fields that feed your knowledge panel
- GuideBreadcrumbs: the navigation, the markup, and what Google shows
- GlossaryStructured data
- GuideHow to add structured data to a site, whatever it is built with
- Free toolStructured data checker