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.