Docs

Workflows

When something happens, do something about it.

How a workflow runs

A workflow is a trigger, an optional set of conditions and an ordered list of steps. When the trigger fires, conditions are checked against the event; if they all hold, a run starts and the steps execute in order.

Every run is recorded with each step's input, output, error and attempt count. That run log is where you look first when something does not fire.

A workflow only ever sees events that happened after it was created, so switching one on never floods your log with history.

Triggers

Time-relative triggers move with the meeting and are cancelled with it.

TriggerFires
booking.createdA booking is made
booking.rescheduledA booking is rescheduled
booking.cancelledA booking is cancelled
booking.no_showAn invitee does not show up
sync.errorA calendar fails to sync
sync.drift_detectedSync drift is detected
account.connectedA calendar account is connected
account.needs_reauthAn account needs reconnecting
workflow.failedA workflow run fails
booking.beforeBefore a meeting starts
booking.afterAfter a meeting ends
scheduleOn a schedule

Steps

Steps that cost money are metered against your monthly credits.

ActionWhat it doesNeeds
send_emailEmail the invitee, the host, or anyone else.
send_smsText the invitee or the host. Uses your monthly SMS credits.sms credits
waitPause before the next step.
http_requestSend an HTTP request to any service. The response is available to later steps.
cancel_bookingCalls off the meeting this run is about, and tells both sides.
slack_postSend a message to a channel in your connected workspace.slack
crm_upsertFinds the HubSpot contact by email, or creates it.hubspot
crm_log_meetingRecords this booking against the contact in HubSpot.hubspot
ai_generateGenerates text for a later step to send. Uses your monthly AI credits.ai credits
ai_briefSummarises who you are meeting and what they said. Uses AI credits.ai credits

Placeholders

Any text field can carry `{{path}}` placeholders, filled from the run's context. An unknown path renders empty and is reported in the run log rather than failing silently.

Later steps can read earlier ones: `{{steps.0.output.text}}`.

{{booking.inviteeName}}     Their full name
{{booking.inviteeFirstName}} Just the first name
{{booking.inviteeEmail}}    Their email
{{booking.date}}            Friday 3 October 2026
{{booking.time}}            14:30, in their zone
{{booking.hostTime}}        The same moment, in yours
{{booking.rescheduleUrl}}   Their reschedule link
{{booking.cancelUrl}}       Their cancel link
{{booking.answers.<key>}}   An answer to a booking question
{{eventType.title}}         The event type's name
{{host.name}}               Your name

Idempotency

Each step carries a key derived from its run and its position, and actions with external side effects pass it on. A retried step will not text someone twice.

A step that fails for a reason a retry cannot fix — a malformed address, a missing channel, a 4xx — stops immediately and says so, instead of burning the retry budget.