Every custom automation starts with a trigger — the event that kicks off the flow. Pick one when you create an automation. You can't change a trigger later — you'd delete and rebuild.

Triggers fall into six categories.
Customer triggers
| Trigger | Fires when… |
|---|---|
| Customer created | A new customer is added — from a call, a booking, an import, or by hand. |
| Customer updated | Any customer field changes (name, phone, email, address, notes). |
| Tag assigned to customer | A tag is added. Optional config: scope to a specific tag ("VIP") — leave blank to fire on any tag. |
Job triggers
| Trigger | Fires when… |
|---|---|
| Job scheduled | A job is placed on the schedule (from any source — office, mobile, booking, AI Receptionist). |
| Job status changed | The job status moves. Optional config: fire only on a specific target status ("Completed"). |
| Job completed | Shortcut for the common case — the job is marked complete. |
| Tag assigned to job | Same as customer-tag but on a job record. Optional per-tag filter. |
Appointment triggers
Appointment-level, not job-level. Multi-day jobs have multiple appointments — each fires its own event.
| Trigger | Fires when… |
|---|---|
| Appointment scheduled | A specific visit is placed on the schedule. |
| Appointment completed | A specific visit is marked complete. |
Estimate / invoice / payment triggers
| Trigger | Fires when… |
|---|---|
| Estimate sent | You send an estimate to the customer. |
| Estimate approved | The customer approves the estimate via the public link. |
| Invoice issued | You send an invoice. |
| Invoice paid | The invoice is fully paid (last payment brings the balance to zero). |
| Payment received | Any payment lands — fires per payment, not per invoice. Partial payments still fire this. |
Membership triggers
| Trigger | Fires when… |
|---|---|
| Membership created | A customer is enrolled in a plan. |
| Membership renewed | An active membership renews (auto or manual). |
Inbound webhook
Every automation with an inbound-webhook trigger gets a unique URL. Anything that can POST JSON can fire it — Zapier, Make, a form on your website, a script.
The JSON body becomes available downstream as {{body.*}}. See Triggering automations from an inbound webhook.
Choosing between trigger and filter
Some triggers overlap — Job status changed with a "Completed" filter looks a lot like Job completed. Rule of thumb:
- If a dedicated trigger exists (Job completed, Invoice paid), use it. Cleaner and cheaper.
- If you need to react to a specific status other than the dedicated one (e.g. Job status changed → Cancelled), use the general Job status changed and set the target status in the trigger config.
What's not a trigger today
- Customer opens an email — not tracked as an event.
- Customer clicks a link in an SMS — not tracked.
- A specific date on the calendar (e.g. "every October 1") — not yet. Workaround: send yourself an inbound-webhook cron from another tool.
- Voice call events (missed call, completed call) — not yet exposed to Automations. Handled by AI Receptionist follow-ups.
- Field-tech clock in / out — not yet.