sfw/fix
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

  1. 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.
  2. 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.
  3. 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.
  4. 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