Workflows
Triggers
new-booking— fires when a booking is createdbefore-event— offset minutes BEFOREstartTimeafter-event— offset minutes AFTERendTimereschedule— booking rescheduledcancellation— booking cancelledno-show— a host marked an attendee as no-show
Steps
| Action | Sends |
|---|---|
email-host |
Email to the organizer |
email-attendee |
Email to the attendee |
email-address |
Email to a fixed address (e.g. ops@example.com) |
sms-attendee |
SMS to the attendee's phone (requires attendee phone custom field) |
sms-host |
SMS to the host |
sms-number |
SMS to a fixed number |
webhook |
HTTP POST to a URL |
Step offsetMinutes is relative to the trigger time. For before-event
use positive values (we apply them with a minus sign internally).
Template variables
In email subjects / bodies and SMS bodies:
{eventName}— event type title{attendeeName},{attendeeEmail}— first attendee{hostName},{hostEmail}— organizer{startTime},{endTime}— formatted in host's timezone{location}— meeting URL or address{cancelUrl},{rescheduleUrl}— public magic links
Firing
When a booking fires a trigger, the hook dispatcher materializes rows in
scheduled_reminders. A recurring job processes due rows and fires the
actual emails/SMS/webhooks. Framework-side recurring jobs handle the
polling.
Common tasks
| User | Action |
|---|---|
| "Email attendees 24h before the meeting" | create-workflow --trigger before-event --steps '[{action: email-attendee, offsetMinutes: 1440}]' |
| "Text me when someone books" | create-workflow --trigger new-booking --steps '[{action: sms-host, ...}]' |
| "Stop all reminders on an event type" | toggle-workflow to disable |