Why You Are Here
Product is among the highest-value structured data types available, because the information it surfaces is exactly what someone deciding whether to click is looking for: the price, whether it is in stock, and what other buyers thought of it.
A product result carrying a price, a star rating, and an availability status competes very differently from a plain blue link sitting next to it. On commercial queries where every result is a shop, the ones showing that detail have a visible advantage.
The first situation is an ecommerce store whose platform is not outputting complete structured data, or is outputting it with gaps that keep the pages ineligible.
The second is fixing eligibility. Your product pages are marked up but showing no enhancement, and you need to identify what is missing.
The third is a review site, comparison site, or editorial product page, where the requirements are genuinely different from a shop's, and where using the wrong markup means either missing eligibility or claiming something the page cannot support.
What This Tool Does
The Product Schema Generator builds valid Product JSON-LD from a simple form.
Enter the product name, image, description, brand, price, currency, availability, and any ratings or identifiers, and the tool assembles correctly structured JSON-LD with the Offer object nested properly and the script tag included. Copy it and paste it into your page.
First Decide Which Experience You Are Targeting
This is the most important decision on the page, and most guides skip it entirely. Google treats Product structured data as two separate experiences with different requirements and separate reporting.
| Merchant listing | Product Snippet | |
|
Page type |
Customers can buy the product from you |
Product information, but not the purchase point |
|
Typical site |
Online shop, direct-to-consumer brand |
Review site, comparison site, aggregator, blog |
|
image |
REQUIRED |
Not required |
|
offers |
Required with price and currency |
One of offers, review, or aggregateRating |
|
Extra properties |
Shipping, returns, apparel sizing, energy ratings |
Pros and cons for editorial reviews |
|
Search Console report |
Merchant listings |
Product snippets |
|
Surfaces unlocked |
Shopping Knowledge panel, Popular Products, Google Images, Google Lens |
Standard product snippet in results |
Only pages where a customer can actually complete a purchase from you qualify for merchant listing experiences. A page that lists a product and links out to other retailers selling it does not qualify, regardless of how complete the markup is.
If you sell direct, aim for merchant listing requirements. Meeting them generally makes the page eligible for product snippets as well, so you get both from one implementation. Aiming only at product snippet requirements leaves the richer experience out of reach.
Property Reference
| Property | Merchant listing | Product snippet | Notes |
|
name |
Required |
Required |
The product title |
|
image |
REQUIRED |
Recommended |
High resolution, multiple aspect ratios |
|
offers |
Required |
One of three |
Contains price and availability |
|
offers.price |
Required |
— |
Number only, no currency symbol |
|
offers.priceCurrency |
Required |
— |
ISO 4217 code such as GBP, USD |
|
offers.availability |
Recommended |
— |
Schema.org URL value |
|
offers.priceValidUntil |
Recommended |
— |
ISO 8601 date |
|
aggregateRating |
Recommended |
One of three |
Genuine reviews only |
|
review |
Recommended |
One of three |
Individual reviews |
|
brand |
Recommended |
Recommended |
Brand object |
|
description |
Recommended |
Recommended |
Product summary |
|
sku |
Recommended |
Optional |
Your internal identifier |
|
gtin |
Recommended |
Optional |
GTIN, UPC, EAN, or ISBN |
|
mpn |
Recommended |
Optional |
Manufacturer part number |
|
shippingDetails |
Recommended |
— |
Unlocks shipping info in results |
|
hasMerchantReturnPolicy |
Recommended |
— |
Unlocks return window in results |
They surface delivery cost, delivery time, and the returns window directly in the search result. When a shopper is comparing several near-identical listings, free delivery and a thirty-day returns window shown in the result itself is often what decides the click.
Availability Values
availability takes a Schema.org URL rather than a plain word, which is a common source of errors.
| Status | Value |
|
In stock |
https://schema.org/InStock |
|
Out of stock |
https://schema.org/OutOfStock |
|
Pre-order |
https://schema.org/PreOrder |
|
Back-order |
https://schema.org/BackOrder |
|
Discontinued |
https://schema.org/Discontinued |
|
Limited availability |
https://schema.org/LimitedAvailability |
|
Sold out |
https://schema.org/SoldOut |
Example Output
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Merino Wool Crew Neck Jumper",
"image": [
"https://example.com/images/jumper-1x1.jpg",
"https://example.com/images/jumper-4x3.jpg",
"https://example.com/images/jumper-16x9.jpg"
],
"description": "A lightweight merino wool jumper, crew neck cut.",
"sku": "JMP-MER-NVY-M",
"mpn": "884729103",
"gtin13": "5012345678900",
"brand": { "@type": "Brand", "name": "Example Clothing" },
"offers": {
"@type": "Offer",
"url": "https://example.com/products/merino-crew-jumper",
"price": "89.00",
"priceCurrency": "GBP",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "0",
"currency": "GBP"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "GB"
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "GB",
"returnPolicyCategory":
"https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "214"
}
}
Product Variants
If you sell the same product in several sizes or colours, ProductGroup describes the family and hasVariant links the individual products.
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "Merino Wool Crew Neck Jumper",
"productGroupID": "JMP-MER",
"variesBy": [
"https://schema.org/size",
"https://schema.org/color"
],
"hasVariant": [
{
"@type": "Product",
"sku": "JMP-MER-NVY-M",
"color": "Navy",
"size": "M",
"offers": {
"@type": "Offer",
"price": "89.00",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock"
}
}
]
}
Reviews — What Is and Is Not Allowed
Star ratings are the most visually valuable part of a product result, and the rules around them are stricter than most people realise.
• Genuine customer reviews of the product, displayed on the product page and marked up with review or aggregateRating
• Independent editorial reviews of a product on a review site
• Third-party review platform data, provided the reviews are real and visible on the page
• Reviews about your business or organisation placed on your own site. Google closed this in a 2019 policy update and has reinforced it since
• Ratings not left by actual users, which Google states may result in a manual action
• Marking up a selection of favourable reviews while the page displays more
Customers rating a jumper you sell is legitimate. Your site displaying its own five-star rating for itself is not. Embedding a review widget about your own brand on your own pages will not produce stars.
Common Mistakes to Avoid
A price written with a currency symbol is invalid. The price property takes a number only, and the currency belongs in priceCurrency as an ISO 4217 code. Thousand separators cause the same problem, so 1,299.00 should be written 1299.00. This is the single most common Product markup error and it makes the offer unparseable rather than merely imperfect.
Merchant listing experiences require that a customer can actually buy the product from you on that page. An affiliate page, comparison table, or review that links out to other retailers does not qualify, however complete its markup. Marking such a page as though it does misrepresents it, and the eligibility will not follow. Use product snippet markup for those pages instead, where review-specific properties are available.
priceValidUntil tells Google how long the price holds. Once that date passes, Google may treat the price as stale and stop displaying it, which quietly removes the most valuable element of the result. If you set the property, it needs to be maintained. If your prices change unpredictably, either automate the date or leave the property out rather than letting it go out of date.
Quick Reference
| Item | Detail |
|
Type |
Product |
|
Rich result |
Fully supported |
|
Two experiences |
Merchant listing, product snippet |
|
Merchant listing |
Buyable pages only |
|
Product snippet |
Review and comparison pages |
|
image |
Required for merchant listings |
|
Price |
Number only, no symbol |
|
Currency |
ISO 4217 in priceCurrency |
|
Availability |
Full Schema.org URL |
|
Variants |
ProductGroup with hasVariant |
|
Shipping and returns |
Surface in results |
|
Self-reviews about your business |
Not eligible |
|
Merchant Center account |
Not required |
