offers/review/aggregateRating required medium
Either 'offers', 'review', or 'aggregateRating' Should Be Specified
Your Product markup has none of offers, review, or aggregateRating, so it can't earn a product rich result.
What you see
Either "offers", "review", or "aggregateRating" should be specified Item: Product 0 valid items detected
What’s actually happening
The Rich Results Test and Search Console's "Product snippets" report both throw this as a warning (sometimes an error, depending on the page). Your Product JSON-LD parses fine — it has a name, an image, maybe a brand — but it's missing the one thing Google needs to draw a rich card: a price, a rating, or a review. Without at least one of those three, the product is ineligible for the enhanced listing and renders as a plain blue link.
Common causes
- Product schema generated from a template that outputs name/image/description but never wires in price or availability
- Price held in JavaScript and injected after load, so it's absent from the server-rendered JSON-LD Google parses
- A digital product or service page using Product type with no offers block
- Review/rating data lives in a separate widget and was never folded into the Product object
- offers present but stripped by a validation step because price was empty or non-numeric
How to fix it
- Add an offers block — the normal fixInside the Product JSON-LD add "offers": { "@type": "Offer", "price": "49.00", "priceCurrency": "USD", "availability": "https://schema.org/InStock" } . price must be a bare number (no currency symbol, no thousands separator) and priceCurrency a 3-letter ISO code. That alone satisfies the requirement.
- If you show ratings, add aggregateRating instead of (or alongside) offers"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.6", "reviewCount": "128" } — but only if those stars are actually visible on the page. Google requires the rating to be backed by on-page content; invented numbers are a manual-action risk.
- Make sure the value is in the server HTML, not just the DOMView source (Ctrl+U) — not DevTools Elements — and confirm the price/rating is in the raw JSON-LD. If your store renders price client-side, move the schema to server-side output or your platform's structured-data setting so Googlebot sees it on first fetch.
- Re-test and request validationRun the URL through the Rich Results Test until it reports a valid Product item, then in Search Console's Product snippets report click Validate Fix. Indexing the change can take days.
Stop it recurring
Bake offers (price + availability) into your product schema template so every product page ships eligible by default.
Related errors