Either “offers”, “review”, or “aggregateRating” should be specified
Where you see it: Search Console → Shopping → Product snippets, and the Rich Results Test
Google found Product structured data on this page that names a product but gives none of the three things a product snippet is built from: a price (offers), a written review, or a star rating (aggregateRating). It needs at least one, so the item is invalid and can’t show price or stars in search. This is a rich result error, not a Page indexing status.
Fix it on real product pages; remove the markup everywhere else.
Look at the listed URLs. A WooCommerce product with a price already carries an offer, so a second, emptier Product is coming from elsewhere. A product with no price and no reviews has nothing to mark up yet. A post or category page that doesn’t sell or rate one product shouldn’t carry Product markup.
Check the URL Search Console listed
This tool builds markup rather than testing it, which makes the rule easy to see. Enter the product as your page shows it: the offers and aggregateRating blocks appear in the JSON-LD only when their values would be valid. Compare it with what your page prints; don’t paste it onto a WooCommerce product.
Your own product identifier.
UPC, EAN or ISBN. Leave blank if you have none.
Manufacturer part number.
One image URL per line.
Numbers only, no currency symbol.
Three-letter ISO code, e.g. USD, GBP, EUR.
Optional. Useful for sale pricing with an end date.
Between 0 and 5.
Leave both rating fields blank if you have no reviews.
Only mark up ratings that are genuinely on the page and visible to visitors. Review markup for ratings a user cannot see is a manual action risk, not a shortcut to stars.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Merino Wool Crew Sock",
"description": "Mid-weight merino crew sock with a reinforced heel and toe.",
"image": [
"https://example.com/images/merino-sock.jpg"
],
"sku": "NF-SOCK-001",
"brand": {
"@type": "Brand",
"name": "Northfell"
},
"offers": {
"@type": "Offer",
"price": "24.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"url": "https://example.com/product/merino-sock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"reviewCount": 112
}
}
</script>Reading the result
- An offers block appears once Price holds a number and a currency is given; the currency should be a three-letter code such as USD. One valid offer is enough to clear this error.
- No offers block after you typed a price: a currency symbol, a thousands separator or a comma decimal made it unreadable. An empty price in WooCommerce leaves its markup without an offer in the same way.
- No aggregateRating block: it needs a rating above 0 and no higher than 5 plus at least one review. A product nobody has rated has no rating to mark up.
- Output with neither block: that is the item Google is flagging, a name and a description with nothing a product snippet can show.
The same tool with its full guide: Product Schema
Why it happens on WordPress
WooCommerce builds its markup from the product’s own data: a price becomes an offer, rated reviews become aggregateRating and review. The error appears when a product has none of those, or something else prints a Product.
Products with no price
A product saved with an empty Regular price, a discontinued item whose price was cleared, or a variable product whose variations never got prices has nothing for offers.
Catalog and quote-only stores
Stores that sell on enquiry often remove or hide prices with a catalog-mode or request-a-quote plugin. An empty price means no offer. A price hidden on screen but left in the markup is a different problem, since markup should describe what visitors see.
Reviews switched off, or none yet
Ratings come from WooCommerce → Settings → Products, where Enable product reviews and the star rating option live. With reviews off, or on but empty, a product without a price falls back to nothing.
Product markup on category and shop pages
Google supports product rich results only on pages about one product. Some SEO plugin settings print Product markup on product category archives, which have no single price or rating to give. Rank Math has a Remove Snippet Data option for product categories for this case.
Review boxes and schema blocks on posts
A review plugin’s rating box, a page builder’s product widget, or a Product added by hand in Rank Math’s Schema tab or SEOPress PRO can put a Product on a blog post or landing page. Leave its price and rating fields empty and the item has none of the three.
A second, thinner Product on the same page
A theme, a schema plugin or an SEO add-on can print its own Product beside WooCommerce’s, sometimes with only a name, an image and a description. Google reports each item separately, so the thin one fails while WooCommerce’s passes.
How to fix it
Work out which plugin printed the failing item before you change a single product. One template or setting usually covers the whole list.
1. Test one listed URL
Open the error in the Product snippets report, pick an example URL and run it through the Rich Results Test. Count the Product items and open the invalid one: its properties, and the page source around it, point to the plugin that printed it.
2. Give products you sell a price
In Products → All Products, edit the product and fill in Regular price on the General tab, or on each variation of a variable product. WooCommerce’s markup gains an offer with that price and the stock status.
3. Switch on reviews if you collect them
Go to WooCommerce → Settings → Products and tick Enable product reviews and Enable star rating on reviews. When customers leave rated reviews, the rating appears in the markup. Never add ratings customers didn’t give.
4. Stop Product markup where nothing is sold or rated
Turn it off at the source:
- Rank Math: Rank Math SEO → Titles & Meta → Product Categories, enable Remove Snippet Data, then clear your cache.
- A Product added in Rank Math’s or SEOPress PRO’s schema settings on a post: delete it, or fill in the review and rating the post shows.
- Review box and product widget plugins: fill in the rating, or turn off the box’s schema output if the plugin offers that.
5. Remove the duplicate Product
If one product shows two Product items, keep WooCommerce’s, which follows price and stock, and switch off the other in the theme or plugin that adds it.
6. Accept the gap for products with nothing to show
A product with no price and no reviews can’t earn a product snippet. Leaving the error costs a rich result it couldn’t show anyway; give it a price, wait for reviews, or drop its markup.
Product snippets or merchant listings?
Search Console has two product reports under Shopping. This error is reported in Product snippets. Merchant listings covers pages where shoppers can buy, and has requirements of its own.
| Report | Which pages | What a valid item needs | Shows this error? |
|---|---|---|---|
| Product snippets | Any page about one product, including reviews | A name, plus offers, review or aggregateRating | Yes |
| Merchant listings | Pages where shoppers can buy from you | An offer with a price and priceCurrency, among others | No; it reports its own required fields |
Check the fix in Search Console
Fix one template or setting, prove it on a live URL, then ask Search Console to recheck the group.
- Run the fixed URL through the Rich Results Test. The Product snippets item should be valid, or gone if you removed the markup.
- If every listed item is now fixed or its markup removed, open this error in Search Console → Shopping → Product snippets and click Validate fix. Its help says validation can take two weeks or more, depending on how often your pages are crawled.
- Validation fails as soon as Google rechecks a page that still has the error. Products you are leaving without a price or reviews will trip it, so skip validation while they remain.
Fixed pages, and pages you stopped marking up, leave the count as Google recrawls them, validation or not.
Can RankHive fix this?
No, in almost every case. The failing item comes from WooCommerce or another plugin, and RankHive can’t edit WooCommerce products or other plugins’ markup. The exception is a post or page where RankHive’s own JSON-LD block is the Product Google flagged.
What it writes, once you approve
- A corrected RankHive JSON-LD block on a post or page when that block is the failing Product: the price or rating the page shows, or a better-fitting type.
What it can’t do here
- Edit WooCommerce products: prices, variations, reviews or their markup.
- Change schema printed by Yoast SEO, Rank Math, SEOPress, a review plugin, a page builder or your theme.
- Add JSON-LD to WooCommerce product pages.
- Invent reviews or ratings, or click Validate fix in Search Console.
Every change is drafted next to the current value and waits for your approval. Each one written is logged in the Change Log, with Revert.
Check the rest of your site while you’re here
The free site check reads your public pages for titles, meta descriptions, headings, canonical tags and schema, and shows what needs fixing. If you sign up, RankHive reads your Google Search Console data every week, drafts the fixes, and writes the ones you approve to WordPress. Nothing changes on your site until you say yes.
Common questions
Do I need all three: offers, review and aggregateRating?
No. One is enough for a product snippet. The Rich Results Test may still warn about the others, but warnings don’t stop the result the way this error does.
Does this error keep my product out of Google?
No, only out of the rich result. As a critical issue, it stops the item showing price, stock or stars; the page can still appear as an ordinary result.
Why is a blog post or category page in the list?
Something marked it up as a Product: a review box, a schema block, a widget or a category setting. Product rich results are only for pages about a single product.
Can I add a rating to make the error go away?
Not one nobody gave. Ratings in markup must come from reviews visitors can see on the page; anything else is structured data spam and can lead to a manual action.
Sources
Checked against these pages on .
- Google Search Central: Product snippet structured data
- Google Search Central: Intro to Product structured data
- Google Search Central: Merchant listing structured data
- Google Search Console Help: Shopping reports and tools
- Google Search Console Help: Rich result report overview
- WooCommerce: Product reviews
- Rank Math: Either offers, review or aggregateRating should be specified