The booking & retention engine,
explained end to end.
Every firing n8n workflow behind Beem Light Sauna's automation, an infrared & red-light sauna studio in Scottsdale. One n8n engine books into MindBody for both Emily's texts and her phone calls, then reminders, no-show recovery, and retention run on their own. Verified against the live system on 2026-06-20 with real executions on record, each workflow at full module-flow depth.
01System overview
A lead becomes a booked, reminded, retained customer, mostly on autopilot. Emily (the AI) handles the conversation over both SMS and voice; one n8n engine does the real booking in MindBody; and a lifecycle layer keeps customers showing up and coming back.
The big picture
A new lead is synced into GoHighLevel and tagged. Emily, the AI, greets them over text or on a call, answers with real open times, and captures their intent. One n8n engine then books the session in live MindBody and writes back the exact confirmation the customer is sent, the same engine for SMS and voice, so a booking made on a call is visible to a text seconds later. From there the lifecycle runs itself: confirmation and photo reminders, no-show recovery, reviews, referral and membership nurture, and reactivation of cold leads. Every step is written back to the CRM.
The moving parts
Five layers do the work; n8n sits in the middle — it listens to GoHighLevel, runs the booking engine against MindBody, and orchestrates Retell and the reminders.
Lead intake
Beem - Mindbody Leads to GHLfiringNew leads, from MindBody and the funnel, are pulled into GoHighLevel as contacts, tagged, and made ready for Emily to engage.Outcome Every new lead lands in the CRM as a tagged contact within minutes, so the rest of the system can pick it up. No lead sits in MindBody or an ad platform unseen.

Trigger
Runs on a schedule, pulling new MindBody (and funnel) leads into GoHighLevel and tagging them gf-new-lead.
Module flow
- Trigger—Picks up new leads to import.
- Fetch leads—Reads the new MindBody / funnel leads. MindBody
- Map + upsert contact—Creates or updates the contact in GoHighLevel. GHL
- Tag gf-new-lead—Tags the contact so the lead engine takes over.
The call firer
Beem - Retell Call FirerfiringOne central place that places every outbound Retell call (Emily), with the correct Bearer auth and a reason-aware opener: callback, no-show recovery, or reactivation.Outcome Any workflow that needs to call a customer hits one webhook, and Emily dials with the right opening line for the situation. No more per-workflow auth bugs.

Trigger
POST to webhook/beem-fire-call from any workflow that needs to place a call.
Module flow
- Webhook—Accepts both a simple {phone, reason} body and the full call body.
- Fire Retell call—Places the call via Retell with Bearer auth and a reason-aware opener. Retell call_reason
The MindBody booking engine
Beem - MindBody Booking (ghl-book)firingThe brain. One engine books, checks, reschedules, and cancels against live MindBody, for BOTH the SMS bot and the voice agent. It writes the exact reply the customer is sent and pins their MindBody identity.Outcome Whatever Emily promises, book Friday 2pm, move it, cancel, "what's my appointment?", happens for real in MindBody, and the customer gets a truthful confirmation. One engine, both channels, always in sync.

Trigger
POST to webhook/beem-mindbody-book from Emily (the GHL SMS Conversation-AI) and the Retell voice agent's function tools.
Module flow
- Webhook—Receives the action: book / check / reschedule / cancel.
- Resolve MindBody client—Finds the customer in MindBody by pinned id, then phone / email, to avoid duplicate profiles. pinned id
- MindBody action—Books, checks, moves, or cancels the session against live MindBody. MindBody timezone
- Write reply + tag + pin—Writes the exact SMS reply (booking_reply), tags booked, and pins the MindBody client id. booked
- Respond—Returns the result so the channel can speak it.
After every call
Beem - Retell Post-Call (notes + tags)firingWhen a Retell call ends, write the summary and full transcript onto the contact, tag the outcome, and keep the AI-active flag clean so the next text routes correctly.Outcome Every call leaves a visible record on the contact (summary + transcript), a no-answer is logged as "called, no answer," and the customer is never stranded behind a stale AI flag.

Trigger
Retell calls this webhook when a call is analyzed or ended (all three agents point here).
Module flow
- Webhook—Receives call_analyzed (connected) or call_ended (no answer).
- Note + tag + hygiene—Finds the contact, writes summary + transcript, tags the outcome, removes ai_active. visible artifact
Reminders & no-show recovery
Beem - Reminder DispatcherfiringDrives the appointment reminder touches: a booking confirmation, a 24-hour reminder with a photo of the storefront, and a 1-hour "safe travels" text with a parking photo.Outcome Customers get timely, friendly reminders with real photos of where they are going, which cuts no-shows. If they still miss it, recovery kicks in.

Trigger
Runs on schedule, dispatching the right reminder for each upcoming appointment.
Module flow
- Trigger—Fires on cadence to find due reminders.
- Build + send reminder—Sends the confirmation, the 24h storefront-photo MMS, and the 1h parking-photo MMS. MMS photo
No-show & session tracking
Beem - Attendance PollerfiringEvery 30 minutes, reads MindBody attendance across all rooms: completed sessions get tagged for the review flow; missed ones get tagged no-show, which fires recovery.Outcome MindBody is the source of truth for who showed up. Completed visits feed the review and referral flow; no-shows trigger an automatic rebooking SMS and a recovery call. Last-visit and session-count fields stay current.

Trigger
n8n schedule, every 30 minutes (and on demand).
Module flow
- Cron—Runs every 30 minutes.
- Scan MindBody attendance—Reads ended appointments across all rooms. MindBody
- Tag + bump fields—Tags session-complete or no-show, bumps last-visit / session-count, writes a CRM note.
Slot prefetch
Beem - Availability Prefetch (cron)firingOn a cron, pre-pulls open MindBody slots for each active conversation into a GoHighLevel field, so Emily can answer "what's open Friday?" instantly instead of stalling.Outcome Emily quotes real, current openings the moment a customer asks, with no "let me check on that" dead air.

Trigger
n8n cron, refreshing open slots for active (ai_active) contacts.
Module flow
- Cron—Refreshes on a short cadence.
- Read MindBody slots—Pulls the real open slots for active customers. MindBody
- Write available_slots—Stores them on the contact so Emily answers instantly.
Scheduled callbacks
Beem - Callback SchedulerfiringWhen a customer says "call me back in an hour" or "tomorrow at 2pm," this parses their own words, waits until that exact moment, rechecks, and fires the call.Outcome A requested callback happens at the time the customer actually asked for, in their words, with a final check so it is skipped if they have since cancelled or opted out.

Trigger
POST to webhook/beem-callback-schedule when a contact is tagged callback_requested.
Module flow
- Webhook—Fires when a callback is requested.
- Parse callback time—Reads the customer's own words for the time, Phoenix-anchored. America/Phoenix
- Wait until the time—Pauses precisely until that exact moment.
- Recheck + fire—Skips if they cancelled / opted out, else fires the call. GR-001
Error alerting
Beem_error_alertfiringIf any Beem workflow errors, this catches it and emails an alert, so a failure never goes unnoticed.Outcome Any broken run pings a monitored inbox immediately, so issues get caught and fixed fast instead of silently dropping customers.

