Product schema markup: example, required fields and WordPress setup
Product schema describes a single item: its name, image, price, availability and, where you have them, ratings and reviews. It is one of the few types whose rich results are still fully alive in Google, and it maps directly to the questions shoppers ask assistants: how much, in stock, rated how well.
Google splits Product markup into two experiences with different requirements. Product snippets are for any page about a product, including reviews, and need a name plus at least one of offers, aggregateRating or review. Merchant listings are for pages where the visitor can buy, and need name, image and an offers object with a price and currency. A store's product page usually qualifies for both.
JSON-LD example
Copy this into a <script type="application/ld+json"> tag and replace the values with your own.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trailhead 28L Daypack",
"image": [
"https://example.com/images/trailhead-28-front.jpg",
"https://example.com/images/trailhead-28-side.jpg"
],
"description": "A 28-liter hiking daypack with a ventilated back panel, hip belt pockets and a hydration sleeve.",
"sku": "TH28-OLV",
"gtin13": "0123456789012",
"brand": {
"@type": "Brand",
"name": "Northfold"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/products/trailhead-28",
"price": 129,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"reviewCount": 212
},
"review": [
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "Dana Ortiz"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": 5,
"bestRating": 5
},
"reviewBody": "Carried it on a 14-mile loop and my back stayed dry. The hip pockets fit a phone."
}
]
}
Properties
| Property | Status | What it is |
|---|---|---|
name | Required | The product name as shown on the page. |
image | Required | Required for merchant listings. Crawlable image URLs of the product itself. |
offers | Required | An Offer with price and priceCurrency. Required for merchant listings; one of offers, aggregateRating or review is required for product snippets. |
offers.availability | Recommended | A schema.org value such as https://schema.org/InStock or https://schema.org/OutOfStock. |
aggregateRating | Recommended | Average rating with ratingValue and reviewCount or ratingCount, based on real reviews shown on the page. |
review | Recommended | Individual reviews with author and reviewRating. |
brand | Recommended | The Brand, with a name. |
gtin / mpn / sku | Recommended | Product identifiers. A GTIN is the strongest match signal when the product has one. |
offers.shippingDetails | Recommended | Shipping cost and delivery time for merchant listings. |
offers.hasMerchantReturnPolicy | Recommended | Return window and method. Google also accepts a store-wide policy in Organization markup. |
Offers vs aggregateRating vs review
These three properties do different jobs, and mixing them up is the most common Product problem.
- offers describes what you sell it for: price, currency, availability, condition. Use it on pages where the product can be bought. For a product sold in variants at different prices, use an AggregateOffer with lowPrice and highPrice, or mark up each variant.
- aggregateRating is the summary: average score and how many ratings it is based on. It must come from reviews actually shown on the page, not from a third-party site you are quoting.
- review holds individual reviews, each with an author and a rating. An editorial review site can use a single review from its own writer.
A review blog with no checkout should not invent an Offer to look like a store. It qualifies for product snippets through review alone. See review snippet schema for the rules on ratings.
Add it in WordPress
By hand. For a handful of products you can print JSON-LD in wp_head, but price and stock change, and hand-written markup drifts out of sync fast. A mismatch between the structured price and the visible price is a frequent validation problem.
With Hydrogen SEO. Choose Product in a page's SEO Settings sheet and fill the name, description, price, currency and availability fields; smart tags (type @) can pull values such as the post title. Keep the structured price identical to the visible price. If WooCommerce or another store plugin already prints Product markup, check the page source for duplicate Product blocks and keep one.
One-off markup. The free schema generator in the Hydrogen SEO app at /seo/schema-generator builds Product JSON-LD with an offer, brand and rating from a short form. Replace the sample values with your real data, and change availability if the item is not in stock, before publishing.
Common mistakes
- Ratings with no visible reviews. aggregateRating must reflect reviews users can see on the page.
- Price mismatch. The offer price must match what the page shows, including sale prices.
- Free-text availability. Use schema.org URLs like
https://schema.org/InStock, not "Yes" or "Ships soon". - Price as a formatted string. Use
129.00with priceCurrencyUSD, not"$129". - Product markup on category pages. Google's Product features are for a page about one product, not a listing of many.
- Missing image on a store page. Merchant listings require an image.
More fixes: invalid structured data.
Test it
Check Product markup twice. Before publishing, run it through the JSON-LD checker; after, test the live page with Google's Rich Results Test and the Schema Markup Validator. The Rich Results Test reports product snippets and merchant listings as separate items, so a page can pass one and fail the other. In Search Console, the product snippet and merchant listing reports show errors across the whole catalog as Google crawls it.
Common questions
What is the difference between a product snippet and a merchant listing?
Product snippets cover any page about a product, including reviews, and need a name plus offers, aggregateRating or review. Merchant listings are for pages where the product can be bought and need name, image and an offer with price and currency.
Can I show star ratings from Google reviews or Trustpilot in Product schema?
No. aggregateRating should summarize reviews collected and shown on your own page. Ratings copied from another site are not eligible.
Do I need GTINs?
They are not required, but they are recommended when the product has one because they help Google match your product to the same item elsewhere.
Should service pages use Product schema?
Generally no. Product features are for physical or digital goods. A local service is better described with LocalBusiness or Service markup.