What it means
On Shopify the feed is usually right, because the feed app reads prices straight from Shopify. The page's markup is the usual suspect: custom or app-made JSON-LD that prints one price for every variant, forgets a sale, prints the wrong currency for an international visitor, or is filled in by JavaScript after the page loads.
Test it free: Paste a product URL: on Shopify stores the tester compares every variant's JSON-LD price and stock with the live store.
Open the structured data tester →Example diagnosis
Live Shopify prices compared with the page's JSON-LD
Variant Shopify (live) JSON-LD on page
Linen Shirt / S 39.00 USD "price": "59.00"
Linen Shirt / M 39.00 USD "price": "59.00"
Linen Shirt / XL 45.00 USD "price": "59.00"
priceCurrency — "USD" (page shown in EUR to a visitor in Germany)
The theme's hand-written JSON-LD prints product.compare_at_price where it should print the variant's current price, so during a sale every offer still shows the old 59.00.
There's one price for all sizes, although XL costs more. Each variant needs its own offer with its own price.
With Shopify Markets converting prices, the visible price and the markup currency must follow the visitor's currency. A fixed USD next to a euro price is a mismatch of its own.
Symptoms
- Merchant Center lists items under Needs attention with a mismatched price (page crawl) issue.
- The structured data tester shows a JSON-LD price that differs from the live variant price, or the same price on every variant.
- Mismatches appear when a sale starts or ends, or after a price import, and clear on their own days later.
- Prices in the markup look like
3900(cents) or$39.00(formatted, with a currency symbol) instead of39.00.
How to fix it in Shopify
- Confirm where the wrong price comes from. Run an affected product URL through the structured data tester, which compares each variant's JSON-LD price with Shopify's live price, and note which variants differ.
- Prefer Shopify's own markup. If the theme or an app hand-builds the JSON-LD, consider replacing it with
{{ product | structured_data }}, which Shopify generates from the product's current data. See the Product schema fix guide for where it goes. - If you keep custom markup, print one offer per variant. Loop over
product.variantsand outputvariant.price, notproduct.priceorcompare_at_price. - Print a plain number. Liquid prices are in cents: use
{{ variant.price | divided_by: 100.0 }}. Avoid themoneyfilters in markup, which add a currency symbol or thousands separators depending on your store's formatting. - Match the currency to the page. Set
priceCurrencyfromcart.currency.iso_code, so a converted price carries the currency the visitor sees. - Render it on the server. Google's help page names prices added by JavaScript as a cause. Markup in Liquid is in the HTML Google downloads; markup an app writes in the browser may not be.
- Re-check in Merchant Center. After publishing, re-test the page, then request a website check from the item's issue in Merchant Center, or wait for Google to crawl the page again.
Caveats and when it applies
- Sale prices need correct dates. If your feed sends a sale price with an effective date, the window and time zone must match when the sale really runs on the site.
- If the page shows several currencies, Google expects the feed's price and currency to match the one shown most prominently to shoppers in the target country.
- Merchant Center's automatic item updates can correct a feed price from the page's markup. That only helps when the markup is right, and it's a setting to review rather than a fix for broken markup.
- Mismatches can also come from bot detection, geo-redirects or apps that show crawlers different prices than shoppers. The structured data tester sees what a crawler sees, which is the point.
Official documentation
- Google: How to fix: Mismatched product price
- Google: Price [price] attribute
- Google: Allow Merchant Center to update product information automatically
- Google: Merchant listing structured data
- Shopify: Product prices
- Shopify: Liquid filter: structured_data
The audit checks behind this guide
Structured-data price differs from the live price
Merchant Center flags "Mismatched value (page crawl) [price]" and disapproves the item; repeated mismatches risk an account-level warning.
Offer has no priceCurrency
Without a currency the price can't be validated, so automatic item updates and price checks fail.
Test it free: Paste a product URL: on Shopify stores the tester compares every variant's JSON-LD price and stock with the live store.
Open the structured data tester →Updated 2026-10-26. catalogaudit isn't affiliated with Google or Shopify; the linked documentation is the authority.