01Start with the essentials
Every product page needs Product markup with name, image, description, brand, and an Offer with price, priceCurrency and availability. These must match what the shopper sees on the page.
02Add identifiers
Include a GTIN (gtin13, gtin12 or gtin8), MPN or SKU. Identifiers let engines match your product to the same item on other sites and in reviews.
03Add reviews only if they're real and visible
aggregateRating and review markup must reflect reviews shown on the page. Marking up reviews that aren't visible breaks Google's guidelines and erodes trust.
04Add shipping and returns
shippingDetails and hasMerchantReturnPolicy answer the questions agents ask before they recommend or buy: what it costs to deliver and how to return it.
05Validate
Check the live page, not your template, because prices and stock come from the database at render time.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trail Runner 2 Women's Running Shoe",
"image": "https://example.com/img/trail-runner-2.jpg",
"description": "Lightweight trail shoe with a 6 mm drop and a recycled mesh upper.",
"brand": { "@type": "Brand", "name": "Example" },
"sku": "TR2-W-38",
"gtin13": "0123456789012",
"offers": {
"@type": "Offer",
"price": "129.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/trail-runner-2"
}
}Product Schema Validator
Check a live product page for the fields AI shopping assistants and Google look for, with each gap explained.
Checklist
- Product with name, image, description, brand
- Offer with price, currency and availability
- GTIN, MPN or SKU
- Ratings only from visible reviews
- Shipping and return policy
- Validated on the live page
Questions
Do variants need separate markup?+
Each variant with its own URL should have its own Offer. For variants on one page, ProductGroup with hasVariant describes them together.
Is a product feed enough?+
Feeds help with shopping platforms, but on-page markup is what crawlers and AI engines read on your own site. Use both.