The symptom
- Google’s Rich Results Test on a product URL finds no *Product snippets* / *Merchant listings*.
- Products show plain blue links in Google — no price, rating or stock in the result.
- AI assistants describe competitors’ products with prices but only mention your store name, if at all.
Why it matters
Product schema (JSON-LD with @type: Product and an Offer) is the machine-readable summary of a product: name, image, price, currency, availability, GTIN, brand, rating. Google uses it for Shopping and merchant listings; AI assistants use it to decide whether a product answers the question and can be trusted.
WooCommerce core emits basic Product schema, but it is often removed or broken by: a theme that disables wp_footer hooks, an SEO plugin set to output its own schema while another plugin also does (duplicates → invalid), page builders rendering products as generic pages, or "disable schema" toggles in performance plugins.
How to check it yourself
- Paste a product URL into Google Rich Results Test or validator.schema.org. You want one
Productwithoffers. - View source and search for
application/ld+json— count how many blocks mention"Product". Zero is this problem; two or more is the duplicate problem. - Run the free Aivoma check — it fetches a real product page via the WooCommerce Store API and reports what the schema contains.
How to fix it
- Pick one schema source. Recommended: Rank Math or Yoast WooCommerce SEO with the *Product* schema enabled, and WooCommerce’s own structured data left to them. Disable schema output in any second plugin (e.g. Schema Pro, WPSSO, theme options).
- Rank Math: Titles & Meta → Products → Schema Type = *Product*. Yoast: needs the WooCommerce SEO add-on for full Offer/GTIN output.
- Make sure the schema has:
name,image,description,sku,brand,gtin13(EAN) ormpn,offerswithprice,priceCurrency,availability,url, andaggregateRatingif you collect reviews. - Test three products (simple, variable, sale) in the Rich Results Test until there are zero errors. For variable products, ensure a price range or the selected variation price is present.
- Purge caches and re-test; schema is often cached inside the page HTML.