TL;DR
- Duplicate
Productschema (theme + review app both active) causes Google to drop or randomly pick a version, removing review stars.- A malformed JSON-LD block fails silently: the storefront renders normally but Google ignores the entire structured data payload.
- A
noindextag from a metafield, app rule, or theme edit removes the product page from Google entirely, stars included.
When a client reports their Google review stars disappeared, the storefront is usually working fine. The bug lives in the structured data layer, invisible to shoppers and often invisible to the developer who introduced it. No error from Google, no console warning: just a star rating that vanished and a click-through rate in quiet decline.
The five causes below cover most cases on Shopify. Three are fixable in under an hour. All five can be diagnosed with free tools before touching a single line of code.
This article is aimed at developers and agencies maintaining Shopify stores: you will find the diagnostic steps, the specific theme variables and app settings involved, and the correct fix for each case.
How do you verify the schema state before touching anything?
Two tools, two minutes:
- Open Google's Rich Results Test and paste the product page URL.
- "No items detected" → markup is missing or was never present (causes 1, 2, 3).
- Items detected, with errors → markup exists but is broken (causes 2, 4).
- Everything green → markup is valid; the problem is indexability or eligibility (cause 5).
- In Search Console, go to Enhancements > "Products". The valid-items chart shows exactly when the drop happened; it is almost always the day of a theme update or an app change.
Why does a review app create duplicate Product schema?
This is the most common cause. Review apps (Judge.me, Loox, Yotpo, and similar) inject their own Product schema. Two failure modes:
-
The duplicate: the theme already outputs a
Productblock; the app adds a second one with a different price or rating aggregate. Google receives two contradictory descriptions of the same listing and either picks one arbitrarily or shows nothing. Classic symptom: stars appear some days and not others. - JavaScript injection: the app writes nothing into server-rendered HTML and instead injects schema after page load via JavaScript. Google processes it late and unreliably. If that script is blocked, updated, or fails silently, the structured data disappears with no visible sign on the storefront.
Fix: one source of truth. If your review app has a "structured data" or "SEO markup" toggle, disable either the app's output or the theme's native product schema block. Never leave both active at the same time.
What breaks when a JSON-LD block becomes unparseable?
Schema lives inside <script type="application/ld+json"> blocks. One app concatenating two JSON documents, or a stray control character, makes the entire block invalid. Google silently ignores the whole payload. The store functions normally; shoppers see nothing wrong; the stars switch off.
Diagnose: paste the URL into validator.schema.org and look for parsing errors.
Fix: find which app or theme snippet generates the broken block (search for a recognizable string from the broken JSON in the theme code editor), then fix or disable it.
How does a theme update silently drop structured data?
OS 2.0 themes (Dawn and derivatives) generate product schema natively. A theme redesign, a purchased theme switch, or a developer cleaning up theme.liquid can strip the snippet without anyone noticing. It produces nothing visible, so nobody catches it until stars vanish weeks later.
Fix: compare the current theme against a backup, or reintroduce a structured-data.liquid snippet that pulls price, currency, availability, and image from the live product object:
"price": "{{ product.selected_or_first_available_variant.price | money_without_currency }}",
"priceCurrency": "{{ cart.currency.iso_code }}",
"availability": "{% if product.selected_or_first_available_variant.available %}InStock{% else %}OutOfStock{% endif %}"
Never hardcode values. The schema must reflect the current product state on every render.
When does a price mismatch invalidate the schema?
A sale applied mid-day, a currency-conversion app, a hardcoded price left in a theme edit: if the price in the structured data diverges from what shoppers see, Google loses trust in the listing. On Google Shopping, Merchant Center can disapprove the product for an "inconsistent value."
Diagnose: compare the price the Rich Results Test detects against the price displayed on the page.
Fix: in the theme, pull the schema price from the exact same Liquid variable as the displayed price:
product.selected_or_first_available_variant.price
Never duplicate the variable or hardcode a fallback.
How does a noindex tag remove review stars entirely?
A noindex meta tag applied by mistake removes the page from Google entirely. Stars disappear because there is no listing left to attach them to. Common sources: a seo.hidden metafield inherited from a CSV import, an SEO app exclusion rule, or a stray theme edit.
Diagnose: run site:yourstore.com/products/your-product in Google. Zero results means the page is deindexed.
Fix: find and remove the noindex directive. Check the product's metafields in the Shopify admin, your SEO app's exclusion rules, and any conditional logic around the robots meta tag in theme.liquid.
None of these failures produce a visible symptom on the storefront. They surface weeks later in a Search Console chart while click-through rate drifts to competitors who still have their stars.
When you debug structured data issues for clients, which of these five causes do you run into most often?
The full version of this article, with screenshots and ongoing updates, lives on the StoreCanary blog.
Top comments (0)