AI search

Why AI engines get your pricing wrong

Prices change faster than any retrieval layer refreshes, and they live in the formats retrieval handles worst. Here is why, and what to write instead.

Lawrence Dauchy Lawrence Dauchy · · 12 min read
Illustration for Why AI engines get your pricing wrong

Ask ChatGPT what your software costs and there is a good chance it will quote a number you retired eighteen months ago. Pricing is the single most frequently wrong fact about brands in AI answers, and the reason is structural rather than accidental: prices change faster than any retrieval layer refreshes, and they are usually rendered in exactly the formats that retrieval handles worst. SQSEO surfaces this by fanning your brand into the pricing questions buyers actually ask, so you can see which wrong number is circulating before a prospect quotes it back at you.

Why pricing is the worst case for retrieval

Every other fact about your company is comparatively stable. Your category, your founding year, your headquarters, the problem you solve: all of these can sit in a model’s weights or a cached document for a year and remain true. A price cannot.

Three properties make pricing uniquely fragile. It changes often, sometimes quarterly. It is frequently rendered by JavaScript from a billing system rather than written into the HTML. And it is usually expressed in a pricing table, which is a layout, not a sentence.

That last point matters more than it sounds. Retrieval systems work on chunks of text, and the research underpinning modern retrieval, from dense passage retrieval onward, matches a query against passages rather than against page layouts. A pricing table that reads “Starter / Pro / Enterprise” across the top and “19 / 49 / Contact us” underneath makes perfect sense to a human eye and collapses into ambiguous fragments once flattened into text. The number 49 survives. The fact that 49 belongs to Pro, is per month, is per seat, and is billed annually frequently does not.

What actually goes wrong, in order of frequency

FailureWhat the answer saysRoot causeHow you find itFix difficulty
Stale priceAn old tier price, confidentlyCached page or model memory older than your last changeRun pricing prompts and compare to todayLow, fix the page and wait
Orphaned numberA real number attached to the wrong tierTable flattened into text, labels lostRead the answer’s cited page as plain textLow, rewrite in sentences
Missing billing period”49 dollars” with no per month or per yearThe period lives in a heading or a toggleCheck whether your page states it inlineLow
Invented priceA number you have never chargedModel filling a gap from category priorsNo source cited, or a competitor citedHigh, needs a citable page
Competitor price attributed to youTheir number, your nameComparison page nearby in the indexCheck which URLs are citedMedium

The first three are your fault and cheap to fix. The last two are the ones that cost deals, and they happen most to companies whose pricing is behind a “contact us” button, because a model asked for a number with no retrievable number available will often produce one anyway.

The chunking problem, stated plainly

When a page is prepared for retrieval it gets split into chunks of a few hundred tokens. Whatever context sits outside a chunk is invisible to whatever sits inside it.

So if your page has an H2 saying “Pricing, per user per month, billed annually” and then a table three hundred words later, the qualifier and the number can land in different chunks. The chunk containing 49 says only 49. Retrieved alone and handed to a model, it becomes “49 dollars” with whatever billing assumption the model finds most probable, which is usually monthly.

The fix is unglamorous and effective: repeat the qualifier next to every number, in prose, in the same sentence. “The Pro plan is 49 dollars per seat per month when billed annually, or 59 dollars per seat month to month.” That sentence survives any chunk boundary because it carries its own context. This is the same principle behind writing an answer-first paragraph for AI ingestion, applied to a number instead of a claim.

Tables are good for snippets and bad for prices

There is a genuine tension here. Structured tables help AI engines extract comparisons, and a structured table does make it easier to get an AI snippet. For a feature comparison that is true. For pricing it is only half true, because a table encodes the relationship between tier and price in two dimensions, and flattening removes one of them.

The answer is not to remove the table. It is to state the same information twice: keep the table for humans and for snippet extraction, and add a short prose paragraph underneath that says each price in a full sentence. Redundancy that looks unnecessary to a designer is exactly what makes a fact survive retrieval.

Markup helps as a third layer. Google’s guidance on structured data and the schema.org Product and Offer types give you a machine readable place to state price, currency, and billing period unambiguously. Markup alone will not carry an answer, because most generative engines read the rendered text, but it costs little and it removes ambiguity for the systems that do parse it.

JavaScript pricing pages are invisible more often than you think

