Beem Light Sauna · Automation Handoff n8n end-to-end · live audit 2026-06-20
Automation Handoff

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.

Prepared for
Daylon · Beem
The stack
n8n · GoHighLevel · Retell · MindBody
Scale
9 firing workflows · one engine, two channels
Author
JJ · Automation engineer
Firing — running in production now Sub — reusable building block Standby — built, waiting to switch on Off — inactive / superseded
Orientation

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.

Phase 1
Lead in → Emily engages
Phase 2
Booked in MindBody
Phase 3
Reminded · no-show recovery
Phase 4
Retained · reactivated

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.

StartA new lead comes in — MindBody, the funnel, or the websiteSource
Phase 1Synced into GoHighLevel as a tagged contactStage · New Lead
EngageEmily (SMS + voice AI) greets, answers with real times, captures intentai_active
Phase 2The n8n engine books the session in MindBody — live, both channelsStage · Booked
RemindConfirmation + 24h storefront-photo + 1h parking-photo remindersReminders
AttendAttendance poller reads MindBody: showed up, or no-show recoveryStage · Attended
RetainReviews, referral & membership nurture, reactivation of cold leadsRetention
DoneRepeat member · every step logged back to GoHighLevelStage · Member

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.

01
Lead source
MindBody · funnel · web
02
GoHighLevel
CRM + Emily SMS bot + tags
03
n8n
The engine — booking + lifecycle
04
Retell
Emily, the voice AI
05
MindBody
Booking system of record
One engine, both channels
The same n8n engine handles book, check, reschedule, and cancel against live MindBody for both Emily's texts and her phone calls. That is why a booking made on a call shows up in a text seconds later. MindBody is the source of truth; GoHighLevel holds the conversation, tags, and reminders; n8n is the glue. Every workflow writes a visible note or field back to the CRM.
Lead in · booked session
Lead in · booked session

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.

n8n · Beem - Mindbody Leads to GHL — actual build
Beem - Mindbody Leads to GHL n8n canvas
The live n8n canvas.
→ feeds Emily, the calls, and the nurtureLead in · booked session
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
Config
Loads the location, keys & settings
Create contect
GoHighLevel API call
HTTP Request
GoHighLevel API call
Code in Java Script
Logic / decision
If
Logic / decision
Send a message1
Sends a message
Creates the GHL contact every other workflow acts on→ feeds Emily, the calls, and the nurture

Trigger

Runs on a schedule, pulling new MindBody (and funnel) leads into GoHighLevel and tagging them gf-new-lead.

Module flow

  1. TriggerPicks up new leads to import.
  2. Fetch leadsReads the new MindBody / funnel leads. MindBody
  3. Map + upsert contactCreates or updates the contact in GoHighLevel. GHL
  4. Tag gf-new-leadTags the contact so the lead engine takes over.
The front door
Until a lead is a tagged GoHighLevel contact, nothing else can run. This is what feeds Emily, the outbound calls, and the nurture sequence.
Lead in · booked session

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.

n8n · Beem - Retell Call Firer — actual build
Beem - Retell Call Firer n8n canvas
The live n8n canvas.
← called by callback / no-show / reactivationLead in · booked session
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Fire call (webhook)
Fires the Retell call
Fire Retell call
Fires the Retell call
The single dialer every call-firing workflow routes through← called by callback / no-show / reactivation

Trigger

POST to webhook/beem-fire-call from any workflow that needs to place a call.

Module flow

  1. WebhookAccepts both a simple {phone, reason} body and the full call body.
  2. Fire Retell callPlaces the call via Retell with Bearer auth and a reason-aware opener. Retell call_reason
Why centralize the dialer
It killed a whole class of auth bugs (a bare key vs the Bearer scheme Retell demands) and means every call opens with the right context, "you asked us to call back," "we missed you today," instead of a cold hello.
Lead in · booked session

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.

n8n · Beem - MindBody Booking (ghl-book) — actual build
Beem - MindBody Booking (ghl-book) n8n canvas
The live n8n canvas.
← used by Emily (SMS) AND the voice agentLead in · booked session
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
Book Mind Body
MindBody API call (book / check / slots)
Respond
Responds to the caller / agent
Wait 25s
Waits until the scheduled time
Trigger tag janitor
Adds / removes a CRM tag
The single source of truth for every booking action← used by Emily (SMS) AND the voice agent

Trigger

POST to webhook/beem-mindbody-book from Emily (the GHL SMS Conversation-AI) and the Retell voice agent's function tools.

Module flow

  1. WebhookReceives the action: book / check / reschedule / cancel.
  2. Resolve MindBody clientFinds the customer in MindBody by pinned id, then phone / email, to avoid duplicate profiles. pinned id
  3. MindBody actionBooks, checks, moves, or cancels the session against live MindBody. MindBody timezone
  4. Write reply + tag + pinWrites the exact SMS reply (booking_reply), tags booked, and pins the MindBody client id. booked
  5. RespondReturns the result so the channel can speak it.
