Schema guide
Product schema markup (Product JSON-LD)
How to write Product JSON-LD: name, image, offers, brand and ratings, with a working example and the mistakes that stop products qualifying.
Overview
Product markup describes one product (name, image, price, availability and brand) so search engines can show price and stock details. Use it only on a page about a single product, with values that match what the page shows. An offers object needs a price and a priceCurrency.
What it can do for you
- Google Rich results: yes
- Yes. Price, availability and ratings can appear in results when the page shows an image, a price and a currency.
- AI and answer engines
- Price, stock and brand are read as stated facts instead of being pulled out of the page text.
Use it when
- A product detail page where visitors can see the product, its price and how to buy it
Skip it when
- A category or listing page with many products
- A page that only reviews or compares products (use
Review)
Properties
| Property | Status | Notes |
|---|---|---|
name | Required | The product name as shown on the page. |
image | Strongly recommended | Absolute URLs that search engines can crawl. Several angles help. |
offers | Required for price | An Offer with price, priceCurrency, availability and url. |
brand, sku | Recommended | Use gtin or mpn as well if you have them. |
aggregateRating, review | Optional | Only with real, visible customer ratings. |
Example
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Stoneware Mug, 350 ml",
"image": [
"https://example.com/img/mug.jpg"
],
"description": "Hand-glazed stoneware mug, dishwasher safe.",
"sku": "MUG-350-GRN",
"brand": {
"@type": "Brand",
"name": "Hearthstead"
},
"offers": {
"@type": "Offer",
"price": "24.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/mug"
}
}
</script>It reads the product name from the main heading, the image from og:image, and the price, currency, availability, SKU and brand from product meta tags or microdata.
Anything it cannot find is left out and listed under "Check before you publish", with a field to fill it in. It will not invent a price or a rating.
Common mistakes
- A price in the markup that differs from the price on the page.
- Leaving out
priceCurrency, or writing the symbol instead of the ISO code such asUSD. - Relative image paths such as
/img/mug.jpg. Use full URLs. - Adding ratings that are not shown to visitors.
- Putting Product markup on every tile of a listing page.
Questions
Which properties does Product markup require?
Google needs a name plus either an offers object, a review or an aggregateRating for product snippets. For merchant listings it also needs an image and an offer with price and priceCurrency.
Can I mark up a category page?
No. Product markup is for a page about one product. A category or listing page should not carry a Product block for each item.
Should I add ratings to get stars?
Only if real ratings from real customers are visible on the page. Invented or copied ratings can lead to a manual action.
Why does Schema Forge leave out the price sometimes?
It only uses a price the page states explicitly, in a product:price:amount meta tag or an itemprop="price" element. It never guesses a price from body text, so a missing offer is listed as a task for you.
Generate this markup for your page
Paste the address of a public page and get a ready-to-paste block, with every gap listed.