The sync route reports syncable: false when customer_signed_at or counter_signed_at is set, and the POST returns a 409 with the message 'This contract has a signature on it — its numbers are locked. Use a change order or amendment for post-signature changes.' The panel shows the same guidance instead of a button.
Also called: can't change a signed contract · amend instead of edit · contract is evidence
- 1GET computes signed = customer_signed_at || counter_signed_at and returns syncable: !signed.
- 2The UI renders 'A signature is already on this contract, so its numbers are locked — use a change order to adjust it.'
- 3POST re-checks server-side and refuses regardless of what the client sends.
- 4apply-template applies the same rule: only 'pending' or 'sent' contracts can be re-rendered.
The route header states the principle without hedging: 'Hard guard: NEVER after anyone has signed. A signed document is evidence; changing its numbers would falsify it. Post-signature changes go through change orders / amendment contracts instead.'
- Silent edits to executed agreements
- No clear instrument for post-signature scope or price changes
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 →