/client/[id]/contract renders the frozen contract body on the builder's letterhead with the builder's brand accent, above a signature block requiring an acknowledgment checkbox, a typed full legal name and drawn ink. On waiver templates it also requires every numbered section to be initialed. Submitting flips the contract to customer_signed and starts the builder's counter-sign clock.
Also called: e-sign contract · customer signature · sign online · digital signature construction
- 1The page loads branding and the contract through the public portal endpoints.
- 2The agreement renders through ContractMarkdown with the tenant's brand colour as the section accent.
- 3The sign button stays disabled until name (3+ chars), ink, acknowledgment and all required initials are present.
- 4POST /api/client-portal/sign-contract re-validates initials server-side, stores the signature, IP and user agent, and raises a persistent counter-sign alert for the builder.
- 5The customer is routed back to their project dashboard.
The page's own header describes the loop: 'customer reviews the auto-generated contract, types their name, draws a signature, and submits. After signing, status flips to customer_signed, a persistent admin alert fires for Chris, and the customer is redirected to the dashboard.' The typed-name rule is deliberately permissive — 'Allow either matching the contact name OR any non-empty typed name — forms can capture a different legal name and that's the binding signature.'
- Print-sign-scan round trips
- In-person signing appointments for a routine document
- No verifiable record of who signed and when
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 →