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.