SkuWatch AI Visibility Agent Scan your store or site

Troubleshooting

Shopify Product Price Differs Between the Page and JSON-LD

Core answer

Diagnose selected-variant, market, sale, bundle, and price-range mismatches using Puffy, Mattel Creations, HexClad, and Rhode examples.

By skuwatch editor

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

Define which price is wrong

A product can legitimately expose several numbers:

  • selected variant price
  • lowest and highest variant prices
  • compare-at price
  • bundle reference value
  • market-specific price
  • subscription price
  • temporary discount code result

The failure is not “multiple prices.” It is a number detached from its offer context.

Public cases

Puffy: range versus selected size

The Puffy Cloud Product graph exposed a $449–$1,749 USD range. That range can describe available sizes, but it cannot answer “What is the Queen price?” without the Queen offer.

Mattel Creations: regional price

A product request resolved to a Canadian path and exposed a CAD 455 out-of-stock offer while canonicalizing to a non-localized URL. The price is meaningful only with Canadian market context.

HexClad: current price versus set value

The UK pot set showed £399 current price, £477 stated set value, and £78 savings. Offer.price should represent the amount payable, not the reference value.

Rhode: two size offers

Glazing Milk exposed 4.2 oz at $32 and 1.7 oz at $20. The selected size must determine the presented offer.

Capture one transaction state

Record:

requested_url: complete URL including variant parameter
final_url: effective URL
market: country/region
currency: displayed currency
selected_variant: title and ID
visible_price: amount payable
compare_at_price: optional reference amount
structured_price: Offer.price
structured_currency: Offer.priceCurrency
availability: visible and structured
captured_at: timestamp

Inspect the public page

url='https://example.com/products/example-product?variant=123'
curl -sSL "$url" -o product.html
rg -n 'priceCurrency|lowPrice|highPrice|compareAtPrice|availability|variant|application/ld\+json' product.html

In a browser, change variants and inventory the Product scripts after each selection.

Find the price owner

Search the duplicate theme for:

structured_data
priceCurrency
lowPrice
highPrice
compare_at_price
selected_or_first_available_variant

Also review SEO, review, subscription, bundle, and localization app embeds.

Shopify repair patterns

Wrong first-variant price: read selected variant rather than product.variants.first.

Wrong sale price: use current variant price for Offer.price; keep compare-at value separately.

Wrong market currency: render from the current market context and avoid hard-coded currency.

Wrong bundle value: distinguish payable offer from combined component value.

Range presented as exact price: expose low/high range only at parent group level; expose exact selected offer at variant level.

Expected result

Context Correct representation
collection card clear “from” price when variants differ
parent ProductGroup low/high range where appropriate
selected product variant exact price and currency
sale current amount plus qualified compare-at value
bundle payable price separate from stated value
localized market offer attached to market and canonical strategy

Verify

Test:

  • cheapest and most expensive variants
  • one sale variant
  • one sold-out variant
  • two markets
  • subscription and one-time purchase where applicable

A syntactically valid Product block fails if it disagrees with the selected buy box.

Rollback

Keep the old schema owner available in a duplicate theme. If checkout, subscription, or market behavior changes, restore the previous theme and isolate the price owner before trying another fix.

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.