Perplexity put a competitor's pricing in our row of a comparison table. We found it in a sales call.
This one actually cost us a deal. A prospect ran Perplexity before our call, asked it to compare us with two competitors on pricing. Perplexity returned a table where our pricing row showed the competitor's numbers — roughly 3x what we actually charge.
Prospect came in convinced we were enterprise-priced. took 15 minutes to unsell that.
Diagnosis after some digging:
Our pricing page was React-rendered. Like, the actual price numbers were loaded via a JS component. Perplexity's bot got an empty shell when it crawled. So it filled in with... the nearest visible pricing it could find elsewhere. Which happened to be the competitor's.
Fix was not fun but not that hard either:
- Moved pricing to static HTML (still looks identical to users)
- Added Product schema with
offers.priceandoffers.priceCurrency - Added a
/pricing.jsonendpoint that returns our plans as structured data
Perplexity corrected the table in their next crawl, roughly 12 days later.
The lesson: if your pricing is JS-rendered or behind any kind of load event, you're basically inviting AI engines to guess. And they'll guess from the wrong source.
Anyone else caught pricing hallucinations specifically? This seems like a category of bug that most teams don't know to look for.
5 replies
- Inês Pereira
The /pricing.json endpoint idea is underrated. We added one and it functions as ground truth for any programmatic consumer. Takes about 20 minutes to set up. Our Perplexity pricing accuracy improved within 2 weeks of adding it.
- Petr VlčekFounder
Petr here — the 'fill in from nearest competitor' behavior is consistent across Perplexity and ChatGPT when they encounter JS-only pricing. It's not random, they tend to fill from whichever competitor has the most structurally visible pricing in your category. Worth curl-testing your /pricing page today if you haven't recently.
- Sara
Adding to the sales-call angle: we now have a Slack alert that triggers if any prospect mentions a price for our product in the discovery call that doesn't match our actual pricing page. Caught two hallucinations this quarter — both were Perplexity pulling stale numbers from a 2024 changelog. Cost of setup was about 30 minutes. Cost of not catching one of those before a procurement conversation is a deal.
- Marcus B.
Monitoring framing: treat 'AI engines stating a price for our product' as a data quality signal, not a marketing one. Sample the top 5 pricing-related prompts daily, parse out numeric tokens, alert on any deviation > 5% from the canonical pricing.json. We piped this into the same channel where Stripe failed-charge alerts land. It treats brand misrepresentation like any other production incident, which is roughly the right altitude.
The JS-rendered pricing issue is more common than people realize. I just checked 8 indie SaaS sites in my network and 5 of them have pricing that returns empty HTML when you curl the page without JS. It's a default behavior of most React + Tailwind setups and basically nobody checks it from the bot perspective.