- Add Product JSON-LD schema to every product page for rich result eligibility
- Required for rich results: name, image, description, and offers (with price and priceCurrency)
- Include aggregateRating for star ratings in search results
- Prices in schema must match the prices displayed on the page
Rule Details
Product schema markup enables Google to display rich results for your product pages, showing price, availability, ratings, and images directly in search results. Google's product structured data guide (opens in new tab) and valid JSON-LD need to line up for those rich results to work reliably.
Code Examples
<!-- ✅ Good: Complete Product schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Cast Iron Dutch Oven 5.5 Qt",
"image": [
"https://example.com/images/dutch-oven-front.jpg",
"https://example.com/images/dutch-oven-top.jpg"
],
"description": "Pre-seasoned cast iron Dutch oven with enamel coating. Perfect for sourdough baking and slow cooking.",
"sku": "DO-55-BLK",
"mpn": "DO550BK",
"brand": {
"@type": "Brand",
"name": "BakeCo"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/products/dutch-oven",
"priceCurrency": "USD",
"price": 49.99,
"priceValidUntil": "2026-12-31",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": 0,
"currency": "USD"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 3,
"maxValue": 5,
"unitCode": "DAY"
}
}
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.7,
"reviewCount": 283
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": 5
},
"author": {
"@type": "Person",
"name": "Jane Smith"
},
"reviewBody": "Excellent Dutch oven — my sourdough has improved dramatically."
}
]
}
</script><!-- ❌ Bad: Missing offers, no image array -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Dutch Oven"
}
</script>Why It Matters
Product schema enables Google to show price, availability, ratings, and review count directly in search results. The vocabulary itself comes from Schema.org Product (opens in new tab), but the page still needs matching visible product data and pricing.
Rich Results Eligibility
Google can show the following for products with valid schema:
- Price and currency
- Availability (In Stock / Out of Stock)
- Star ratings and review count
- Product images in image search
- Merchant listing experiences in Google Shopping
Required Properties (for Rich Results)
| Property | Type | Example |
|---|---|---|
name | Text | "Cast Iron Dutch Oven 5.5 Qt" |
image | URL or Array | ["https://example.com/oven.jpg"] |
description | Text | Product description |
offers | Offer | Price and availability object |
offers.price | Number | 49.99 |
offers.priceCurrency | Text | "USD" |
offers.availability | URL | "https://schema.org/InStock" |
Availability Values
https://schema.org/InStock
https://schema.org/OutOfStock
https://schema.org/PreOrder
https://schema.org/BackOrder
https://schema.org/DiscontinuedNext.js Implementation
// app/products/[slug]/page.tsx
export default async function ProductPage({ params }) {
const product = await getProduct(params.slug)
const schema = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
image: product.images,
description: product.description,
offers: {
'@type': 'Offer',
price: product.price,
priceCurrency: 'USD',
availability: product.inStock
? 'https://schema.org/InStock'
: 'https://schema.org/OutOfStock',
},
}
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
{/* product page content */}
</>
)
}Critical Rules
- Prices in schema must exactly match visible page prices
- Don't fake review counts or ratings
- Update
priceValidUntilwhen running time-limited promotions - Use
AggregateRatingonly if you actually have user reviews
Google's Product rich result guidelines require that prices in structured data match the price visible on the page. Discrepancies can result in a manual action or loss of rich result eligibility.
Exceptions
- Only add or enforce schema types that the page can truthfully support; irrelevant structured data is worse than no structured data.
- A technically valid schema block can still be misleading if the page content does not visibly back it up; audit rendered content and schema together.
- If indexability, canonical-url, or main content quality is wrong, fix that foundation before optimizing schema details.
Standards
- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.
- Check the implementation against Google Search Central: Product structured data before treating the rule as satisfied.
- Check the implementation against Schema.org: Product before treating the rule as satisfied.
Verification
Automated Checks
- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.
- Test the affected URL with Google Search Console or equivalent tooling where relevant.
- Re-crawl a representative page set after deployment.
Manual Checks
- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.
Use with AI
Copy these prompts to use with your AI assistant, or install the MCP server to use directly from Claude, Cursor, or Windsurf.
Check
Verify implementation
Check each product page for a JSON-LD script block with @type 'Product'. Verify it includes: name, image, description, and an offers property with price, priceCurrency, and availability. Check that prices in schema match the visible page prices. Validate with Google's Rich Results Test.
Fix
Auto-fix issues
Add a Product JSON-LD block to each product page. Required: name, image (array of URLs), description, offers.price, offers.priceCurrency, offers.availability. Recommended: aggregateRating (ratingValue, reviewCount), brand, sku, gtin13/gtin8/mpn.
Explain
Learn more
Product structured data enables Google Shopping-style rich results in organic search, showing price, star ratings, and stock status directly in the SERP. These rich results have higher visual prominence and click-through rates. Without schema, Google can only show a plain blue link for your product pages.
Review
Code review
Find JSON-LD blocks with @type 'Product'. Verify required fields: name, image (must be absolute URL array), description, offers.price (numeric), offers.priceCurrency (ISO 4217 code), offers.availability (schema.org URL). Check that offers.price matches the visible price on the page. Validate that aggregateRating.reviewCount > 0 if rating is present. Run through Google's Rich Results Test.
