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:

  1. Trigger data — whatever record kicked off the automation (customer, job, invoice, membership, appointment, or a webhook payload).
  2. 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

VariableExample
{{customer.first_name}}Sarah
{{customer.last_name}}Chen
{{customer.company_name}}Chen HVAC
{{customer.phone}}+15551234567
{{customer.email}}sarah@example.com

Job / appointment triggers

VariableExample
{{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

VariableExample
{{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

VariableExample
{{membership.plan_name}}Comfort Club
{{membership.next_billing_date}}Sep 1, 2026
{{membership.status}}active / paused / overdue

Org / business

Available in every context:

VariableExample
{{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.