Automations & Messaging
Automation triggers and actions
A reference for all eight automation triggers and all three actions — exactly what makes each trigger fire, whether it carries a client you can email or text, and which pairings actually reach someone.
Every automation in Calso is one trigger paired with one action: something happens in your practice, and Calso sends something out. This page is the full list of both halves — what makes each trigger fire, and which action each one can actually complete — so you can build a rule that lands instead of one that quietly has nobody to reach.
Automations live under Automations in the Insights group of the sidebar. Pressing Create Automation opens a form with a Trigger dropdown, an Event type filter (optional) dropdown, and an Action dropdown, and the configuration fields below change to match the action you pick. If you have not built one before, start with Create your first automation and come back here to choose the right pairing.
The eight triggers and when each one fires
There are exactly eight triggers. Nothing else in Calso starts an automation.
| Trigger | Fires when |
|---|---|
| Booking Confirmed | Someone books on your booking page and the session is confirmed on the spot — a free session, one paid with a package credit, or one a discount code brought to zero. |
| Booking Cancelled | A session is called off, whether you cancelled it from the Bookings list or the client cancelled it themselves. |
| Booking Rescheduled | A session moves to a new time, again from either side. |
| Booking Completed | You press Mark as Completed on a past confirmed session. Calso never closes a session out on its own, so this trigger waits on you. |
| No Show | You press Mark No-Show on a session whose start time has already passed. |
| Package Purchased | You hand a client a package with + Gift Package on the Packages page, or a package arrives from a store you connected under Integrations. |
| Package Expiring | A daily check finds a client's package with an expiry date coming up within seven days. It fires once per package, never again for the same one. |
| Package Exhausted | A booking uses a client's last credit and their balance reaches zero. |
Two of these are worth reading twice. Booking Confirmed covers the straight-through path on your booking page; a card-paid session is confirmed later when the payment clears, a session on an event type with Host Approval is confirmed when you approve it, and a session you create yourself from a client record is confirmed the moment you save it. None of those three fire the trigger. And Package Expiring only ever fires for a package that carries an expiry date in the first place — a package set never to expire is never coming up for renewal.
Which triggers carry a client to reach
This is the difference between a rule that works and one that goes nowhere. Some triggers arrive with a whole booking attached — a name, an email address, maybe a phone number, a date and time. Others arrive with only package details.
| Trigger | Reaches a client? | Details that fill in |
|---|---|---|
| Booking Confirmed | Yes | Client name and email, date and time, meeting link, event type title, your name |
| Booking Cancelled | Yes | Same as above |
| Booking Rescheduled | Yes | Same as above, using the new time |
| Booking Completed | Yes | Client name and email, date and time, meeting link |
| No Show | Yes | Client name and email, date and time, meeting link |
| Package Purchased | No | Package name, credits remaining, your name |
| Package Expiring | No | Package name, credits remaining, your name |
| Package Exhausted | No | Package name, credits remaining |
The details in the right-hand column are what you can drop into a message as
variables — {guestName}, {eventTitle}, {bookingDate} and the rest. Anything
a trigger does not carry comes out as empty text rather than showing the variable
name, which is why a Booking Completed email written around the event type
title reads with a gap in it. Write those two around the client's name and the
date instead. The full list, and how to type each one, is in
Use variables in automation messages.
The three actions and what each one needs
| Action | Fields you fill in | What it needs to land |
|---|---|---|
| Send Email | Subject and Body under Email Configuration | An email address on the booking that fired it |
| Send SMS | Message body under SMS Configuration | A phone number on the booking, that client's text opt-in, and room left in your monthly text allowance |
| Send Webhook | URL, Headers (JSON, optional) and Include booking data in payload under Webhook Configuration | A web address anyone on the internet can reach |
Send Email goes out under your own sender — the same name and address your booking emails use, including your own domain if you have set one up. The body is plain text with your line breaks kept, not one of Calso's designed templates, so write it the way you would write the message by hand. Automation email counts as marketing, so a client who has unsubscribed will not receive it.
Send SMS needs the optional Phone number field to have been filled in when the client booked — plenty of bookings won't have one — and it needs that client to have ticked Send me SMS reminders beside it, because a number you can ring is not permission to text. It also answers to the Enable SMS reminders for clients switch in your notification preferences: with that switch off, no text rule sends. Every text counts against your plan's monthly allowance — 200 on Practice, 1,000 on Studio, no limit on Platform — shared with the automatic session reminders, and rules stop sending for the rest of the month once it is used up. The three conditions are repeated in grey beneath Message body on the form, so you can check them without leaving the page.
Send Webhook posts a JSON payload to the address in URL. Leave Include booking data in payload ticked and the client's name, email, start and end times and meeting link travel with it; the event type title and package details come along whenever the trigger carries them. Headers (JSON, optional) is where an authorisation header goes.
Pairings that reach someone, and pairings that don't
The five booking triggers work with all three actions. The three package triggers carry no booking, so Send Email and Send SMS have no address to send to and quietly do nothing — pair those three with Send Webhook, which is the action they can complete. Push the event into a tool that already has your client list, and let that tool do the emailing.
- Package Expiring → Send Email — no client attached to the event
- Package Exhausted → Send SMS — same reason
- Booking Completed → an email built around the event type title
- Send SMS on a booking where the client left Phone number blank, or filled it in without ticking Send me SMS reminders
- Booking Confirmed → Send SMS with the date and time
- No Show → Send Email with your rebooking link
- Booking Completed → Send Email asking for feedback
- Package Expiring → Send Webhook into the tool that emails your list
Narrowing a rule to one event type
Event type filter (optional) limits an automation to a single event type. Left on All event types, the rule runs for every session in your workspace — which is what you want for a general reminder or a follow-up. Point it at one event type and it only fires for bookings on that one, which is how you send a different welcome message after an intake call than after a check-in.
Because the filter matches on the booking, and the three package triggers carry no booking, an automation set to a specific event type will never fire on Package Purchased, Package Expiring, or Package Exhausted. Leave those on All event types.
Once you have picked a pairing
Only automations showing an Active badge ever fire, and the row's Disable, Edit and Delete buttons are covered in create your first automation. Prove the pairing before you rely on it — the Test button on each row fires the rule immediately so you can read the result yourself. What it does and doesn't tell you is covered in test an automation before you rely on it.
Frequently asked questions
Why didn't my Booking Confirmed automation fire on a paid session?
Booking Confirmed fires when a booking on your booking page lands confirmed with nothing left to settle — a free session, one paid with a package credit, or one a discount code brought to zero. A session paid by card is confirmed later, when the payment clears, and a session on an event type with Host Approval is confirmed when you approve it. Neither of those routes fires the trigger, so build follow-ups for paid or approval-based sessions on Booking Completed instead.
Can an automation email someone other than the person who booked?
No. A Send Email automation goes to the email address on the booking that fired it, and a Send SMS automation goes to the phone number on that same booking — and only when that client ticked Send me SMS reminders as they booked. There is no recipient field on the automation form. If you want an event to reach you or another system, use Send Webhook, which posts to any address you choose.
Why does my Package Purchased email work when I press Test but never arrive in real life?
Test runs your automation against a sample booking, and a sample booking always has an email address on it. A real package event carries package details but no booking, so Send Email and Send SMS have nobody to reach. Use Send Webhook on Package Purchased, Package Expiring, and Package Exhausted — it is the action those three triggers can actually complete.
Can one automation send an email and post a webhook at the same time?
Not on its own — each automation is one trigger paired with one action. Create a second automation with the same trigger and the other action, and both will run when that trigger fires. Automations sharing a trigger all fire together, in no particular order.