Structured data for products: rich results explained
Price, stock and rating in search results come from product structured data. What it must contain, how to check it, and where stores go wrong.
The short answer
When a search result shows a product’s price, whether it is in stock and its star rating directly in the listing, that information came from structured data on the product page: a machine-readable block describing the product in a standard vocabulary. Search engines read it to build rich results; AI systems read it to answer questions about your products accurately. It must match what the visible page says, it must be complete enough to qualify, and it must not be duplicated or contradicted by blocks that apps inject. Themes generate a starting version. Almost every store has something to fix in it, and the check takes ten minutes.
What the block should contain
| Field | Why | Common problem |
|---|---|---|
| Name, description, image | Identifies the product | Image missing or a tiny thumbnail |
| Brand | Trust and matching | Absent |
| Identifiers: SKU, GTIN or MPN | Matches your product to the same product elsewhere | Absent, or a placeholder |
| Offer: price, currency, availability, URL | The rich result itself | Price out of sync with the page; availability always “in stock” |
| Variants | Sizes and colours as separate offers or a group | One variant’s data shown for all |
| Rating and review count | Stars in the listing | Injected by an app as a second block that conflicts with the theme’s |
| Shipping details | Cost and delivery time shown in results | Absent |
| Return policy | Shown in results in some regions | Absent |
Checking and fixing it
- Open a product page in the search engine’s rich results testing tool and read what it found.
- Compare with the visible page: price, availability, rating must match exactly.
- Look for duplicates: two product blocks, one from the theme and one from a review or upsell app, is the most common fault.
- Fill the gaps: identifiers, brand, shipping, returns, from the store’s settings and product data.
- Handle variants so each has its own price and availability.
- Recheck after every app install or theme update, because both change the output.
- Watch the search console for product enhancement reports and errors.
On a headless storefront
When the storefront is built separately from the commerce platform, the structured data is generated by the storefront from the same product data that renders the page, which is the cleanest possible arrangement: one source, no app injecting a conflicting block, every field controllable. It is one of the quieter advantages of building the storefront yourself.
What this means for you
Product structured data is how your prices, stock and ratings reach search listings and AI answers. Make it complete, consistent with the page, free of duplicates and generated from the same source as the visible product. Validate once per template and after every app change. It is a small, mechanical task with a visible effect on the listings your customers see before they ever reach your store.
Frequently asked questions
Our theme already adds structured data. Is that enough?
Often it is a start with gaps: missing identifiers, no shipping or return details, ratings from an app injected as a second conflicting block, variants mishandled. Validate a product page with the search engine's testing tool and read what is present, what is missing and what is duplicated. Ten minutes of this usually turns up something worth fixing.
Do rich results actually change sales?
A listing showing price, in-stock status and a rating stands out against plain listings and pre-qualifies the click: the visitor already knows the price and availability. Measured effects vary by category, but the click-through improvement is consistent enough that the effort is justified, and the same data feeds AI answers about your products.
What about collection and category pages?
Product structured data belongs on product pages. Collection pages can carry list markup and breadcrumbs, and the store itself carries organisation markup. Putting full product data on a collection page for every product is discouraged and usually counterproductive; keep each type where it belongs.
Sources
- Google Search Central: Product structured data (accessed 2026-09-12)
- Schema.org: Product (accessed 2026-09-12)