If your prices are fetched client side from a billing API, there is a real chance the crawler that fed the answer engine never saw a number at all. Google documents this directly in its JavaScript SEO basics, and the situation is worse for the newer AI crawlers, several of which do far less rendering than Googlebot.

The test takes thirty seconds. Fetch your pricing page with curl and search the raw HTML for your headline number. If it is not there, the page ships no price to anything that does not execute JavaScript, and every AI answer about your pricing is being generated from somewhere else: a review site, an old blog post, a competitor comparison, or the model’s imagination.

Server side rendering the price, or at minimum embedding it in the initial HTML alongside the interactive component, closes this gap entirely and is usually a small change.

Currency, region and the answer that is right somewhere else

Multi currency pricing produces a specific failure: the answer quotes a real price in the wrong currency, or converts one at a stale rate. A page that shows dollars to one visitor and euros to another based on IP has, from a crawler’s perspective, a single price whose currency depends on where the crawl came from.

State every currency you publish, in text, on the same page. “Pricing is 49 dollars, 45 euros, or 39 pounds per seat per month” is one sentence that removes the entire class of error. If regional pricing genuinely differs beyond conversion, say so explicitly rather than leaving a model to infer that your euro price is a conversion of your dollar price.

Contact-us pricing has a cost you can measure

Enterprise sales teams hide pricing deliberately, and that is a legitimate commercial choice. It has a consequence in AI search that did not exist in classic SEO: a search engine with no price simply showed no price, while a generative engine asked for a price will often supply one.

Where does that number come from? Usually from whatever is adjacent in the retrieved context, which means a competitor’s published pricing, a review site’s estimate, or a years old forum post. Research on generative engine optimization found that the content characteristics of a source materially change how generative engines use it, and the practical corollary here is that if you publish nothing, something else gets used.

The middle path that works is to publish a floor and a shape without publishing the whole model. “Plans start at 1,200 dollars per month and scale by seats and volume; most teams of 20 to 50 land between 2,000 and 4,000” gives a model something true and citable, gives a buyer a qualifying signal, and keeps your negotiation room.

Comparison pages: yours or theirs

If you do not publish a clear price, your competitors’ comparison pages become the most retrievable source of information about your pricing, and they are not written to flatter you. This is one of the strongest arguments for owning your own comparison content, and it connects directly to why competitors get cited instead of you.

A comparison page you control that states your pricing accurately alongside alternatives serves two purposes: it is the kind of content generative engines reach for when answering comparison queries, and it puts a correct number in the retrievable pool.

Free tiers, trials and the discount that outlives the campaign

Three pricing adjacents cause almost as much trouble as the headline number.

Free tiers get remembered long after they are retired, because “free” is a highly quotable fact that spreads into third party listicles, directories and comparison pages that nobody updates. A company that removed its free plan two years ago can still be listed as free across a dozen retrievable sources. The correction is to publish an explicit statement that there is no free tier and what replaced it, since a model cannot retrieve an absence.

Trial lengths drift the same way. Fourteen days becomes seven, the page updates, and the old number persists everywhere it was quoted. Stating the trial length in prose on the pricing page, and in any page that mentions trials at all, at least makes the current figure the most common one in the pool.

Promotional discounts are the worst of the three because they were true when published. A launch offer page saying fifty percent off the first year sits in the index forever unless it is dated or removed. Date every promotional claim in the text itself, not only in metadata, so that a retrieved chunk carries its own expiry: “During our 2026 launch, the first year was half price” ages honestly in a way that “Get 50 percent off” never does.

Seat based, usage based, and the models that confuse everyone

Pricing shape matters as much as pricing level. A model asked how much something costs will try to give a single number, and pricing structures that resist a single number produce the most creative answers.

Usage based pricing is the hardest case. “0.002 dollars per thousand tokens” is precise and useless as an answer to “how much does this cost”, so a model will either quote the unit rate without context or invent a monthly figure. The fix is to publish worked examples in prose: “A team sending 2 million tokens a month pays about 4 dollars; a team at 200 million pays about 400.” Those sentences are retrievable, quotable, and true, and they give the model the shape of the answer rather than a rate it has to do arithmetic on.

Hybrid models with a platform fee plus usage need the same treatment. State the floor, state a typical total, and state what drives the number up. Research on how generative engines use source content points the same way as ordinary editorial sense here: sources that state quantitative claims plainly get used more readily than sources that require inference.

