Product Structured Data
Product Snippet Schema Markup
The one that adds stars and pricing to your Google results. Works on any product page — you don't have to be selling it.
Generate Product Snippet Schema FreeAlso a merchant? Add Merchant Listing schema to unlock Shopping features too.
Product Snippet in Google Search
What Product Snippet schema unlocks
Who should use Product Snippet schema
Unlike Merchant Listing, Product Snippet is not restricted to sellers. Any of the following page types are eligible:
- Editorial review pages: sites that review products but don't sell them. Full access to pros/cons feature.
- Shopping aggregator pages: comparison sites listing multiple sellers. Use AggregateOffer with lowPrice, highPrice, offerCount.
- Merchant product pages: pages where you sell the product. Add Merchant Listing markup too for Shopping features.
Required and recommended properties
The minimum for a Product Snippet is name plus at least one of review, aggregateRating, or offers.
| Property | Status | Notes |
|---|---|---|
| name | Required | Product name. |
| review / aggregateRating / offers | Required | At least one of these three must be present for rich result eligibility. |
| aggregateRating | Recommended | Enables star ratings. Requires ratingValue and reviewCount. |
| review | Recommended | Individual review with author and rating. Add positiveNotes/negativeNotes for editorial pages. |
| offers (Offer) | Recommended | Single seller price. Required: price, priceCurrency. Enables price drop alerts. |
| offers (AggregateOffer) | Optional | For aggregator pages. Required: lowPrice, priceCurrency. Add highPrice and offerCount. |
| image | Recommended | Product image URL. Crawlable and indexable. |
| description | Recommended | Product description. |
| brand | Recommended | Brand name as nested Brand object. |
| sku | Optional | Stock keeping unit. Recommended for Shopping matching. No whitespace; ASCII preferred. |
| gtin13 / gtin12 / gtin8 / gtin14 | Optional | Global Trade Item Number. Use the most specific type that applies (EAN = gtin13, UPC = gtin12). Numerical form only — not URL form. Strongly recommended for Shopping matching. |
| mpn | Optional | Manufacturer Part Number. Use when no GTIN is available. |
Note: pros/cons (positiveNotes / negativeNotes) are only eligible for editorial review pages — not merchant pages or customer reviews.
JSON-LD examples
Basic — name, rating, price
The minimum viable Product Snippet for a merchant page: name + aggregateRating + Offer. Works for any page type.
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Executive Anvil",
"image": "https://example.com/anvil.jpg",
"description": "Sleeker than the Classic Anvil. Perfect for business travellers.",
"brand": { "@type": "Brand", "name": "ACME" },
"sku": "ANVIL-EXEC-001",
"gtin13": "1234567890123",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "89",
"bestRating": "5",
"worstRating": "1"
},
"offers": {
"@type": "Offer",
"price": "29.99",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31"
}
}
Editorial review — with pros and cons
For editorial review pages only. Add positiveNotes and negativeNotes inside your review object as ItemList. Reviewer name must be a valid person or team — not promotional text (e.g. "50% off this week" as an author name will be ignored).
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Executive Anvil",
"image": "https://example.com/anvil.jpg",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "89",
"bestRating": "5"
},
"review": {
"@type": "Review",
"author": {
"@type": "Organization",
"name": "CNET Reviewers"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"positiveNotes": {
"@type": "ItemList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Consistent results" },
{ "@type": "ListItem", "position": 2, "name": "Still sharp after many uses" }
]
},
"negativeNotes": {
"@type": "ItemList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "No child protection" }
]
}
}
}
Aggregator page — AggregateOffer
For comparison sites listing prices from multiple sellers. Use AggregateOffer — not a single Offer. Note: AggregateOffer is not for product variants — use ProductGroup for that.
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Executive Anvil",
"image": "https://example.com/anvil.jpg",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "89"
},
"offers": {
"@type": "AggregateOffer",
"lowPrice": "29.99",
"highPrice": "49.99",
"priceCurrency": "GBP",
"offerCount": "5"
}
}
Product Snippet vs Merchant Listing
Both use @type: Product. The difference is who can use them and what features they unlock.
| Feature | Product Snippet | Merchant Listing |
|---|---|---|
| Who can use it | Any page describing a product — reviews, aggregators, merchants | Purchase pages only — you must be the seller |
| Star ratings in organic | ✓ | ✓ |
| Price in organic snippet | ✓ (Offer or AggregateOffer) | ✓ (Offer only — must be > 0) |
| Pros and cons | ✓ Editorial review pages only | ✗ |
| Google Shopping panel | ✗ | ✓ |
| Price drop alerts | ✓ Single Offer only | ✓ |
| Shipping annotations | ✗ | ✓ |
| Return policy annotations | ✗ | ✓ |
| Required price > 0 | ✗ (price can be 0) | ✓ Must be > 0 |
Merchant pages can — and should — use both. Adding Merchant Listing required properties (name + offers.price + offers.priceCurrency) also qualifies the page for Product Snippet. It's a one-way relationship — not the other way around.
Frequently asked questions
Also in this series
Generate valid Product Snippet schema
Add reviews, ratings, pros/cons, and pricing — get clean JSON-LD in seconds. No account needed.