# “Either offers, review, or aggregateRating” on WooCommerce

Search Console flags this on WooCommerce shops when a page carries a Product schema node with no price and no rating attached. WooCommerce itself never…

Source: https://webkodingtheme.com/blog/either-offers-review-or-aggregaterating-woocommerce/

---

Operations and admin

# “Either offers, review, or aggregateRating” on WooCommerce

AÖ Arif Özelci , developer of Schema Audit Pro · Published 16 Sept 2026 · 7 min read
Search Console flags this on WooCommerce shops when a page carries a Product schema node with no price and no rating attached. WooCommerce itself never emits such a node, so the flagged markup is coming from somewhere else — usually an old theme template or a second SEO plugin. Here is how to find which, and fix it.

## What Google is checking
Either "offers", "review", or "aggregateRating" should be specified
It appears under Search Console → Shopping → Product snippets (or Merchant listings), as a critical issue with a list of URLs. The rule is simple: a Product node in structured data is only useful to Google if it says something a searcher can act on — a price, a rating or a review. A Product that only has a name is flagged, and the page loses its product rich result until it is fixed.
The important thing to know before you touch anything: WooCommerce’s own structured data cannot produce this error. Its generator checks for exactly these three fields before it writes the node, and if none is present it writes nothing. So the flagged node was put there by something else. The URLs in the report tell you what.

## If the flagged URLs are shop, category or tag pages: the theme

Old WooCommerce templates — up to version 2.6 — wrapped every product card in the shop loop with schema.org microdata: itemscope itemtype="http://schema.org/Product" on the list item, itemprop="name" on the title. WooCommerce removed that in 3.0 and moved to JSON-LD on the single product page only. Themes that copied the loop templates into their own folder still ship the old markup, so every card on a category page is a Product with a name and nothing else, and Google flags the category page once per card.
Check: view the source of a category page and search for itemtype. Any Product there is the fault. Then open WooCommerce → Status → System status and scroll to Templates; a theme carrying outdated copies is listed there with the file names and versions.
Fix: update the theme, or if it is no longer maintained, delete the overrides from the theme’s woocommerce/ folder so WooCommerce’s own templates take over. If a child theme needs the override for layout, keep the file and remove only the itemscope, itemtype and itemprop attributes. Nothing on the page depends on them.

## If the flagged URLs are single product pages: two Product nodes

A product page with the error almost always has two Product nodes: WooCommerce’s, complete with offers, and a second one from an SEO plugin, a theme’s schema feature or a page builder, with the name and image but no price. Google does not merge them. It reads the incomplete one, flags it, and treats the pair as unreliable.
Check: run the URL through Google’s Rich Results Test and count the Product items it detects. Two is the problem. Expand each to see which lacks offers; its position in the source tells you which plugin wrote it.
Fix: keep one. The SEO plugin’s Product schema is usually a switch (Yoast SEO → Schema, Rank Math → Schema settings, or the theme’s own SEO panel). Turn the duplicate off and let WooCommerce’s node stand, because WooCommerce’s is the one that knows the real price, stock status and sale end date. If you would rather keep the plugin’s node, remove WooCommerce’s instead: add_action( &#x27;init&#x27;, function () {
remove_action(
&#x27;woocommerce_single_product_summary&#x27;,
array( WC()->structured_data, &#x27;generate_product_data&#x27; ),
60
);
} );

## A product with no price has no offer

WooCommerce writes offers only when the product has a price. Leave the price field blank — a catalogue-only product, a “call for price” plugin that empties it, a variable product whose variations all lack prices — and WooCommerce’s node has no offers, no rating unless someone reviewed it, and is therefore not written at all. That is not this error; that is silence. But a second schema source on the same page that copies the name and skips the missing price produces exactly this error, so priceless products are where the duplicate-node problem shows up first.
If a product is genuinely not for sale online, it should not carry Product schema anywhere. Set the SEO plugin to skip it, or noindex the page.

## The opposite failure: no Product node at all

Fixing the error by turning off the duplicate can reveal a second problem that Search Console never reports: on a block theme, WooCommerce’s own Product node is missing too. Its generator runs on the woocommerce_single_product_summary hook, and the block-based Single Product template runs only a fixed list of callbacks on that hook — title, price, rating, excerpt, add-to-cart, meta, sharing. The structured-data generator is not on the list. The page ends up with a BreadcrumbList and nothing about the product.
Search Console shows this as a product that simply stopped having rich results, with no error to click. The way to see it is to check the page directly. Paste the product URL into our free schema checker and look for a Product with offers; if only breadcrumbs come back, the node is missing.

The free audit plugin puts the Product node back $ 49 once. Webkoding Product Schema and Crawl Audit, on wordpress.org, emits WooCommerce’s Product node when the theme’s template did not, never a second one when it did, and reports which products still lack GTIN, brand and condition. Pro fixes those fields in bulk and shows which crawlers fetched the result. Open the demo →

## The checklist

- Search Console: are the flagged URLs archives or single products?
- Archives: search page source for itemtype; check WooCommerce → Status → Templates for outdated overrides.
- Single products: Rich Results Test, count Product items, keep one.
- Blank prices: no offers, no node — and a duplicate source will be flagged on those first.
- After fixing, check a product page for a Product node with offers; on block themes it may be missing entirely.
- Validate the fix in Search Console with the issue’s Validate button; it takes days, and it only starts when you press it.

AÖ
Arif Özelci Builds the WebKoding plugins. Answers support himself.
Share on X LinkedIn Copy link
In this article What Google is checking If the flagged URLs are shop, category or tag pages: the theme If the flagged URLs are single product pages: two Product nodes A product with no price has no offer The opposite failure: no Product node at all The checklist
Related “Out of stock and unavailable” but the stock is there Your WooCommerce webhook is not firing. Here is the order to check things in.
The product this is about: Schema Audit Pro , $ 49 . Live demo, no signup.
