Contract_templates rows hold `version`; saving an existing template updates it in place with version + 1. Each contracts row stores template_id and template_version alongside the frozen rendered_body. The settings panel shows the current version (v3) beside the save button, and the confirmation copy states plainly that 'Previously-signed contracts keep their frozen copy and aren't affected.'
Also called: contract version history · contract audit trail · template versions
- 1saveTemplate() reads the existing row, writes version: (existing.version || 1) + 1.
- 2New contracts stamp template_id + template_version at generation.
- 3The frozen rendered_body on the contract is the legally operative text; the template row is provenance.
- 4apply-template and sync-estimate both restamp template_id/version when they re-render an unsigned contract.
The freeze rule is stated at the top of the contracts library: the rendered body is frozen 'so future edits to the template don't rewrite this customer's contract.' Version numbering exists so a builder can answer, months later, exactly which wording a given customer agreed to.
- Retroactive edits to legal text a customer already accepted
- No provenance for which wording was in force on a given date
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 →