Issue reference
Your product data has no price
- SCHEMA_OFFER_PRICE_MISSING
- 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.
Agents filter on budget first. "Under 100" removes anything the agent cannot price, so an Offer without a price is invisible to the most common shopping question. The price must be a plain number: 89.00, not "$89" and not "From 89".
tragent reports this as high when every offer lacks a price and as medium when some do.
How to fix it
Set Offer.price as a plain number. Agents filtering on budget skip anything they cannot price.
"offers": { "@type": "Offer", "price": "$89.00 incl. VAT" }"offers": { "@type": "Offer", "price": "89.00", "priceCurrency": "GBP" }On your platform
Shopify
Liquid prices are in the smallest currency unit, so divide by 100 and do not use the money filters, which add symbols and separators.
"price": "{{ product.selected_or_first_available_variant.price | divided_by: 100.0 }}",
"priceCurrency": "{{ cart.currency.iso_code }}"WooCommerce
WooCommerce writes the price as a number. If a plugin rewrites prices for display, check it does not also rewrite the markup into formatted text.
Headless or custom
Serialise the price from the numeric value, with a dot as the decimal separator whatever the page's locale.
In practice
The price in the markup is the price the shopper pays for the item before shipping, in the currency the page shows. Include tax when your page includes it, which is the norm in Europe, and leave it out when your page does, which is the norm in the United States. Agents compare prices across stores, so being consistent with your own page matters more than any one convention.
Sale prices go in price; the original price, if you want to show it, can go in a priceSpecification with a price type, but do not put the original in price with the discount described in text. A shopper's budget question is about what they will pay, and an agent that reads the pre-sale price filters you out of a search you would have won.
Set priceCurrency on every Offer, as a three-letter ISO 4217 code such as USD, GBP or EUR, even if your store sells in one currency. An agent cannot assume a currency from your domain or your language; a price of 89 with no currency is unreadable to an agent comparing across countries, and the scan reports a missing currency as a separate finding for that reason.
Check the fix
- Check that price in the JSON-LD is digits and a dot only.
- Run the scan; the price finding should be gone.
Run the check that reported SCHEMA_OFFER_PRICE_MISSING 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
- Locale formatting: 1.299,00 for a German storefront.
- Price ranges written into price instead of an AggregateOffer.