Per seat pricing has its own trap, which is the difference between billed seats and active users. If your page says 49 per user, a model will report 49 per user, and a prospect with 200 employees and 30 licence holders will do the wrong multiplication. Saying “per licensed seat, not per employee” costs six words.

How to audit your pricing in AI answers

Run a fixed set of prompts, at least ten times each, across the engines your buyers use. Ask them four ways: what does X cost, how much is X per month, is X expensive, and X pricing. Different phrasings retrieve differently.

Record three things per run: the number given, the billing period stated, and the URL cited. The URL is the most actionable of the three, because it tells you whether the answer came from your page, a third party, or nothing at all. An answer with no citation is a model guessing, and that is a content gap rather than a correction problem.

Signed, credentialed content is a different lever entirely, as covered in do author pages affect AI citations. Then repeat monthly. Pricing answers are slow to correct after a change, so knowing how long your last update took to propagate tells you how far ahead of a price change you need to publish.

A worked example: a stale price that cost a deal

A B2B tool raised its entry tier from 29 to 49 dollars. The pricing page updated the same day. Six weeks later prospects were still arriving quoting 29, having asked an assistant.

The audit found three causes stacked. The pricing page rendered its numbers client side, so the raw HTML contained no price at all. A two year old blog post titled “why we charge 29 dollars” was fully server rendered and still live, and it was the most retrievable pricing text the company owned. And two competitor comparison pages still listed 29.

The fixes took a week. The pricing page shipped its numbers in the initial HTML with a prose paragraph under the table. The old blog post was updated in place rather than deleted, keeping its URL and inbound links while correcting the number and adding a dated note. And a new comparison page stated current pricing alongside three alternatives. Six weeks after that, the 29 figure had largely dropped out of answers.

Key takeaways

Pricing breaks in AI answers because it changes fastest, renders client side most often, and lives in tables that flatten badly. State every price in a full sentence carrying its own tier, currency and billing period, keep the table as well, and ship the number in the initial HTML rather than from a client side fetch. If you refuse to publish pricing, publish a floor and a shape anyway, because a model asked for a number will find one somewhere. Audit with fixed prompts monthly and record the cited URL, not just the number.

Frequently asked questions

Sources

  1. Dense Passage Retrieval for Open-Domain Question Answering (Karpukhin et al.)
  2. GEO: Generative Engine Optimization (Aggarwal et al.)
  3. Google Search Central: JavaScript SEO basics
  4. Google Search Central: Intro to structured data
  5. Schema.org: Product

Frequently asked questions

Why does ChatGPT give the wrong price for my product?

Usually one of three reasons: the page renders prices with JavaScript so crawlers never saw a number, an old page or cached copy is more retrievable than your current one, or your pricing table flattened into text and lost the link between tier and price. SQSEO surfaces which wrong number is circulating by running pricing prompts against the engines your buyers use.

How should pricing be written so AI engines get it right?

In full sentences that carry their own context. Write the tier, the amount, the currency and the billing period in one sentence, for example the Pro plan is 49 dollars per seat per month billed annually. That sentence survives any chunk boundary during retrieval, while a table cell containing only 49 does not.

Should I remove my pricing table?

No. Tables genuinely help engines extract comparisons and win snippets. Keep the table for humans and for extraction, then add a short prose paragraph beneath it stating each price in a complete sentence. The redundancy looks unnecessary on the page and is exactly what makes the fact survive retrieval intact.

Does structured data fix incorrect pricing in AI answers?

It helps but it does not carry the answer alone. Schema Product and Offer markup gives a machine readable, unambiguous statement of price, currency and billing period, which removes doubt for systems that parse it. Most generative engines read rendered text, so markup is a useful third layer behind prose and the visible table, not a substitute.

What happens if I do not publish pricing at all?

A generative engine asked for a price will often produce one anyway, drawn from a competitor comparison page, a review site estimate, or an old forum post. Classic search showed nothing when you published nothing; generative search fills the gap. Publishing a starting figure and a rough shape keeps a true number in the retrievable pool without exposing your whole model.

When should you not treat a wrong AI price as a content problem?

When the answer cites no source at all. An uncited number is a model filling a gap from category priors, and correcting pages will not touch it until something citable exists for that query. The limit of the fix-the-page approach is that it only works once there is a page worth retrieving, so the first move there is publishing, not editing.

Find the longtail searches your competitors ignore

Turn one seed keyword into hundreds of intent-grouped queries across SEO, AI Overviews, and GEO. Free forever for core research.

Generate free longtails