Issue reference
Your product data and your page disagree on price
- SCHEMA_PRICE_MISMATCH
- See the price
- —
- High
What it means
tragent reports this at the “See the price” stage. The question there is “Can it see what the product costs?” Price and currency have to be stated in a way that matches what a shopper is shown.
What it does to an agent
Most agents fail at this point. The few that find a way round it spend more time and model calls doing so, and may give up before checkout.
When the structured price and the price on the page disagree, an agent quotes the structured one. The shopper reaches checkout, sees a different number and leaves, and the agent learns not to trust your store. Some marketplaces suspend listings for it.
tragent compares the price in the markup with the prices visible on the page. A mismatch usually means the markup is rendered from a different source than the page: a cache, a base currency, or the price before a sale.
How to fix it
Serve the structured price from the same source as the rendered price. A stale Offer makes an agent quote a price you will not honour.
On your platform
Shopify
With Shopify Markets, Liquid already renders prices in the shopper's currency, so render the markup from the same variant object as the visible price, in the same template. A page cache or a currency-switcher app that rewrites prices in the browser is the usual cause: the markup keeps the base price while the page shows the converted one.
WooCommerce
Full-page caches serve yesterday's markup after a price change. Purge product pages when prices change, and check multi-currency plugins convert the structured data as well as the display.
Headless or custom
Render the visible price and the JSON-LD from one value in one render, never from two API calls that can return different answers.
In practice
The mismatch often appears only for some shoppers: a different market, a signed-in member, a promotion applied by an app in the browser. tragent compares what an agent receives, which is a fresh, signed-out request, so reproduce it the same way: a private window, no cookies, the same country. If the page then shows a different price from the markup, the source of the difference is usually obvious.
Prices that change often, such as flash sales or dynamic pricing, need a cache strategy that purges the product page, markup included, when the price changes. If that is not possible, keep the price out of the cached HTML and render both the visible price and the markup from the same request after load, so they can never disagree with each other, even if both are briefly stale.
Check the fix
- Open a product on sale and compare the price in the markup with the price shown.
- Repeat with the currency switcher, if you have one.
- Run the scan; the mismatch finding should be gone.
Run the check that reported SCHEMA_PRICE_MISMATCH again after the change. The scan needs no account; an issue found during an AI shopping test needs that test run again.
npx @tragent/cli scan https://your-store.comCommon mistakes
- Marking up the compare-at price instead of the selling price.
- Fixing the template but not purging the cache.