When you write the body of a Send SMS or Send email step in a custom automation, you can drop in {{variable}} placeholders. At run time, Run a Call substitutes the real value.
There are two sources:
- Trigger data — whatever record kicked off the automation (customer, job, invoice, membership, appointment, or a webhook payload).
- Earlier step outputs — anything a Get or Create / Update step returned earlier in the same run.
Trigger variables
The exact fields depend on which trigger you chose. Here are the common ones:
Customer triggers
| Variable | Example |
|---|---|
{{customer.first_name}} | Sarah |
{{customer.last_name}} | Chen |
{{customer.company_name}} | Chen HVAC |
{{customer.phone}} | +15551234567 |
{{customer.email}} | sarah@example.com |
Job / appointment triggers
| Variable | Example |
|---|---|
{{job.title}} | AC not cooling |
{{job.description}} | Upstairs system, condenser fan not spinning |
{{job.status}} | Scheduled |
{{job.scheduled_start}} | Tomorrow, 9–11 AM (rendered as a local window) |
{{job.property_address}} | 123 Main St, Austin TX |
{{appointment.scheduled_start}} / {{appointment.scheduled_end}} | Appointment-level times |
{{tech.first_name}} | The assigned tech, when present |
Estimate / invoice / payment triggers
| Variable | Example |
|---|---|
{{estimate.number}} | EST-1042 |
{{estimate.total}} | $4,250.00 |
{{estimate.public_url}} | Link the customer can open to sign |
{{invoice.number}} | INV-2087 |
{{invoice.total}} | $1,800.00 |
{{invoice.balance_due}} | $1,800.00 |
{{invoice.public_url}} / {{invoice.pay_link}} | Customer-facing view and Stripe pay link |
{{payment.amount}} | $500.00 |
{{payment.method}} | card / ach / cash / check |
Membership triggers
| Variable | Example |
|---|---|
{{membership.plan_name}} | Comfort Club |
{{membership.next_billing_date}} | Sep 1, 2026 |
{{membership.status}} | active / paused / overdue |
Org / business
Available in every context:
| Variable | Example |
|---|---|
{{org.name}} / {{business_name}} | Acme Heating |
{{org.phone}} | Main line customers call back to |
{{org.review_url}} | Your Google review link (drives the review-request SMS) |
Step-output variables
Anything you Get or Create / Update earlier in the flow can be referenced downstream with {{steps.STEP_ID.output.FIELD}}.
Example: you add a Get customer step (name it existing), then a Send SMS step:
Hi {{steps.existing.output.first_name}}, quick reminder…
This is how you re-read a customer after a preceding step updated them, or how you fan the result of a webhook step into a message.
Inbound webhook variables
An Inbound webhook trigger exposes the raw JSON body under {{body.*}}. If the caller sends:
{"lead_source": "Facebook", "first_name": "Sarah"}
You can use {{body.lead_source}} and {{body.first_name}} in downstream steps. Missing fields render as an empty string.
What renders when a variable is missing
If a variable can't resolve (no first name, no assigned tech, an unset field in the webhook payload), the substitution falls back to an empty string. Test with the run history — see Viewing automation runs.
Not supported today
- Conditional formatting inside a message body (
{{if VIP}} … {{else}} …) is not available. Use a Paths step to send different messages instead — see Filters, paths, and delays. - Custom user-defined variables (say,
{{my_custom_field}}) aren't in the system. Read the field from the record itself with a Get step. - System-template copy is fixed today. Variables above apply only to custom SMS / email steps you write yourself.