A `{{section.key}}` grammar with dot access, rendered by renderTemplate. Missing tokens render as empty strings so a partially-filled intake form never breaks the document. The token set spans builder identity ({{builder.company_name}}, address, phone, email), customer ({{customer.legal_name}}, mailing address, source of funds, lender clause, co-signer clause), project ({{project.address}}, start/end date, material payment due date, building type, duration), estimate ({{estimate.total}}, material_cost, labor_cost, markup, payment_schedule, line_items_table, subtotal, tax) and governing law (state + notice).
Also called: contract tokens · placeholders · auto-fill contract · {{tokens}} · mail merge contract
- 1TOKEN_REFERENCE in the settings panel lists every token with a description.
- 2buildContractContext() assembles the context from the estimate link, the intake form data, the estimate snapshot and the builder's invoice_settings.
- 3renderTemplate() substitutes with a regex over `{{ token }}`, walking dotted keys and returning '' for anything missing.
- 4Derived tokens are computed, not just copied: end date falls back to start + duration days, material payment due date is start minus 30 days.
The rule that missing tokens render empty is deliberate: 'Missing tokens render as empty strings so a partially-filled form doesn't break the output.' A contract that throws or prints `{{customer.legal_name}}` in front of a customer is worse than one with a blank.
- Copy-paste mistakes between estimate and contract
- Dates and totals that go stale between drafting and sending
- One template that has to serve every customer
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 →