Product schema turns product listings in search results from plain text links into rich, clickable cards with price, availability, review stars, and shipping info. On competitive SERPs, this is the difference between being noticed and being ignored.
For a product page to qualify for rich results, it needs:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Product Name",
"image": "https://example.com/product.jpg",
"description": "...",
"sku": "PROD-123",
"brand": {
"@type": "Brand",
"name": "Brand Name"
},
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "99.00",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31",
"url": "https://example.com/product-page"
}
}
Triggers star rating display:
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "127",
"bestRating": "5",
"worstRating": "1"
}
Individual reviews (in addition to aggregateRating):
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "Sarah M." },
"datePublished": "2026-04-15",
"reviewBody": "...",
"reviewRating": { "@type": "Rating", "ratingValue": "5" }
}]
gtin / gtin13. Global Trade Item Number (UPC, EAN)mpn. Manufacturer Part Numberisbn, for booksAt least one of GTIN, MPN, or brand is required. Having all increases Merchant Center trust.
Rich results increasingly include shipping details + return policies:
"offers": {
...
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": { "@type": "MonetaryAmount", "value": "0", "currency": "USD" },
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"businessDays": { "@type": "OpeningHoursSpecification", "dayOfWeek": [...] },
"transitTime": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "DAY" }
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
}
InStockOutOfStockPreOrderBackOrderDiscontinuedLimitedAvailabilityMatch what's actually true. Out-of-stock pages should say so in schema, not claim InStock.
"offers": {
"@type": "AggregateOffer",
"offerCount": "4",
"lowPrice": "89.00",
"highPrice": "129.00",
"priceCurrency": "USD",
"offers": [
{ "@type": "Offer", "seller": { "@type": "Organization", "name": "..." }, "price": "89.00" },
...
]
}
If you run paid shopping ads, Google Merchant Center consumes the same schema. Consistent, complete product schema improves both organic rich results AND paid shopping campaign quality scores. Double ROI.