Duplicate JSON-LD is not automatically wrong. A graph can contain connected entities. The failure occurs when multiple independent Product objects describe the same item with conflicting facts.
Inventory the rendered output
Open a product page, then run:
[...document.querySelectorAll('script[type="application/ld+json"]')]
.map((node, index) => {
try {
return { index, data: JSON.parse(node.textContent) };
} catch (error) {
return { index, error: error.message };
}
});
Also save server HTML:
curl -sSL https://example.com/products/example-product > product.html
rg -n 'application/ld\\+json|\"@type\":\"Product|\"@type\": \"Product' product.html
The browser and server results can differ when an app injects markup.
Create an ownership table
| Block | Likely owner | Product identity | Offer | Reviews |
|---|---|---|---|---|
| 1 | theme | parent product | current | none |
| 2 | review app | same product | stale | current |
| 3 | SEO app | same product | current | zero |
Locate the source by searching theme code for unique keys, inspecting app embeds, and disabling blocks only in a preview theme.
Compare critical fields
@idurlname- brand
- SKU or GTIN
- variant relationship
- price and currency
- availability
- aggregate rating and review count
Prioritize wrong commercial facts over stylistic schema differences.
Choose an authoritative design
Options:
- Shopify/theme product graph owns identity and offers; review app contributes connected review data.
- one maintained custom graph owns the complete entity.
- Shopify’s
structured_datafilter provides the base, with only supported facts added separately.
Do not preserve two complete product objects merely because two apps generated them.
Remove safely
- duplicate the live theme
- capture product, collection, and article baselines
- disable one suspected source
- inspect rendered JSON-LD
- verify visible widgets still work
- test simple and multi-variant products
- publish with a rollback path
Acceptance criteria
- every product entity has a clear purpose
- entities share stable IDs where they are meant to connect
- price, currency, and stock match the visible selected variant
- ratings match visible review evidence
- no placeholder brand, category, or
Default Titleleaks - product and article schema remain valid after the change
Reference: Shopify Liquid structured_data.
Community discussion
Add to the article
Ask a technical question, share a storefront result, or challenge a conclusion with evidence.