Manual Letters & Emails — Messages

Variables — what they are and how to use them

A variable is a placeholder in the message body that gets replaced with real data when the message is sent.

Why bother

Without variables, every message would say the same thing:

Dear staff member, your application has been approved.

With variables:

Dear Ahmad bin Ali, your leave application from 3 May to 5 May has been approved by Siti binti Yusof.

Same template, personalised per send.

How they look

Dear {{ staff.full_name }},

Your leave from {{ leave.start_date }} to {{ leave.end_date }} has
been approved by {{ approver.name }}.

A variable is {{ … }} — two curly braces, a path, two more curly braces.

Where they come from

Three sources:

1. Source table fields

The most common case. If you set a Source table, every column on that table is available as a variable named after its column:

{{ leave_applications.start_date }}
{{ leave_applications.staff_id }}
{{ leave_applications.reason }}

2. Linked tables

If your source table has links (foreign keys) to other tables, you can walk the link:

{{ leave_applications.staff.full_name }}
{{ leave_applications.staff.email }}
{{ leave_applications.leave_type.name }}

3. System variables

Always available — no source table required:

{{ now }}              The current date & time
{{ today }}            Today's date
{{ user.name }}        The currently signed-in user
{{ app.name }}         The app's display name

The variable picker

Don't memorise paths. Click the { } Insert variable button in the body editor. A picker shows every variable available for this message — click to insert at the cursor.

Formatting

Variables come out as plain values by default. Add a filter for formatting:

{{ leave.start_date | date('d M Y') }}     → 3 May 2025
{{ amount | money }}                        → RM 1,250.00
{{ status | upper }}                        → APPROVED

Common filters:

  • date('d M Y') — format a date.
  • money — RM amount with thousand separator.
  • upper / lower — change case.
  • default('—') — fall back if value is empty.

Where to next

  • Common mistakes — variables that look right but break.