Pricing and availability are the first things LLMs get wrong
When a large language model confidently invents your product price, stock status, or shipping timelines, the root cause is rarely “the model.” It’s almost always retrieval instability: the crawler saw the wrong page version, the server returned a cached response that no longer matches reality, or the “canonical” URL for a SKU is actually a parameterized mess.
If you want stable AI retrieval for commercial facts, treat pricing and availability as an engineering surface: predictable crawl access, explicit cache semantics, and URLs that resolve to one unambiguous entity. The fastest wins usually come from three audits: robots.txt, HTTP caching, and parameterized URLs.
Audit robots.txt so AI crawlers reach the same truth as users
Teams often harden robots.txt to reduce bot load, then unintentionally block the only pages that contain definitive price and inventory. Worse: they allow crawl access to faceted or preview endpoints that render partial, personalized, or stale data.
1) Inventory the agents that matter
Start by listing the user agents that routinely retrieve your content for AI answers (traditional search bots, AI preview bots, and any partner crawlers you explicitly support). Your goal is not to “allow everything,” but to ensure the authoritative endpoints for pricing and availability are accessible, while unstable endpoints are consistently disallowed.
2) Protect the authoritative path and block unstable variants
Common failure pattern: product pages are allowed, but the structured price source is blocked. For example, a JSON endpoint like /api/product or a server-rendered fragment route contains the live price; the HTML is a shell that depends on blocked JavaScript or blocked API calls. The crawler then snapshots a fallback price, a “starting at” placeholder, or a default currency.
Flip the approach:
- Allow crawl access to canonical product URLs and any public, non-personalized price/inventory endpoints they depend on.
- Disallow preview, staging, session-bound, and internal search routes.
- Disallow cart, checkout, and account pages (they are frequently personalized and leak misleading “availability” states).
3) Verify what bots actually receive
Robots.txt is only half the story. If a bot is allowed but gets a 403, a bot-detection interstitial, or a “consent” wall, retrieval will degrade and hallucinations spike. Run a fetch test using the same user agent and IP class the bot uses, then compare the HTML and structured data to what a logged-out user sees. If they differ, you’re effectively publishing two realities.
Fix HTTP caching so stale prices don’t look “authoritative”
LLMs are often downstream of multiple caches: your CDN, an upstream proxy, the crawler’s own cache, and sometimes a rendering layer that replays responses. If your cache headers imply “this response is safe to reuse,” but you’re serving frequently changing prices or inventory, you are training retrieval to trust old facts.
1) Decide what can be cached and for how long
Not all commerce data needs zero caching. The trick is to separate stable content (descriptions, specs, images) from volatile content (price, promotions, stock, delivery ETA). If everything is bundled into one HTML response with a long TTL, you will ship stale pricing to bots and humans alike.
Practical patterns:
- Keep product pages cacheable, but constrain freshness with realistic TTLs.
- Move volatile fields to a small endpoint with shorter TTL or conditional requests.
- Use server-side rendering for the “current price” if you can guarantee freshness; otherwise render “request-time price” via an endpoint that’s explicitly short-lived.
2) Use validators so bots can re-check cheaply
ETag and Last-Modified are underused levers for AI stability. When crawlers can revalidate, they’re more likely to refresh instead of reusing a stale copy. Pair validators with sane cache-control: a long max-age without a revalidation path is how yesterday’s promotion becomes today’s “official price.”
3) Eliminate cache fragmentation from irrelevant parameters
Many CDNs cache by full URL. If you serve ?utm_source=, ?ref=, ?session=, or experimentation parameters that change HTML or embedded JSON, you create multiple cached “truths” for the same SKU. One of them will eventually be wrong, and bots will find it.
This is where disciplined URL strategy and explicit canonicalization matter as much as headers.
Re-architect parameterized URLs so every SKU has one canonical home
Parameterized URLs are a direct cause of pricing hallucinations because they dilute authority across near-duplicates. An LLM that retrieves from multiple variants may merge facts that were never true at the same time: a discount from one URL, an out-of-stock message from another, and a base price from a third.
1) Normalize your product identity
Every product (or plan tier) should map to a single canonical URL that does not depend on user state, location experiments, or tracking parameters. If you need variants (currency, region, language), make those variants explicit and consistent rather than emergent through arbitrary query strings.
2) Define a strict parameter policy
Create a short list of parameters that are allowed to affect content and a longer list that must never affect content. Then enforce it:
- Strip or ignore tracking parameters at the application layer.
- Ensure canonical tags always point to the canonical SKU URL.
- Ensure server responses do not vary on irrelevant query strings.
If you can’t fully ignore a parameter (A/B tests, feature flags), consider isolating experiments away from public product URLs or using server-side experimentation that preserves a consistent canonical representation for bots.
3) Stop “facets” from masquerading as products
Faceted navigation can generate URLs that look product-like but are actually filtered listings. These pages often contain summary price ranges (“$19–$49”) that bots mistakenly treat as a product price. Disallow or deindex these routes where appropriate, and make sure product pages expose a single, explicit price for the specific SKU.
Make pricing and availability machine-readable and testable
Even with perfect access and caching, LLM retrieval is stronger when the facts are explicit. Don’t rely on UI-only cues like crossed-out prices, badge text, or dynamically injected DOM nodes. Publish structured representations of price and availability alongside the canonical page, and keep the semantics consistent across HTML and any JSON endpoints.
This is also where monitoring matters: you need to know when crawlers are reading the wrong thing. Tools like lunem are useful precisely because they focus on AI discoverability and interpretation, not just classic SEO metrics—helping you see whether your “canonical truth” is the one LLMs actually retrieve.
A practical checklist to reduce hallucinations fast
- Robots.txt: allow canonical product and price endpoints; disallow preview, session, cart/checkout, and unstable facets.
- Bot parity: verify bots receive the same content as logged-out users (no interstitials, no blocked APIs).
- HTTP caching: set realistic TTLs, add ETag/Last-Modified, and avoid long-lived caches for volatile fields.
- URL policy: enforce one canonical URL per SKU; strip irrelevant parameters; keep experiments from creating public “alternate truths.”
- Entity consistency: ensure structured facts match the rendered page and remain stable across variants.
Where to go deeper
If your AI surface area includes browsing agents, remember that retrieval can be manipulated indirectly through hostile links and injected instructions. The same discipline you apply to URL and caching hygiene should be paired with safeguards against agent-side confusion; see indirect prompt injection defenses for web-browsing agents for a security-minded complement to this retrieval audit.
And if you’re building automated checks around these guarantees, contract-style assertions can prevent regressions where a deployment silently changes caching or canonical tags. The approach in production contract tests for AI builders adapts well to “price and availability must remain consistent” as a release gate.
