Product and Offer schema, explained
Product describes one item for sale and Offer describes its price and availability. For a Google product snippet you need name plus at least one of offers, review or aggregateRating; an Offer needs price, and priceCurrency and availability are recommended. Merchant listings in Google Shopping have stricter requirements of their own.
What it's for
Product is "any offered product or service"; Offer is "an offer to transfer some rights to an item or to provide a service", usually a price. Google has two experiences built on this markup:
- Product snippets: price, availability and review information under a normal result, for product pages and review pages (Google: Product snippet).
- Merchant listings: richer shopping results for pages where people can buy the product, with more required properties (Google: Merchant listing).
Google currently supports product rich results only on pages that focus on a single product (or variants of one product), not category or listing pages.
Key properties (product snippet)
| Property | What it holds | |
|---|---|---|
name |
The product name. | Required |
offers / review / aggregateRating |
At least one of these three. | One is required |
offers.price |
The price as a number (39.99), or priceSpecification.price. |
Required in an Offer |
offers.priceCurrency |
ISO 4217 code, e.g. USD. Recommended for snippets, required for merchant listings. |
Recommended |
offers.availability |
A schema.org value such as https://schema.org/InStock. |
Recommended |
offers.priceValidUntil |
Date after which the price ends; a past date can stop the snippet showing. | Recommended |
AggregateOffer (lowPrice, priceCurrency, highPrice, offerCount) |
Several sellers' prices on one page. | Required parts: lowPrice, priceCurrency |
image, description, brand, sku, gtin |
Product details. | Used by merchant listings |
Minimal example
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Brass Hose Bib, 1/2 inch",
"image": "https://example.com/img/hose-bib.jpg",
"brand": { "@type": "Brand", "name": "Example" },
"offers": {
"@type": "Offer",
"price": 18.50,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/products/hose-bib"
}
}
Generate Product markup. It has no rating fields on purpose.
Reviews and ratings
Only add review or aggregateRating for real reviews that are visible on the same page. Google's review snippet guidelines say not to aggregate reviews from other websites and not to include fake or undisclosed incentivized reviews. Pros and cons markup is only for editorial review pages, not merchant pages. See Review and AggregateRating.
Common mistakes
- Currency inside
price("$18.50"). Use a number and put the currency inpriceCurrency. - Product markup on category pages.
- Prices or stock in markup that differ from the page.
- Invented ratings to get stars.
Sources
- schema.org: Product, Offer
- Google Search Central: Product snippet, Merchant listing (last updated 8 September 2026)