My product pages were emitting three competing JSON-LD blocks and Google believed none of them. How I found every voice, picked one, and silenced the rest — without breaking my review widgets.

When I rebuilt my ecommerce site this summer, Google Search Console rewarded me with a fresh crop of structured-data errors. Not one polite error. A chorus of them — duplicate fields, conflicting values, the works.
The diagnosis took an evening, view-source, and a small amount of betrayal. My product pages, it turned out, were speaking to Google in three voices at once. Each one was describing the same product — slightly differently. And when a search engine hears three descriptions of one thing, it doesn't average them. It stops trusting all three.
If your rich results (the star ratings, prices, and stock status in search listings) have quietly disappeared, or Search Console is muttering about duplicate fields, there's a decent chance you have the same disease. Here's how to find every voice on your page, choose one, and retire the others — without breaking anything visible.
Nobody plans this. It accumulates:
Voice one: an SEO app. Most stores install one at some point. Somewhere in its settings — often enabled by default — is "add structured data." Reasonable. Helpful, even. You forget it exists.
Voice two: your theme. Many themes ship with their own product schema baked in. If you've customized your theme, or a developer "improved your SEO" at some point, there may be a hand-rolled JSON-LD snippet in there too. Mine had one, added with the best of intentions during the rebuild.
Voice three: your review app. Review platforms inject their own schema so your star ratings appear in search. That's their whole pitch. It's also a third AggregateRating on a page that should have exactly one.
Every voice was invited. Every voice is doing its job. Together they're a liability — because Google's guidance for merchant listings effectively boils down to one product entity per page, one rating, one price, no arguments. Duplicate structured data doesn't get you triple the rich results. It gets you warnings, and eventually silence.
View source on a product page (right-click → View Page Source) and search for application/ld+json. Read every block you find and note what each one claims to be: Product, Offer, AggregateRating, BreadcrumbList, Organization.
Count the AggregateRating entries. If the number is greater than one, you've found your problem.
Then run the same page through Google's Rich Results Test — it will show you the merged mess exactly as Google sees it.
This is the detective part, because JSON-LD blocks don't sign their work — but they do leave fingerprints:
id attribute on each script tag. Mine had one helpfully labeled with the SEO app's name — case closed in ten seconds.shopify://apps/<app-name>. Scroll up from the schema block and read.application/ld+json across snippets and sections. Anything that shows up is your theme talking.Pick the voice with the richest, most accurate data — then commit. For me that was the SEO app: its block already carried variants, images, pricing, and shipping detail my hand-rolled snippet didn't. There's no prize for artisanal schema. There's only a prize for correct schema.
Then silence the others reversibly:
emit schema: false). Deletion is forever; a toggle is an apology you can act on later if you ever leave the app.Two hard-won rules:
Verify logged out, cache off. If you've been previewing theme changes, your browser may be carrying a preview cookie that shows you an unpublished version of the site on the live URL. I lost an embarrassing chunk of an evening to this. An incognito window — or better, checking the actual response with cache disabled — shows you what Google sees, not what your cookies see.
Then wait, on purpose. Search Console's reports drain slowly — expect one to two weeks for the errors to clear as pages get recrawled. The fix is done when the live page has one voice; the report is just the echo catching up. Resist the urge to keep changing things while it drains. That's how you end up unable to tell which fix worked.
My product pages now emit exactly three JSON-LD blocks — product, breadcrumbs, organization — and exactly one AggregateRating. One voice per fact. Search Console went quiet. The star ratings came back to the listings.
Total code written: almost none. The entire fix was deciding who speaks — an editorial decision wearing a technical costume. Which, now that I think about it, describes most of the problems I get hired for.
If your search listings lost their stars and you never touched your schema: you probably didn't break it. You probably just hired three people to say the same thing, and Google stopped listening to all of them. Fire two. Keep the toggle.
---
Alyssa Ostroff is a brand designer and strategist in Fort Lauderdale. She runs Self-Care Shirts, where all of these mistakes were made personally, so you don't have to.
I'm Alyssa Ostroff — designer and brand strategist. Open to senior design and creative lead roles at mission-driven teams, and taking two freelance projects this quarter.