SkuWatch AI Visibility Agent Scan your store or site

Structured product data

How to Fix Duplicate Product JSON-LD in Shopify

Core answer

Inventory every Product object, identify its owner, and consolidate conflicting price, stock, review, and variant data safely.

By skuwatch editor

Difficulty
Advanced
Time
60 minutes
Risk
Theme and app changes
Last tested
July 27, 2026
SkuWatch AI Visibility loopFix

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

  • @id
  • url
  • name
  • 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_data filter provides the base, with only supported facts added separately.

Do not preserve two complete product objects merely because two apps generated them.

Remove safely

  1. duplicate the live theme
  2. capture product, collection, and article baselines
  3. disable one suspected source
  4. inspect rendered JSON-LD
  5. verify visible widgets still work
  6. test simple and multi-variant products
  7. 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 Title leaks
  • 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.

Comments are public. Do not post customer data, credentials, private store information, promotional spam, or unsupported accusations. Comments may be moderated.