Building DOCX templates
A few practical tips on writing DOCX files that parse well into concorbit's contract renderer.
Merge field syntax
{{ field_name }}
Double curly braces, optional whitespace inside
Field names are letters, numbers, and underscores only (
company_name✓,Company Namebecomescompany_nameautomatically,co-namebecomesco_name)Case-insensitive:
{{ COMPANY_NAME }}and{{ company_name }}reach the same fieldSame field can appear multiple times in the document, and every occurrence gets the same value
What renders cleanly
Headings (Heading 1, 2, 3 styles): render as
h1/h2/h3Paragraphs: preserved with line breaks
Bold, italic, underline: preserved
Bullet lists and numbered lists: render as
<ul>list itemsTables: basic tables with rows and columns render as HTML tables
Hyperlinks: preserved as clickable accent-coloured links
What gets stripped
Headers and footers (page-level chrome, not relevant in browser rendering)
Footnotes and endnotes
Embedded images (won't break the contract; they just don't appear)
Text boxes, shapes, and SmartArt
Complex multi-column layouts
Track-changes annotations (accept changes before uploading)
Recommended workflow
Draft in Word/Pages with normal formatting
Upload to concorbit to see how it renders in the browser
Open a test contract (with yourself as recipient) to preview
Iterate: re-upload the DOCX whenever you tweak the source
The DOCX is the master copy. concorbit caches the rendered HTML for performance, but re-uploading always regenerates from source.
Common merge fields
There's no fixed schema: you can name fields whatever you like. But a few conventional names play well with concorbit's auto-fill (planned for a future release):
company_name: the recipient's companycontact_name: the recipient's full name (first + last)contact_email: the recipient's emaileffective_date: when the contract takes effecttermination_date: when the contract endstenant_name: your business namesigner_name: name to print under the signature linesigner_title: job title
These don't auto-populate today (you fill them in per-contract), but using these names means future auto-fill features will Just Work for you.
Testing your template
Always test new templates by sending one to yourself before sending to a real customer. Common things to catch:
A field name typo means that occurrence won't substitute (will appear as-is in the rendered contract)
An unfilled field shows as an empty string, defence in depth, but you usually want to fill them all
Merge fields inside tables or list items work the same as in paragraphs