
Product
- 1 installs
- 73.4k repo stars
- Updated June 18, 2026
- thedaviddias/front-end-checklist
Adds Product JSON-LD schema with name, image, offers, and aggregateRating to product pages so price, availability, and stars show in search.
About
Audits e-commerce product pages for Product schema that enables rich results with price, availability, and ratings in search. A developer uses it when implementing structured data for a shop.
- Requires name, image, description, and offers with price
- Schema prices must match displayed prices
Product by the numbers
- 1 all-time installs (skills.sh)
- Ranked #1,710 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/thedaviddias/front-end-checklist --skill productAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 73.4k |
| Last updated | June 18, 2026 |
| Repository | thedaviddias/front-end-checklist ↗ |
What it does
Adds Product JSON-LD schema with name, image, offers, and aggregateRating to product pages so price, availability, and stars show in search.
Files
Add Product schema markup
Product schema enables Google to show price, availability, ratings, and review count directly in search results—rich results have significantly higher click-through rates than standard blue links.
Quick Reference
- 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
Check
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
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
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.
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.
---
For full implementation details, code examples, and framework-specific guidance, see references/rule.md.
Rule page: https://frontendchecklist.io/en/rules/seo/product
Add Product schema markup
Validates Product schema for e-commerce
Priority: medium · Difficulty: intermediate · Time: 20 min
--- 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 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, 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
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.