Follow-up that stops the moment a client books, and restarts if they don't
A lead-to-appointment system for a medspa whose bookings lived in Vagaro and whose leads lived in GoHighLevel. Webhooks keep the two in sync so nobody is chased after booking and nobody is forgotten after going quiet.
- Role
- Designed and built the full system solo: funnel forms, pipeline, workflows, sequences and the Vagaro integration.
- Timeline
- TODO: add build duration (for example, 3 weeks)
- Stack
- GoHighLevelVagaroZapierWebhooksSMS & email sequencesCRM automation
The situation
Leads came in through GoHighLevel funnels, but consultations were booked in Vagaro, a separate platform with no clean native connection to GHL.
Follow-up was manual. New enquiries waited for a staff member to be free, and nobody had a reliable view of which leads had booked, which had gone quiet and which were being messaged twice.
The business wanted automated nurture without the classic failure: sequences that keep firing at people who already booked.
What I built
- 01
Capture and instant response
Funnel forms create or update the GHL contact, tag the source and trigger the first SMS and email within a minute of submission.
- 02
Nurture sequences with stop rules
A multi-day SMS and email sequence for unbooked leads. Any reply pauses it for a human. Any booking ends it.
- 03
Vagaro to GHL booking sync
When a client books in Vagaro, a webhook fires through Zapier, finds the matching GHL contact, moves them to the Booked stage, stops active follow-up and writes the appointment details to the contact.
- 04
Re-engagement for the quiet ones
Leads who finish the nurture sequence without booking move to a slower re-engagement track instead of dying in the pipeline.
- 05
Cancellation and no-show handling
Cancellation and no-show events re-open the lead, move it to the right stage and start a short rebook sequence rather than leaving it marked as Booked.
Edge cases handled
The clean path is easy. These are the paths that usually break a setup after launch.
- Booking from a phone number or email that did not match the lead record exactly (fuzzy match before creating a duplicate).
- A reply arriving in the middle of a sequence (pause, notify staff, resume or stop based on the outcome).
- A Zapier run failing silently (error path with a notification so a human can fix the record).
- Cancellations and no-shows flipping a Booked lead back into follow-up without re-sending the welcome messages.
- Opt-outs honoured across both SMS and email, regardless of which sequence the contact was in.
What changed
- Every new lead gets a first response within a minute, without staff involvement.
- Booking state is correct in the CRM automatically, so sequences stop when they should and staff stop updating lead status by hand.
- Leads that go quiet are re-engaged on a schedule instead of being forgotten.
- The messy cases (cancellations, no-shows, failed triggers) have defined paths instead of landing in someone's inbox.
- Speed to first response
- Under 1 minute
- by design, measured in testing
- Leads per month
- Not tracked yet
- TODO: add if the client shared it
- Booking rate change
- Not tracked yet
- TODO: add only if tracked before and after
Figures are shown only where they were measured. Anything marked “not tracked yet” is a slot for a real number, not an estimate.
Screens
TODO: workflow screenshot
GHL workflow builder view with client data blurred.
TODO: pipeline screenshot
Pipeline stages with contact names redacted.