Why one engine for both channels
Because SMS and voice both route through it, a booking made on a call is visible to a text 30 seconds later. That sync is what closed the old "I don't see your booking" gap, and MindBody stays the single source of truth.
Lead in · booked session

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.

n8n · Beem - Retell Post-Call (notes + tags) — actual build
Beem - Retell Post-Call (notes + tags) n8n canvas
The live n8n canvas.
→ writes the record · cleans the sessionLead in · booked session
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Retell webhook
Entry point — receives the trigger
Process call
Logic / decision
Fired by Retell when the call is analyzed / ends→ writes the record · cleans the session

Trigger

Retell calls this webhook when a call is analyzed or ended (all three agents point here).

Module flow

  1. WebhookReceives call_analyzed (connected) or call_ended (no answer).
  2. Note + tag + hygieneFinds the contact, writes summary + transcript, tags the outcome, removes ai_active. visible artifact
Why it matters
Staff can always see exactly what was said on a call, and the bot never traps a customer's next message behind a stale flag. The visible-artifact and clean-state rules that keep the system trustworthy.
Lifecycle · reminders & retention
Lifecycle · reminders & retention

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.

n8n · Beem - Reminder Dispatcher — actual build
Beem - Reminder Dispatcher n8n canvas
The live n8n canvas.
→ confirmation · 24h · 1h · recoveryLifecycle · reminders & retention
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Schedule Trigger
Entry point — receives the trigger
Dispatcher Code
Logic / decision
Sends the reminder touches for upcoming sessions→ confirmation · 24h · 1h · recovery

Trigger

Runs on schedule, dispatching the right reminder for each upcoming appointment.

Module flow

  1. TriggerFires on cadence to find due reminders.
  2. Build + send reminderSends the confirmation, the 24h storefront-photo MMS, and the 1h parking-photo MMS. MMS photo
Why photos cut no-shows
A reminder showing the door and the parking lot removes the friction that causes no-shows for a first visit. Small touches, real revenue protected.
Lifecycle · reminders & retention

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.

n8n · Beem - Attendance Poller — actual build
Beem - Attendance Poller n8n canvas
The live n8n canvas.
→ session-complete · no-show recoveryLifecycle · reminders & retention
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Every 30 min
Entry point — receives the trigger
Run now (webhook)
Entry point — receives the trigger
Detect attendance
Reads MindBody attendance
Bridges MindBody attendance into the CRM→ session-complete · no-show recovery

Trigger

n8n schedule, every 30 minutes (and on demand).

Module flow

  1. CronRuns every 30 minutes.
  2. Scan MindBody attendanceReads ended appointments across all rooms. MindBody
  3. Tag + bump fieldsTags session-complete or no-show, bumps last-visit / session-count, writes a CRM note.
Why this bridge exists
Because the studio books in MindBody, not GoHighLevel, this poller is what makes attendance visible to the CRM. It is the bridge that lets retention and no-show recovery exist at all.
Lifecycle · reminders & retention

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.

n8n · Beem - Availability Prefetch (cron) — actual build
Beem - Availability Prefetch (cron) n8n canvas
The live n8n canvas.
→ keeps Emily's answers instantLifecycle · reminders & retention
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Every 3 min
Entry point — receives the trigger
Find active convos
GoHighLevel API call
Split contacts
Writes to the GHL contact
Prefetch slots
Reads open slots
Feeds the available-slots field Emily reads from→ keeps Emily's answers instant

Trigger

n8n cron, refreshing open slots for active (ai_active) contacts.

Module flow

  1. CronRefreshes on a short cadence.
  2. Read MindBody slotsPulls the real open slots for active customers. MindBody
  3. Write available_slotsStores them on the contact so Emily answers instantly.
Why pre-fetch
Live API calls mid-conversation are slow and risky. Pre-fetching means Emily always has fresh, real times on hand, the difference between a natural answer and an awkward pause.
Lifecycle · reminders & retention

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.

n8n · Beem - Callback Scheduler — actual build
Beem - Callback Scheduler n8n canvas
The live n8n canvas.
→ waits, then fires via the call firerLifecycle · reminders & retention
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Callback request (webhook)
Schedules / fires the callback
Parse callback time
Parses the requested callback time
Wait until callback time
Waits until the scheduled time
Recheck + fire call
Fires the Retell call
Reads the time, waits, then calls the firer→ waits, then fires via the call firer

Trigger

POST to webhook/beem-callback-schedule when a contact is tagged callback_requested.

Module flow

  1. WebhookFires when a callback is requested.
  2. Parse callback timeReads the customer's own words for the time, Phoenix-anchored. America/Phoenix
  3. Wait until the timePauses precisely until that exact moment.
  4. Recheck + fireSkips if they cancelled / opted out, else fires the call. GR-001
Why honor their timing
Respecting the customer's own timing ("call me tomorrow at 2") makes the AI feel like a person, not a robocall, and the recheck means it never calls someone who already booked or opted out.
Ops & alerts
Ops & alerts

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.

n8n · Beem_error_alert — actual build
Beem_error_alert n8n canvas
The live n8n canvas.
fires on any workflow errorOps & alerts
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Error Trigger
Emails the error alert
Send a message
Sends a message
The safety net under every other workflowfires on any workflow error

Trigger

Set as the error workflow on the Beem workflows; fires on any failure.

Module flow

  1. Error triggerCatches a failure in any linked workflow.
  2. Email the alertSends the error to a monitored inbox. jjcavada1@gmail.com
Why alerting is non-negotiable
A system that runs revenue has to tell you when it breaks. Alerts route to a monitored inbox, never a dead dev address.
Platform layer · the CRM

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.

“Emily” — the SMS Conversation-AI bot
Inbound texts are handled by GoHighLevel's Conversation AI, “Emily.” She answers, quotes real open times, captures intent, and tags the contact. A tag is the bridge: it fires the n8n MindBody booking engine, which books the session and writes back the exact line Emily then sends. Emily is also the voice agent (same persona on the phone).

The tag lifecycle that drives everything

A contact moves through these tags; each transition fires an automation.

TagWhat it means / triggers
gf-new-leadNew lead — starts the ignition + nurture
ai_activeEmily is mid-conversation — holds other automations off
booking_requested→ the n8n MindBody booking engine books the session
bookedState tag: visible to reminders + no-show; suppresses nurture
no-showSet by the attendance poller → fires recovery SMS + call
session-complete → memberDrives the review, referral, and membership lifecycle
callback_requested · reschedule_requested · cancel_requested→ the matching n8n engine

Key custom fields

FieldRole
booking_replyThe exact line the bot speaks — written by the engine, sent verbatim (no hallucinated confirmations)
mindbody_client_idPins the customer's MindBody identity so book/check always hit the right record
available_slotsPre-fetched open times so Emily answers instantly
Last Visit · Total Sessions · Membership TierRetention + 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.

Platform layer · the voice agent

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.

AgentRole
Beem OutboundCalls leads, books, no-show recovery, reactivation · gpt-4.1
Beem InboundAnswers the line, books + manages appointments
Beem MembershipWarm 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.

FunctionWhat it does
check_available_booking_slotsReads REAL MindBody openings for a given date
book_appointmentBooks the session in MindBody
check_my_scheduleLooks up the caller's existing appointment
reschedule_appointmentMoves the caller's session to a new time
cancel_appointmentCancels the caller's upcoming session
get_lead_dataPulls the caller's details + current time / timezone
transfer_callHands off to a live human when needed
end_callEnds 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:

first_namelast_namefull_namephoneemailcall_reasonis_first_timerdirectioncurrent_datecurrent_timelead_nameagent_numberuser_numbercall_scriptcustom_instructions

Prompt structure

The prompt leads with a hard, authoritative override so the agent never hallucinates a booking. Its backbone:

SectionWhy it's there
Booking-engine authoritative override (read first)Locks the agent to the real engine — overrides everything below
The only functions that existNames the real tools; bans inventing capabilities
How availability really worksForces real MindBody slots, never made-up times
Critical init sequence + decision treeWhat to load and which function to call when
System + dynamic variablesHow to use the injected caller context
Developer Reference

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

WorkflowJob
Beem - Mindbody Leads to GHLLead intake (MindBody / funnel → GoHighLevel)
Beem - Retell Call FirerCentral outbound dialer (Emily), Bearer auth
Beem - MindBody Booking (ghl-book)The engine: book / check / reschedule / cancel
Beem - Retell Post-CallCall summary + transcript + tags
Beem - Reminder DispatcherConfirmation + photo reminders + no-show
Beem - Attendance PollerNo-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_alertError alerting to a monitored inbox

Standby & building blocks

WorkflowStatus
Beem_Post_Call_Analysisstandby 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→ WorkflowDownstream effect
New MindBody / funnel leadMindbody Leads to GHLCreates + tags the GoHighLevel contact
Emily (SMS or voice) books / checks / cancelsMindBody Booking engineLive MindBody action + truthful reply + tags
Tag callback_requestedCallback SchedulerParse time → wait → Call Firer
Tag no-show (from poller)Reminder Dispatcher · Call FirerRebooking SMS + recovery call
Retell call endsRetell Post-CallSummary + transcript note + tags
cron · 30 minAttendance Pollersession-complete / no-show + field bumps
cronAvailability PrefetchFresh open slots on the contact
Any workflow errorBeem_error_alertEmail 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.

ItemValue
MindBody studio5744189
SMS / voice number+1 480 520 6156
TimezoneAmerica/Phoenix
Booking engine webhookwebhook/beem-mindbody-book
Call firer webhookwebhook/beem-fire-call
Retell inbound agentagent_722bef…
Retell outbound agentagent_b8dca4…
GHL token (PIT)pit-xxxxxxxx-xxxx-…
n8n instanceguerilla-fi.app.n8n.cloud

Who to contact

RoleContact
Automation engineerJJ · jjcavada1@gmail.com
Error alerts go tojjcavada1@gmail.com
Booking system of recordMindBody studio 5744189
n8n instanceguerilla-fi.app.n8n.cloud