Either 'offers', 'review', or 'aggregateRating' should be specified

Last updated:

Summary
  • Google requires at least one of offers, review, or aggregateRating on Product markup to qualify for rich results
  • Most common cause: using Product schema on informational or catalog pages that do not sell, review, or rate a product
  • Fix: add one of the three properties, or switch to a different schema type if the page is not a product page
  • This is a Google-specific requirement, not a schema.org rule

The Google Rich Results Test shows this error when a Product type is missing all three commerce and review signals. Google requires at least one of offers, review, or aggregateRating to generate a Product rich result. Without any of them, the markup has no actionable data for search results.

What This Error Means

Google’s Product rich results display prices, availability, ratings, and review counts alongside search listings. To show any of this, Google needs at least one of these properties:

  • offers - pricing and availability information
  • review - an individual review with a rating
  • aggregateRating - a summary of multiple ratings (average score, review count)

If none are present, Google cannot generate a useful rich result and flags the markup as incomplete. This is a Google requirement for rich result eligibility. The schema.org specification itself does not mandate these properties.

Common Causes

Using Product markup on informational pages. This is the most common cause. A page that describes a product category, compares products, or lists features without pricing or reviews should not use Product schema at all.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Running Shoes",
  "description": "Everything you need to know about running shoes",
  "brand": {
    "@type": "Brand",
    "name": "Various"
  }
}

This describes a product category, not a specific product for sale. Google flags it because there are no offers or reviews.

Product pages before pricing is set. Draft product pages or pre-launch pages sometimes have structured data added before the price is finalized. The markup ships without offers.

CMS templates that skip conditional fields. A template might output Product JSON-LD for every product, but only include offers when a price exists in the database. Products with missing prices get markup with no commerce data.

How to Fix It

Option 1: Add offers

The most common fix. If the page sells a product, add an offers property with price and availability.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "TrailCo Speedrunner 3000",
  "description": "A lightweight running shoe for trail use",
  "brand": {
    "@type": "Brand",
    "name": "TrailCo"
  },
  "offers": {
    "@type": "Offer",
    "price": 129.99,
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "url": "https://example.com/products/speedrunner-3000"
  }
}

Option 2: Add review

If the page features a single review of the product, add a review property.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "TrailCo Speedrunner 3000",
  "review": {
    "@type": "Review",
    "reviewRating": {
      "@type": "Rating",
      "ratingValue": 4,
      "bestRating": 5
    },
    "author": {
      "@type": "Person",
      "name": "Alex Chen"
    },
    "reviewBody": "Great traction on muddy trails. Runs a half size small."
  }
}

Option 3: Add aggregateRating

If the page displays a summary of user ratings, add aggregateRating.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "TrailCo Speedrunner 3000",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.3,
    "reviewCount": 89,
    "bestRating": 5
  }
}

Option 4: Use a different schema type

If the page is not about a specific, purchasable product, do not use Product. Consider these alternatives:

  • Category pages listing multiple products: use ItemList with individual Product entries, or use CollectionPage.
  • Informational articles about products: use Article or TechArticle.
  • Comparison pages: use Article with the comparison as the subject.

Prevention

  • Only use Product schema on pages where a specific product is offered for sale, reviewed, or rated by users.
  • In CMS templates, wrap the entire Product JSON-LD block in a conditional that checks for the presence of at least one commerce signal. If none exist, either skip the structured data or output a different type.
  • Test new product templates with the Rich Results Test before deploying to production.
  • Review the Product schema reference for the full list of required and recommended properties.