The estimate is locked to the project — changing it is recorded

An invoice uses the estimate its project was created from; pointing it at a different one takes a confirmation, a written reason, and is stamped with who did it.

What it is

A bound estimate shows a 'Locked to this project' badge. The Change estimate control opens a red confirmation explaining that this estimate is what the customer approved and signed, and requires at least ten characters of explanation before the picker opens. The reason, the user's name and the timestamp are written to the invoice row.

Also called: change the estimate on an invoice · wrong estimate attached · estimate keeps deselecting · override

See it
The estimate is locked to the project — changing it is recorded
Prepared for
Ivy Brubaker
1140 Ridge Line Rd · Fair Play
Shell package$37,113
Concrete & site$10,775
Doors & windows$7,183
Trim & finish$4,789
Total
$59,860
Signature
The red 'Are you sure you want to change the estimate?' panel with the reason textarea and the disabled 'Yes — pick a different estimate' button. src/components/invoices/InvoiceEditor.tsx. Sample data — no customer information appears here.
How it works
  1. 1The binding is resolved once per project and then left alone; it is never re-derived on a background sync.
  2. 2Change estimate on a bound source routes through the confirmation; on an unbound source it opens the picker directly.
  3. 3Only confirming AND then actually picking a different estimate records the override — opening and cancelling records nothing.
  4. 4estimate_override_reason / _by / _at are persisted on the next save.
Why we built it

Picking an estimate by hand did not stick. A background refresh ran every few seconds, re-ran the automatic detection and silently replaced the choice — or cleared it — a moment later, so the field kept deselecting itself and asking to be picked again. A manual choice now locks and is left alone, and pointing an invoice away from the estimate its project came from records the reason, so it is an auditable decision rather than a dialog somebody clicked through once.

The problem
  • A manually chosen estimate being wiped by a background refresh.
  • Silent re-pointing of an invoice at a different estimate with no record.
Sound familiar?
What you get
The default is always the estimate the customer actually signed.
Every deviation carries a name, a date and a reason.

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →