Common quote problems
Symptoms, causes and fixes. Almost every quote problem is one of three things: a price that was wrong before it was frozen, a clock read in the wrong time zone, or a change made after the freeze.
Symptom to cause
| Symptom | Likely cause | Fix |
|---|---|---|
| Quoted price is lower than expected | An old contract price list still resolves for that account, so the quote drafted from it | Fix the list — Check which price a buyer sees — then revise the quote |
| Quoted price is higher than the customer's usual | The contract list expired between their last order and the quote | Check Valid until on the account's list; renew before revising |
| Line shows "on request" | Nothing prices the article for this buyer, or an explicit on-request entry outranks a price | Price the line manually on the quote; fix the list separately |
| Quote expired a day early | valid_until evaluated in UTC by an integration rather than the tenant time zone | Compare the stored timestamp against the displayed date; see below |
| Buyer cannot accept | Quote is superseded or expired | Revise it. Never re-open by editing |
| Order total differs from the quote | Lines were added after conversion, and were priced live | Compare order lines against the quote PDF |
| Order price differs on every line | The order was created fresh rather than converted from the quote | Cancel and convert properly — Convert a quote to an order |
| Quote sat unsent for days | It was in pending_approval and the approving role has one person in it | Add a deputy — Quote settings |
| Two orders for one quote | Manual conversion after the buyer already accepted online | Cancel one with a reason. Conversion is not idempotent |
| Customer quotes a price from an old version | Version 1 was never superseded because version 2 was created as a new quote | Always use Revise, never New quote, in a negotiation |
A price list changed after the quote was sent
This is the situation people expect to be a problem and it is not: a sent quote holds its own prices and never re-resolves. A price increase on Monday does not touch a quote sent on Friday.
The genuine problem is the reverse case — the quote was drafted from a price list that was already wrong. The freeze preserved the error faithfully. There is no way to correct a sent quote, and that is deliberate: the buyer holds a document with that number on it.
What to do:
- Fix the price list. Every future quote and order is then correct.
- Revise the quote with the corrected prices, and say why in a comment. A buyer told "our list had an error, here is the corrected offer" three days later is annoyed. One told at invoicing is a lost customer.
- If the customer already accepted, honour it or negotiate it. Do not silently invoice a different number.
Validity and time zones
valid_until is a timestamp. The document shows a date. The gap between those
two is where the arguments live.
- A quote valid "until 30 April" ends at 23:59:59 on 30 April in the tenant's time zone. For a German tenant in summer that is 21:59:59 UTC.
- An integration that compares the stored UTC timestamp against its own local midnight will expire the quote up to two hours early, or hold it two hours late.
- A buyer in another market reads the date in their own time zone. A quote that ends at midnight in Frankfurt ended at 15:00 in Chicago.
If quotes are expiring at times nobody expects, read the stored timestamp — not the rendered date — and check what time zone the consumer of that field is in. The same rule applies to price list validity, see Common pricing problems.
The order does not match the quote
Work through it in this order:
- Was it converted, or typed? An order created from scratch is live-priced,
whatever the salesperson intended.
external_refempty means it was typed. - Were lines added after conversion? Added lines take today's price. They are correct behaviour and a common surprise.
- Was a quantity changed? Changing 500 to 480 after conversion does not move the quoted unit price — it was frozen at the 500 rung. That may be exactly what you promised, or a gift you did not intend. Decide deliberately.
- Is the difference only rounding? Check the precision and rounding mode. Two systems rounding differently produce a cent per line, and forty lines produce a conversation — Rounding, defaults and resolution rules.
Quotes that never get answered
Not a technical fault, and the most expensive item in this area. See Reading the quote pipeline for the follow-up discipline. The single highest-yield habit: sort open quotes by days-to-expiry and work the top of the list every Monday.
Next
- Reading the quote pipeline — the numbers behind the symptoms.
- Common pricing problems — when the cause turns out to be a price list.