A commercial cleaning company asked me to look at their AI receptionist because "it keeps giving the wrong prices." I pulled 143 quotes from one quarter — every enquiry where the AI had produced a number and a human had later quoted the same job.
59 of them disagreed. That's 41%. The average gap was 18%, and in one case the AI said $1,850 and the account manager quoted $2,400 for the same square footage and the same frequency.
The customer had both numbers in writing, four days apart.
It was never a model problem
My first assumption was hallucination. It wasn't. I read the transcripts. The AI was reading from a real document — a 2023 price sheet in a shared drive. The salesperson was reading from a 2025 sheet in his own email. The CRM had a third set of numbers that matched neither.
Three sources of truth, all of them officially correct, none of them reconciled:
| Source | Who used it | Last updated | Monthly minimum |
|---|---|---|---|
| Price sheet v3 (shared drive) | AI agent | March 2023 | $480 |
| Price sheet v5 (sales inbox) | Account managers | Jan 2025 | $620 |
| CRM product list | Quotes generated in CRM | Partial migration | $550 |
The AI wasn't wrong. It was consistently loyal to a document nobody had retired. That's a much easier problem to fix, and a much worse one to leave alone — because a customer who catches you quoting two prices doesn't conclude "their data is messy." They conclude "they're making it up as they go."
Quote consistency is a data governance problem wearing a prompt's clothing. If you tune the prompt first, you will make the agent more confident about the wrong number.
Step 1 — One price authority, or none
The fix starts before any prompt work. Nominate exactly one artefact as the price authority and give it a version and an expiry date. Everything else becomes a derived copy that is allowed to be wrong, because it's not the authority.
Here's the structure I use. One file, one row per sellable unit, no prose:
sku,unit,list_price,min_qty,tier_2_qty,tier_2_price,floor_price,effective_from,expires,notes
CLEAN-STD-SQFT,sqft,0.14,2000,5000,0.11,0.09,2026-01-01,2026-12-31,excludes consumables
CLEAN-DEEP-SQFT,sqft,0.31,1000,3000,0.26,0.22,2026-01-01,2026-12-31,first clean only
CLEAN-WEEKLY-VISIT,visit,180,1,4,155,140,2026-01-01,2026-12-31,min 4 visits/month
Three rules make this file usable by an agent:
-
expiresis mandatory. An expired price is worse than no price, because the agent will confidently quote it. Give the agent an instruction: if today's date is pastexpires, say the number needs confirming and escalate. Do not let it extrapolate. -
floor_priceis not the agent's business. The agent quotes list or tier price. Floors exist for humans. If the agent can see the floor, it will eventually use it to close a deal, and you'll have given away margin to a machine that was trying to be helpful. -
notescarries exclusions only. Not sales guidance, not "good margin here." Anything that reads like advice gets paraphrased into a promise.
Then delete or watermark the old sheets. I'm serious about this one. The 2023 sheet in that shared drive was still there eighteen months after it stopped being true, and it was the first search result for "price."
Step 2 — Force a quote shape, not a quote sentence
Most agents produce prices as prose: "For a 3,000 sq ft office, weekly cleaning would be around $420 per visit." That sentence is un-auditable. You can't diff it against anything, and it invites the customer to negotiate against a vibe.
Make the agent emit a fixed block instead:
QUOTE
Service: [service name]
Quantity: [number] [unit]
Unit price: $[x] per [unit] (tier: [list/tier 2])
Line total: $[x]
Assumptions: [up to 3 — access hours, frequency, exclusions]
Valid until: [date from expires field]
Not included: [consumables / travel / after-hours]
Next step: [book survey / confirm frequency / human review]
This does three things at once. It makes every quote comparable in a spreadsheet. It makes the assumptions explicit, which is where 80% of disputes actually live ("you didn't say it was three floors"). And it forces the agent to name what it is not quoting, which is the single most common cause of the angry phone call after the invoice.
The Valid until field is doing quiet work too. It gives the agent a legitimate reason to say "that price was valid through March 31" when a customer digs up an old email, instead of arguing.
Step 3 — Measure drift weekly, not anecdotally
You cannot manage this by reading transcripts. Build one small report: for every job that got both an AI quote and a human quote, compute the gap.
Week of: ____
Jobs quoted by AI then by human: ____
Quotes that matched (±2%): ____%
Median gap: ____%
Largest gap: ____% on [service]
Gap direction: AI higher ____% / AI lower ____%
Two patterns are worth watching for:
- AI consistently lower than human. Usually a stale tier, a missing quantity break, or the agent applying a discount it wasn't supposed to know about. The commercial risk is that customers arrive at the human expecting the AI number, and the human eats the difference to keep the deal — which trains everyone to distrust the AI and quietly destroys the margin.
- AI consistently higher than human. Usually the agent is quoting list price while humans routinely discount 10–15% off-sheet. That's not an AI bug; that's an undocumented discount policy. Write it down or stop doing it.
At the cleaning company, after we consolidated to one sheet and added the quote block, the mismatch rate went from 41% to 6% in five weeks. The remaining 6% were almost all legitimate: site surveys that found something the phone call couldn't.
Step 4 — Publish the discount authority
The moment two people can quote, you need a table saying who can move the number and by how much. Otherwise the AI quotes list, the human quotes list-minus-15, and the customer learns to always ask for a human.
| Role | Discount authority | Must record |
|---|---|---|
| AI agent | 0% — list or published tier only | full quote block in transcript |
| Front desk | 5% | reason code |
| Account manager | 12% | reason code + competitor reference |
| Sales lead | 20% | written approval |
| Below floor | Owner only | — |
Give the agent one line to use when pushed: "I can't adjust pricing, but I can put you with someone who can look at the whole job." That's honest, it protects the floor, and it routes the negotiation to a human who is allowed to have it. An agent that improvises a discount to be helpful is the most expensive kind of helpful.
Step 5 — Reconcile before the contract, not after
One checklist item prevents most of this. Before any quote becomes a contract, someone compares the AI's quote block to the final human quote and records the delta. Thirty seconds per job.
[ ] AI quote exists and is attached to the deal
[ ] Final quote price = AI price, or delta has a reason code
[ ] Assumptions in AI quote match what the survey found
[ ] Validity date on final quote is in the future
[ ] Exclusions on final quote are the same list the AI gave
[ ] If discount applied: within role authority, reason recorded
That last-but-one line catches a surprising amount. The AI says "not included: consumables." The human's final quote drops that line to look cleaner. Six weeks later the customer gets a consumables invoice and calls it a bait-and-switch.
The thing that actually costs you
Nobody loses a deal because the AI quoted $1,850 instead of $1,900. You lose deals — and referrals, and the benefit of the doubt — when a customer can prove you gave them two different numbers for the same work and can't explain why.
Consistency is cheaper than accuracy here. An agent that quotes slightly high but always the same number is more trustworthy than one that quotes perfectly and changes its mind when a different person picks up the phone.
Start with the price file. Add the expires column today, retire the old sheets this week, and make the agent emit the quote block instead of a sentence. You'll find your drift number within a month, and it will be higher than you expect.
The price-authority template, the quote block, and the reconciliation checklist are part of the kit I run on deployments: Agent Audit Pack
Top comments (0)