
GoHighLevel Waitlist Workflow: Setup Guide (2026)
GoHighLevel Waitlist Workflow: Setup Guide (2026)
By Dr Priya Jaganathan, GoHighLevel Certified Admin · HL Growth Partner, Australia · Updated 7 September 2026 · 8 min read
A GoHighLevel waitlist workflow fills cancelled appointment slots automatically: when an appointment status changes to cancelled, the workflow texts the contacts you have tagged as waitlisted, gives them a trigger link to book the freed-up slot, and stops chasing everyone else the moment someone takes it. It runs off three things you already have in the platform, a calendar, a tag and a Workflow, and it takes about an hour to build properly. Done well, it turns the dead time that a physio, salon or gym normally eats into billed hours without anyone on the front desk ringing down a list.
I have built this for clinics in Brisbane, a barber chain in Melbourne and a forklift-licence RTO in Perth, and the same two designs keep working. This guide walks through both: a simple batch version you can ship this afternoon, and a first-come-first-served version with a Wait step and a Goal event that is the one I recommend once you have more than a dozen people on the list. I will also cover the custom fields that let you segment by service and preferred day, the consent rules that apply in Australia, what the SMS costs, and the mistakes I see most often when I audit someone else's build.
What a GoHighLevel waitlist workflow actually does
In plain terms, the workflow listens for one event, a cancellation on a specific calendar, and reacts by contacting a filtered group of people who told you they want an earlier appointment. Every piece of that sentence maps to a native GoHighLevel feature:
- The listener is the Appointment Status trigger with a filter of
Status = Cancelledand, ideally,Calendar = [your calendar]. - The group is any contact carrying a
waitlisttag, optionally narrowed further by custom fields such as Waitlist Service and Waitlist Preferred Day. - The offer goes out via LeadConnector SMS (and Mailgun email if you want a second channel) with a trigger link that lands on the booking calendar.
- The stop condition is either the Trigger Link Clicked event, a Customer Replied trigger, or, in the advanced build, a Goal event of Appointment Booked that ends the workflow for everyone still waiting.
What it does not do, and this trips people up, is hold the slot. GoHighLevel calendars are first-come-first-served by design. Your job in the workflow is to control how many people are told about the slot at once so that the calendar's own availability check does the double-booking prevention for you. Keep the batches small and the platform handles the rest.
Before you build: fields, tags and the website form
Create the custom fields
Go to Settings > Custom Fields and add two fields on the Contact object. Waitlist Service should be a single-option dropdown listing the services you actually offer (for a physio: Initial Consult, Standard Consult, Pilates Class). Waitlist Preferred Day works best as a multiple-option checkbox so a client can say "Tuesday or Thursday mornings" rather than being forced into one choice. If you have not set fields up before, my GoHighLevel custom fields guide covers naming conventions and folder organisation so these do not get lost among the fifty fields most accounts accumulate.
Add a waitlist form to your site
The cleanest source of waitlist contacts is a short form on your booking page: name, mobile, service dropdown, preferred day checkboxes and a consent tick box that reads something like "Yes, text me when an earlier appointment opens up". Map the dropdown and checkbox fields to the custom fields you just created. On Form Submitted, a small housekeeping workflow adds the waitlist tag and stamps the date into a third field, Waitlist Added, which you will use later for reporting and expiry. The GoHighLevel forms and surveys walkthrough shows how the field mapping works if your form is not writing to the contact record.
Get consent right
Because the offers go out by SMS, the Spam Act 2003 applies. You need express or inferred consent, a clear sender identification and a working unsubscribe. The consent checkbox on the form covers the first part; the built-in {{contact.name}} merge field plus your business name covers the second; and "Reply STOP to opt out" in the message body covers the third. The ACMA publishes the rules for businesses and, in my experience, the "we assumed existing clients were fine" position does not hold up when someone complains. Put the tick box on the form and store the date.
Build A: the simple batch workflow
This is the version for a business with a short waitlist, say under fifteen people, where the aim is just to stop slots going unfilled. It sends one round of texts and lets the calendar sort out who gets in.
| Step | Action | Setting | Why |
|---|---|---|---|
| 1 | Trigger: Appointment Status | Status = Cancelled; Calendar = Main Bookings | Fires only for the calendar you want backfilled, not every calendar in the account |
| 2 | Internal Notification | SMS or in-app to the front desk user | A human knows a slot has opened and can watch the next few minutes |
| 3 | Wait | Event: Contact Tag Added, timeout 1 minute | Buys a moment for the cancellation to write through before the send fires |
| 4 | Add to Workflow (the send workflow) | Runs against a Smart List: Tag = waitlist | Separates the trigger from the batch send so you can rerun it manually |
| 5 | Send SMS | LeadConnector number; body includes trigger link and STOP line | Trigger link records who clicked and lands them on the booking page |
| 6 | If/Else | Trigger Link Clicked within 30 minutes | Splits the people who engaged from the ones who did not |
| 7 | Remove Tag | Remove waitlist when Appointment Booked | Stops the person being texted again next time a slot opens |
Two implementation notes. First, GoHighLevel does not let a single workflow triggered by one contact's cancellation send messages to a different group of contacts directly, so Step 4 relies on a second workflow. The practical pattern is a Smart List filtered on the waitlist tag with the "bulk action" of adding to workflow, or, if you want it fully automatic, a scheduled bulk action that runs every 15 minutes and picks up contacts carrying a temporary slot-open tag that the first workflow applies. Second, the message copy should state the exact time. "A 2:30pm Thursday appointment with Sarah has just opened up" outperforms "a slot is available" on every account I have measured, because people are making a yes/no decision about a specific time, not browsing.
Store the calendar name, practitioner name and booking link in GoHighLevel custom values rather than hard-coding them into the SMS. When you add a second practitioner or move to a new booking page, you change one value instead of editing six messages.
Build B: first-come-first-served with a Wait step and Goal event
Once the list gets longer, the batch approach starts producing a bad experience: ten people click the link, one books, nine land on a calendar that no longer shows the slot and feel like they were baited. Build B fixes that by offering the slot to a small group, waiting, and only widening the offer if nobody takes it.
The structure
- Trigger: Appointment Status = Cancelled on the target calendar, same as Build A.
- Batch 1: Send SMS to the first three contacts in the waitlist Smart List, ordered by Waitlist Added ascending, so the longest-waiting people get first go.
- Wait step: 15 minutes. This is the window in which those three can book.
- Goal event: Appointment Booked on the same calendar. Set the goal to "end the workflow for all contacts" when met. The moment one of the three books, everyone else still sitting in the Wait step is pulled out and receives nothing further.
- If/Else after the Wait: if the goal was not met, apply a
batch-2tag to the next three contacts and repeat the send and wait. - Exit: after three batches with no booking, send an internal notification so a human decides whether to ring the remaining list or leave the slot open.
The Goal event is the piece most people miss. Without it, a Wait step just delays the next send; it does not cancel it. With it, the workflow behaves like a proper queue. HighLevel's own documentation on Goal events is worth reading once because the "end workflow for all contacts" versus "skip to goal" distinction matters here: you want the former. The GoHighLevel help centre has the current screenshots for where that toggle sits in the Goal step settings.
Segmenting by service and day
Add an If/Else branch immediately after the trigger that reads the cancelled appointment's calendar and start time, then filters the batch by Waitlist Service matches and Waitlist Preferred Day contains the weekday of the slot. A Pilates cancellation on a Thursday should only text people who asked for Pilates and ticked Thursday. This single branch roughly halves the number of texts sent per cancellation on a busy clinic account and, more importantly, stops you burning goodwill by texting a Monday-only person about a Friday slot.
Handling replies
Some people will reply "yes please" instead of clicking. Add a Customer Replied trigger in a small side workflow that flags the conversation for the front desk and, if you have Conversation AI trained on your booking rules, lets the bot confirm the slot and push the booking. If you go that route, the bot needs to know your cancellation policy, session lengths and who does what, which is what the GoHighLevel AI knowledge base setup is for. Do not let the bot loose on a waitlist without those documents loaded; it will confidently offer times that do not exist.
Why the batch size matters more than the message
The single most important setting in a HighLevel waitlist automation is how many people receive the first text. The calendar prevents two people booking the same slot, but it cannot prevent two people trying to at the same moment, and the loser of that race sees an error or an empty calendar. Three per batch on a 15-minute wait is the number I have settled on for one-practitioner calendars. For group classes with several spots freed at once, you can go to eight or ten. If your business runs a phone-heavy front desk and callbacks are common, route the reply traffic through a dedicated ring group so the waitlist calls do not clog the main line; the GoHighLevel IVR and ring groups guide covers that setup.
Reporting and what it costs to run
What to track
Create a small pipeline called Waitlist with three stages: Offered, Booked, Expired. Have the workflow create an opportunity in Offered when a text goes out and move it to Booked on the Goal event. In a month you will see the fill rate, which for most service businesses lands between 35 and 60 percent of cancellations, and the average time-to-fill. You will also see which day and service combinations never fill, which tells you where the waitlist form is not being promoted or where the service simply has no demand for earlier slots.
SMS and platform costs
LeadConnector SMS to Australian mobiles runs roughly AU$0.08 to AU$0.10 per segment depending on your rebilling markup and the current Twilio rate card, and a well-written waitlist offer fits in one segment (160 characters). Build B with three batches of three is at most nine texts per cancellation, so under a dollar to fill a slot worth anywhere from $80 to $300. The workflow itself is available on every GoHighLevel plan, US$97 Starter, US$297 Unlimited and US$497 Pro, so the plan you are on does not change the build. What the higher plans add is SaaS mode and rebilling, which matters if you are an agency deploying this for clients rather than a single business running it for yourself.
Where this earns its keep
- Clinics (physio, chiro, dental, allied health): high cancellation rates, high per-slot value, clients who genuinely want to be seen sooner.
- Salons and barbers: same pattern, with the added benefit that a same-day fill keeps a stylist on the floor rather than sent home.
- Gyms and studios: class waitlists where several spots free at once; batch size goes up, wait time comes down to five minutes.
- Tradies: a cancelled site visit or quote appointment can be offered to the next job in the pipeline, and the message can include the suburb so only nearby jobs respond.
- Consultants and coaches: discovery-call slots that free up on short notice go straight to the warmest leads in the pipeline.
- RTOs and training providers: course intakes with a fixed capacity, where a withdrawal opens a seat that the waitlist form has already collected demand for.
Common mistakes to avoid
- Texting the whole list at once. Ten people racing for one slot creates nine unhappy clients. Batch it and use the Goal event.
- Forgetting to remove the tag after booking. The person who just booked gets texted again on the next cancellation and, understandably, replies STOP.
- No expiry on the waitlist. Someone who joined in March does not want a slot in September. Use the Waitlist Added date to drop people after 60 days or send a "still want to hear from us?" check.
- Trigger scoped to every calendar. A cancelled internal meeting on a staff calendar should not fire client texts. Filter the trigger to the specific calendar.
- Hard-coding names and links in the SMS. Use custom values so a staff change or new booking page is a one-field edit.
- Skipping consent. Existing-client status is not blanket permission for marketing SMS under the Spam Act. Collect the tick box and keep the record.
If you want a waitlist and cancellation-fill workflow built and tested inside your GoHighLevel account, book a strategy call with the HL Growth Partner team.
Frequently asked questions
Can a GoHighLevel waitlist workflow hold a slot for the first person who clicks?
No. GoHighLevel calendars do not support soft holds, so the first person to complete the booking form gets the slot. The workflow controls the number of people who are told about it at once, which is why small batches and a 15-minute Wait step with an Appointment Booked Goal event are the recommended pattern.
How do I send a message to waitlist contacts when a different contact cancels?
A workflow triggered by one contact cannot message other contacts directly. Use the cancellation workflow to apply a temporary tag or fire an internal notification, then run a second workflow against a Smart List filtered on the waitlist tag, either via a scheduled bulk action or a manual add-to-workflow from the Smart List view.
Do I need consent to text people on my waitlist in Australia?
Yes. The Spam Act requires consent, sender identification and an unsubscribe option for commercial SMS. A consent checkbox on your waitlist form, your business name in the message and a "Reply STOP" line cover the three requirements. Record the consent date in a custom field.
How much does a waitlist SMS campaign cost to run?
Australian SMS through LeadConnector costs roughly AU$0.08 to AU$0.10 per 160-character segment. A first-come-first-served build sending three batches of three is at most nine texts per cancellation, so well under a dollar to fill a slot. The workflow feature is included on the US$97, US$297 and US$497 plans.
Can I segment the waitlist by service or preferred day?
Yes. Create Waitlist Service and Waitlist Preferred Day custom fields, capture them on the waitlist form, and add an If/Else branch after the cancellation trigger that only sends to contacts whose service matches the cancelled appointment's calendar and whose preferred days include the slot's weekday.
