NewThe tragent CLI is on npm: npx @tragent/cli scan your-store.com

Issue reference

Your product data and your page disagree on price

Issue code
SCHEMA_PRICE_MISMATCH
Stage
See the price
Protocol
—
Severity
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

  1. Open a product on sale and compare the price in the markup with the price shown.
  2. Repeat with the currency switcher, if you have one.
  3. 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.

Terminal
npx @tragent/cli scan https://your-store.com

Common mistakes

  • Marking up the compare-at price instead of the selling price.
  • Fixing the template but not purging the cache.