Gemini quotes a free shipping threshold you retired two sales ago, ChatGPT tells a shopper delivery costs 4.95 when it is free over 50, and the sale dies because the answer engine made your store look unreliable. The fix is not a support macro. You teach LLMs your free shipping threshold the same way you teach Google Shopping: one canonical number, published in machine-readable form, repeated identically everywhere a crawler looks.
Why do AI answers get free shipping thresholds wrong?
Answer engines do not read your checkout. They read your public pages, your structured data, and third-party mentions of your store, then compress everything into one confident sentence. When those sources disagree, the model picks whichever number it parsed most cleanly, and that is often an old banner, a stale blog post, or a forum thread from last year.
Three failure modes cover most wrong shipping answers:
- The threshold lives only in a JavaScript announcement bar that HTML-first crawlers never render. Google documents this gap in its JavaScript SEO basics: content that needs rendering is crawled later or not at all by other engines.
- The copy says “free shipping on most orders” and no exact number exists anywhere on the page.
- Retired thresholds survive in cached pages, old FAQs, and press mentions, and nothing on your store contradicts them with a fresher, clearer figure.
| Surface | What it feeds | Typical failure |
|---|---|---|
| Product page JSON-LD | Gemini, AI Overviews, shopping graphs | No OfferShippingDetails, so the model guesses from prose |
| Shipping policy page | ChatGPT, Perplexity citations | Vague ranges instead of one exact threshold |
| Announcement bar | Very little | JavaScript-only, skipped by HTML-first crawlers |
| Merchant Center feed | Google shopping and AI surfaces | Feed shipping disagrees with on-page copy |
| Old blog posts and press | Training data and retrieval | Retired thresholds quoted as current |
Where should the canonical threshold live?
Pick one page as the source of truth, almost always your shipping policy page, and state the rule in one extractable sentence: “Free standard shipping on orders over 50 euros in the EU. Orders under 50 euros ship for 4.95.” Plain HTML, near the top, no tabs or accordions that hide it from a parser.
Then echo that exact sentence on every product page, in the footer if you reference shipping there, and in your FAQ. The goal is that any crawler landing anywhere meets the same number. A model that sees 50 in five places and nothing else has no competing figure to hallucinate from. This is the same consistency discipline that fixes out of stock hallucinations in ChatGPT, applied to delivery economics.
How do you mark shipping up so machines can parse it?
Structured data turns your threshold from prose into a field. Schema.org defines OfferShippingDetails for exactly this: shipping rate, destination, and delivery time attached to an Offer. A free-over-threshold rule is expressed as a shippingRate of 0 paired with the qualifying order value, alongside the paid rate below it.
Two implementation notes for Shopify stores:
- Most themes emit basic Product and Offer JSON-LD but skip shipping details. Extend the schema in your theme or through your data layer rather than duplicating conflicting blocks. Google’s product structured data documentation shows the accepted shipping fields and how they surface in shopping experiences.
- If you run Merchant Center, the feed is a second authoritative source. Keep the shipping attribute in your product data specification aligned with the on-page schema. Google AI surfaces lean on the feed, and a feed that says 4.95 while the page says free is how shoppers get two different answers from the same engine.
We cover the broader markup baseline in Product schema for AI search on Shopify.
How do you keep every surface consistent when the threshold changes?
Treat a threshold change like a price change, not a marketing tweak. The day you move from 50 to 75, run one pass:
- Update the shipping policy sentence and the product page echo copy.
- Update the JSON-LD and the Merchant Center feed in the same deploy.
- Search your own blog and FAQ for the old number and refresh or remove it.
- Keep the announcement bar, but mirror its message in crawlable HTML, because the bar alone teaches machines nothing.
Stores that skip step 3 leak the old number back into AI answers for months, because retrieval engines happily cite your own stale page as evidence. The same hygiene applies to promotional codes, which we unpack in fixing fake discount codes in AI chatbots.
How do you verify AI engines now quote it correctly?
Build a small prompt set and run it monthly: “does [your store] have free shipping”, “what does shipping cost at [your store]”, and the same questions in your main markets’ languages. Check Gemini, ChatGPT, Perplexity, and AI Overviews, and log the quoted number against your canonical one. Movement typically shows within weeks on live-retrieval engines and a quarter on cached ones.
If you would rather not run that loop by hand, Nivk.com tracks shipping and policy answers across the major answer engines as part of its autopilot GEO monitoring for Shopify stores, and flags the surfaces still quoting a retired threshold. Pair it with the feed-level checks from Merchant Center optimization for AI Overviews and wrong shipping answers stop being a recurring support ticket.
Frequently asked questions
Why does Gemini quote an old free shipping threshold for my store?
Gemini blends Google’s index, the Merchant Center feed, and cached copies of your pages. If any of those still carries the old number, it can win the answer. Update the policy page, the product schema, and the feed together, then request recrawling of the changed pages in Search Console.
Do I need OfferShippingDetails if shipping is a flat rate?
Yes. A flat rate is the simplest possible shipping schema and it still prevents guessing. One shippingRate value with your delivery region tells every parser the exact cost, and it future-proofs the markup for the day you introduce a free threshold.
Will fixing structured data correct wrong AI answers immediately?
No. Live-retrieval engines like Perplexity often update within days because they fetch pages at question time. Gemini and ChatGPT lean on indexes and caches, so expect weeks, sometimes a full quarter, before the old number disappears everywhere. Consistency across every surface is what shortens the lag.
Should the threshold also go in llms.txt?
It is a reasonable addition, not a replacement. An llms.txt entry pointing at your shipping policy gives AI crawlers a direct path to the canonical page. The threshold itself should still live in crawlable HTML and schema, since most engines weight rendered pages and structured data far above discovery files.

