A three-level authority chain. The approved estimate link's frozen snapshot beats the live estimate; a fully-executed contract for that same link beats the snapshot. The contract's total is read out of the frozen rendered_body — the exact text that was signed — rather than recomputed, because anything recomputed can drift again.
Also called: contract price vs estimate price · billed the wrong amount · signed total · estimate changed after signing
- 1Look up the newest approved estimate_links row for the job and take its frozen snapshot (materials, labour, markup, total, payment stages).
- 2Look up the fully-executed contract bound to that specific link id and parse 'Total Project Price' out of its rendered body.
- 3The signed total becomes the invoice's grand total; the estimate total travels alongside it so the gap can be shown.
- 4If no contract exists, the approved snapshot stands; if no approval exists, live sources are used.
Invoices were priced off the live estimate, which keeps moving after the customer signs. On one job the approved estimate read $37,828.19 while the contract the customer had actually signed read $34,016.87 — the estimate had been edited after the contract was drawn — so the bill went out at a number nobody had ever agreed to. Once a contract is fully executed, its frozen figures are what the invoice prices from, and a later estimate edit no longer overrides a signature.
- Invoicing at a price that moved after the customer signed.
- Two documents (estimate and contract) disagreeing with no rule about which wins.
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 →