Template Fields
Fields define what information users enter when creating a matter. Each field has a type that determines how it’s displayed and validated.
Field Definition
Section titled “Field Definition”Every field has these properties:
"field_name": { "type": "text", "label": "Display Label", "required": true, "help": "Optional help text shown below the field"}| Property | Required | Description |
|---|---|---|
type | Yes | The field type (see below) |
label | Yes | Label shown to users |
required | No | Whether the field must be filled (default: false) |
help | No | Explanatory text shown below the field |
Field Types
Section titled “Field Types”A single-line text input. Use for names, references, and short text.
"given_names": { "type": "text", "label": "Given Names", "required": true}In documents: {{ client.given_names }}
textarea
Section titled “textarea”A multi-line text area. Use for addresses, notes, or longer text.
"notes": { "type": "textarea", "label": "File Notes", "required": false}In documents: {{ matter.notes }}
A date picker. Stores dates in ISO format (YYYY-MM-DD).
"date_of_birth": { "type": "date", "label": "Date of Birth", "required": false}In documents:
- Raw:
{{ client.date_of_birth }}→ “2026-01-15” - Formatted:
{{ client.date_of_birth | date("%-d %B %Y") }}→ “15 January 2026”
currency
Section titled “currency”A number input formatted as currency.
"purchase_price": { "type": "currency", "label": "Purchase Price", "required": true}In documents: {{ matter.purchase_price }} → “$150,000.00”
number
Section titled “number”A numeric input (no currency formatting).
"number_of_beneficiaries": { "type": "number", "label": "Number of Beneficiaries", "required": false}In documents: {{ estate.number_of_beneficiaries }}
A phone number input.
"phone": { "type": "phone", "label": "Phone Number", "required": false}In documents: {{ client.phone }}
An email address input with validation.
"email": { "type": "email", "label": "Email Address", "required": false}In documents: {{ client.email }}
select
Section titled “select”A dropdown menu with predefined options.
"state": { "type": "select", "label": "State", "options": ["NSW", "VIC", "QLD", "SA", "WA", "TAS", "NT", "ACT"], "required": true}In documents: {{ client.state }}
boolean
Section titled “boolean”A yes/no checkbox.
"has_will": { "type": "boolean", "label": "Deceased had a Will", "required": false}In documents: {{ estate.has_will }} → “true” or “false”
Layout Properties
Section titled “Layout Properties”Controls field width for multi-column layouts. When multiple fields share the same row, narrower widths let them sit side by side.
| Value | Width | Use for |
|---|---|---|
"full" | 100% (default) | Addresses, notes, long text |
"half" | 50% | Names, dates, phone numbers |
"third" | 33% | State, postcode, short codes |
{ "key": "client.given_names", "type": "text", "label": "Given Names", "width": "half"},{ "key": "client.surname", "type": "text", "label": "Surname", "width": "half"}quick_entry
Section titled “quick_entry”Mark a field with "quick_entry": true to include it in the Quick Entry panel. Quick Entry mode presents only the most essential fields so users can capture key information fast and fill in remaining details later.
{ "key": "client.surname", "type": "text", "label": "Surname", "required": true, "quick_entry": true}Optional Properties
Section titled “Optional Properties”Explanatory text shown below the field:
"re_line": { "type": "text", "label": "Re: Line", "help": "Brief description used in folder naming and correspondence"}placeholder
Section titled “placeholder”Placeholder text shown in empty fields:
"email": { "type": "email", "label": "Email",}default
Section titled “default”Default value pre-filled in the field:
"state": { "type": "select", "label": "State", "options": ["NSW", "VIC", "QLD", "SA", "WA", "TAS", "NT", "ACT"], "default": "NSW"}Field Naming Conventions
Section titled “Field Naming Conventions”Structure
Section titled “Structure”Fields are organised into blocks:
{{ block_name.field_name }}Common block names:
client— Client informationmatter— Matter detailsestate— Estate-specific (for Estates template)property— Property details (for Conveyancing)
Boolean Naming Conventions
Section titled “Boolean Naming Conventions”Boolean fields follow a standard naming pattern that enables automatic inverse field generation:
| Prefix | Meaning | Example |
|---|---|---|
is_* | State or characteristic | property.is_strata, sale.is_auction |
has_* | Presence of something | property.has_pool, client.has_poa |
For each is_* field, Certum Draft automatically creates a not_* inverse. For each has_* field, it creates a no_* inverse. You can also define additional inverses explicitly using the hidden_fields array in matter.json:
"hidden_fields": [ { "key": "property.is_not_strata", "inverse_of": "property.is_strata" }]Hidden fields do not appear in forms but are available in document templates.
Best Practices
Section titled “Best Practices”| Do | Don’t |
|---|---|
client.full_name | clientFullName |
matter.settlement_date | settlementDate |
estate.deceased_name | deceased |
property.is_strata | strata_yn |
client.has_poa | poa_exists |
Use lowercase with underscores. Be descriptive but concise.
Reference Fields
Section titled “Reference Fields”Reference fields display a read-only mirror of a field defined in another block. They’re perfect for creating “checklist” blocks that show all the data needed for a specific letter in one place.
{ "key": "ref.is_strata", "label": "Property is Strata", "type": "reference", "reference_key": "property.is_strata"}| Property | Required | Description |
|---|---|---|
type | Yes | Must be "reference" |
label | Yes | Label shown to users |
reference_key | Yes | The dot-notation key of the source field (e.g., "property.is_strata") |
Reference fields:
- Show the current value of the source field in real time
- Display a Ref badge to distinguish them from editable fields
- Render boolean values as disabled checkboxes for quick visual confirmation
- Include a navigation arrow that jumps to the source block for editing
- Should never be marked as
required— they don’t represent data entry - Don’t affect completion tracking
Example: Letter Checklist Block
Section titled “Example: Letter Checklist Block”{ "name": "Sending Contract Checklist", "description": "Quick reference for the Letter to Client Sending Contract", "workflow_stage": "contract", "collapsed": true, "fields": [ { "key": "ref.is_strata", "label": "Property is Strata", "type": "reference", "reference_key": "property.is_strata" }, { "key": "ref.swimming_pool", "label": "Has Swimming Pool", "type": "reference", "reference_key": "property.swimming_pool" }, { "key": "ref.is_auction", "label": "Sale by Auction", "type": "reference", "reference_key": "sale.is_auction" }, { "key": "ref.agency_name", "label": "Agent", "type": "reference", "reference_key": "agent.agency_name" } ]}Computed Fields
Section titled “Computed Fields”Some fields are calculated from other fields using the computed_from property:
{ "key": "client.full_name", "type": "text", "label": "Full Name", "computed_from": "{client.title} {client.given_names} {client.surname}"}The value is recalculated automatically whenever any of its source fields change.
Computed Functions
Section titled “Computed Functions”In addition to simple interpolation ({field1} {field2}), you can use these functions:
| Function | Description | Example |
|---|---|---|
uppercase() | Converts to uppercase | uppercase({client.surname}) |
join_non_empty() | Joins non-empty values with a separator | join_non_empty(", ", {client.suburb}, {client.state}, {client.postcode}) |
choose() | Returns first matching value (2, 3, or 4 args) | choose({property.is_strata}, "Strata", "Torrens") |
scale() | Multiplies a currency/number by a factor | scale({purchase.price}, 0.1) |
multiply() | Multiplies two values | multiply({loan.rate}, {loan.principal}) |
date_add() | Adds days to a date | date_add({matter.exchange_date}, 42) |
{ "key": "purchase.deposit_amount", "type": "currency", "label": "Deposit (10%)", "computed_from": "scale({purchase.price}, 0.1)"}{ "key": "matter.settlement_date", "type": "date", "label": "Settlement Date", "computed_from": "date_add({matter.exchange_date}, 42)"}Auto-Injected Date Variables
Section titled “Auto-Injected Date Variables”Certum Draft automatically provides these date variables in every template context — you do not need to define them as fields:
| Variable | Format | Example |
|---|---|---|
today.date_long | Full date | ”6 April 2026” |
today.date_short | Short date | ”06/04/2026” |
today.year | Year only | ”2026” |
Use them in document templates:
This letter is dated {{ today.date_long }}.Common computed fields:
full_name— Combines title, given names, and surnameaddress— Combines street, suburb, state, postcode
Required vs Optional
Section titled “Required vs Optional”Mark fields as required: true when:
- The field is essential for most documents
- Missing data would cause obvious problems
Mark fields as required: false when:
- The field is only needed sometimes
- Not all matters have this information
Example: Complete Client Block
Section titled “Example: Complete Client Block”"client": { "label": "Client Details", "fields": { "title": { "type": "select", "label": "Title", "options": ["Mr", "Mrs", "Ms", "Dr", "Prof"], "required": false }, "given_names": { "type": "text", "label": "Given Names", "required": true }, "surname": { "type": "text", "label": "Surname", "required": true }, "full_name": { "type": "computed", "label": "Full Name" }, "date_of_birth": { "type": "date", "label": "Date of Birth", "required": false }, "street_address": { "type": "text", "label": "Street Address", "required": true }, "suburb": { "type": "text", "label": "Suburb", "required": true }, "state": { "type": "select", "label": "State", "options": ["NSW", "VIC", "QLD", "SA", "WA", "TAS", "NT", "ACT"], "required": true, "default": "NSW" }, "postcode": { "type": "text", "label": "Postcode", "required": true }, "phone": { "type": "phone", "label": "Phone", "required": false }, "email": { "type": "email", "label": "Email", "required": false } }}