At generation, every numbered '### N. Title' heading in the rendered body becomes a required section, frozen on the contract as required_sections (e.g. [{ id: 'waiver-1', title: 'Materials' }]). At signing, each section's 'Client Initials: ___' line is replaced by an interactive slot; captured initials are stored in section_initials as { image, at } per section. Templates with no numbered sections require no initials at all.
Also called: client initials · initial each section · waiver initials · customer says they never read that clause · initial every page · client initials on each section
- 1extractRequiredSections() scans the rendered body for numbered H3s and freezes the manifest on the contract row.
- 2ContractMarkdown tracks the current numbered section while parsing and swaps the literal 'Client Initials:' paragraph for a rendered slot.
- 3The customer draws initials once on a shared pad, then taps each section to stamp them, with an undo per section.
- 4The sign button stays disabled until every required section is initialed, and the server re-validates before accepting.
- 5Signed contracts render the captured images back into the same slots, in the viewer and in print.
Migration 064 states the requirement in the builder's own terms: 'Some sub-accounts (e.g. Graber Custom Structures) require the customer to INITIAL each clause of a waiver — undeniable evidence each section was read and accepted, section by section, not just one signature at the end.' The manifest is frozen for the same reason the body is: 'Frozen on the contract row (like rendered_body) so a later template edit can never desync a signed contract.'
- Disputes over individual clauses in a signed contract
- No per-clause evidence of acknowledgment
- Paper waivers requiring thirteen physical initials
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 →