Trigger
Set as the error workflow on the Beem workflows; fires on any failure.
Module flow
- Error trigger—Catches a failure in any linked workflow.
- Email the alert—Sends the error to a monitored inbox. jjcavada1@gmail.com
GoHighLevel · the CRM layer
GoHighLevel holds the conversation, the contacts, the tags, and the reminders. It runs “Emily,” the SMS bot, and drives the lifecycle workflows. The booking system of record is MindBody, the n8n engine books there; GoHighLevel is where the lead lives and where every step is written back.
The tag lifecycle that drives everything
A contact moves through these tags; each transition fires an automation.
| Tag | What it means / triggers |
|---|---|
| gf-new-lead | New lead — starts the ignition + nurture |
| ai_active | Emily is mid-conversation — holds other automations off |
| booking_requested | → the n8n MindBody booking engine books the session |
| booked | State tag: visible to reminders + no-show; suppresses nurture |
| no-show | Set by the attendance poller → fires recovery SMS + call |
| session-complete → member | Drives the review, referral, and membership lifecycle |
| callback_requested · reschedule_requested · cancel_requested | → the matching n8n engine |
Key custom fields
| Field | Role |
|---|---|
| booking_reply | The exact line the bot speaks — written by the engine, sent verbatim (no hallucinated confirmations) |
| mindbody_client_id | Pins the customer's MindBody identity so book/check always hit the right record |
| available_slots | Pre-fetched open times so Emily answers instantly |
| Last Visit · Total Sessions · Membership Tier | Retention + membership context, kept current by the attendance poller |
GHL-side workflows (WF-1 to WF-10)
Lead ignition, the nurture sequence, Emily takeover, the MindBody booking handler, reminders, post-visit review, referral + membership nurture, member lifecycle, and non-booked reactivation — all tag-driven, all calling the n8n engines.
enmodTHHYS0RpEMVGvic · timezone America/Phoenix.Retell · the voice agent
Retell is Emily's voice. A GPT-4.1 outbound agent calls leads (and handles callbacks, no-show recovery, reactivation), an inbound agent answers the line, and a membership agent runs the warm upsell. Mid-call they reach into the same n8n MindBody engine the SMS bot uses, so a booking made on a call is visible to a text seconds later.
| Agent | Role |
|---|---|
| Beem Outbound | Calls leads, books, no-show recovery, reactivation · gpt-4.1 |
| Beem Inbound | Answers the line, books + manages appointments |
| Beem Membership | Warm membership upsell, transfers to a human to close |
| Number | +1 480 520 6156 |
Functions — the tools the agent calls mid-call
Each is a live webhook into the n8n MindBody engine. The prompt names these as the only functions that exist, so the agent never invents a capability.
| Function | What it does |
|---|---|
| check_available_booking_slots | Reads REAL MindBody openings for a given date |
| book_appointment | Books the session in MindBody |
| check_my_schedule | Looks up the caller's existing appointment |
| reschedule_appointment | Moves the caller's session to a new time |
| cancel_appointment | Cancels the caller's upcoming session |
| get_lead_data | Pulls the caller's details + current time / timezone |
| transfer_call | Hands off to a live human when needed |
| end_call | Ends the call cleanly |
Dynamic variables — context passed in at call time
Injected so the agent knows the caller and why it's calling before it speaks:
Prompt structure
The prompt leads with a hard, authoritative override so the agent never hallucinates a booking. Its backbone:
| Section | Why it's there |
|---|---|
| Booking-engine authoritative override (read first) | Locks the agent to the real engine — overrides everything below |
| The only functions that exist | Names the real tools; bans inventing capabilities |
| How availability really works | Forces real MindBody slots, never made-up times |
| Critical init sequence + decision tree | What to load and which function to call when |
| System + dynamic variables | How to use the injected caller context |
webhook/beem-mindbody-book) the SMS bot uses — one engine, both channels. When the call ends, Retell fires the post-call webhook into the n8n Retell Post-Call workflow, which writes the summary + transcript back to GoHighLevel.Full workflow inventory
Beem n8n workflows with live status. firing = running now · standby = built, on demand · off = inactive / superseded. The nine firing workflows are detailed in full above.
Firing — live production firing
| Workflow | Job |
|---|---|
| Beem - Mindbody Leads to GHL | Lead intake (MindBody / funnel → GoHighLevel) |
| Beem - Retell Call Firer | Central outbound dialer (Emily), Bearer auth |
| Beem - MindBody Booking (ghl-book) | The engine: book / check / reschedule / cancel |
| Beem - Retell Post-Call | Call summary + transcript + tags |
| Beem - Reminder Dispatcher | Confirmation + photo reminders + no-show |
| Beem - Attendance Poller | No-show + session tracking from MindBody |
| Beem - Availability Prefetch (cron) | Pre-pull open slots so Emily answers instantly |
| Beem - Callback Scheduler | "Call me back at [time]" → wait → fire |
| Beem_error_alert | Error alerting to a monitored inbox |
Standby & building blocks
| Workflow | Status |
|---|---|
| Beem_Post_Call_Analysis | standby parallel post-call analysis |
| Beemlight SMS ChatBot (+ agents) | off n8n SMS subtree, superseded by GHL-native Emily |
| beem_*_subworkflow (book / slots / lookup / reschedule) | off reusable building blocks for the engine |
What triggers what
The master map: every source event, the workflow it hits, and what happens next.
| Source | → Workflow | Downstream effect |
|---|---|---|
| New MindBody / funnel lead | Mindbody Leads to GHL | Creates + tags the GoHighLevel contact |
| Emily (SMS or voice) books / checks / cancels | MindBody Booking engine | Live MindBody action + truthful reply + tags |
Tag callback_requested | Callback Scheduler | Parse time → wait → Call Firer |
Tag no-show (from poller) | Reminder Dispatcher · Call Firer | Rebooking SMS + recovery call |
| Retell call ends | Retell Post-Call | Summary + transcript note + tags |
| cron · 30 min | Attendance Poller | session-complete / no-show + field bumps |
| cron | Availability Prefetch | Fresh open slots on the contact |
| Any workflow error | Beem_error_alert | Email to jjcavada1@gmail.com |
Key IDs & config
Identifiers the workflows rely on. Secrets (keys/tokens) are redacted to their shape — real values live in the credential vault.
| Item | Value |
|---|---|
| MindBody studio | 5744189 |
| SMS / voice number | +1 480 520 6156 |
| Timezone | America/Phoenix |
| Booking engine webhook | webhook/beem-mindbody-book |
| Call firer webhook | webhook/beem-fire-call |
| Retell inbound agent | agent_722bef… |
| Retell outbound agent | agent_b8dca4… |
| GHL token (PIT) | pit-xxxxxxxx-xxxx-… |
| n8n instance | guerilla-fi.app.n8n.cloud |
Who to contact
| Role | Contact |
|---|---|
| Automation engineer | JJ · jjcavada1@gmail.com |
| Error alerts go to | jjcavada1@gmail.com |
| Booking system of record | MindBody studio 5744189 |
| n8n instance | guerilla-fi.app.n8n.cloud |