Work · AI receptionist / booking agent · Local martial-arts academy
AI Booking Concierge
A parent texts at 11pm and nobody is at the desk
An always-on AI front desk that answers every SMS and email lead, qualifies them, and books the right class automatically — no human in the loop.
- GoHighLevel
- Conversation AI
- SMS
- Role · sole designer & builder
- 6 min
- leads left waiting
- 0Scope
- auto-routing by age
- 5-calendarScope
- QA suite before go-live
- 19-caseScope
- System size
- System flow · 10 stages · 44 components reconstructed from the build record
The situation
The academy ran on inbound messages. Families texted and emailed at every hour, asking about classes for a child or for themselves. The front desk answered when it could, which meant class hours, rarely at night.
A family shopping for a trial does not wait. They message two or three academies in an evening and book with whoever answers first. The academy was losing trials it never knew it had.
A second problem sat underneath. Families rarely have one person training, and a parent asking about a five-year-old often has a nine-year-old in a different program.
What was broken
- After-hours inquiries sat until morning, by which time the family had usually booked elsewhere.
- Program routing depended on whoever read the message, so children were offered classes for the wrong age band.
- Pricing questions were answered inconsistently, undercutting the enrolment conversation the trial exists to create.
- Nothing distinguished a lead who said "bad time right now" from one who stopped replying.
Constraints
- Phase one covered SMS and email only. Voice, web chat, social and messaging channels were explicitly out of scope.
- The agent could never quote a price, a range, a floor or an anchor, in any form.
- Cancellations, freezes and billing changes had to leave the automation entirely, because contractual notice terms are not something an autonomous agent should transact.
- Under-16s could not be booked without a guardian's name, phone and email, and 16- and 17-year-olds entering the adult program needed guardian confirmation in the thread.
- The platform does not document re-invoking its booking action twice inside one conversation, so multi-person booking had to ship with a fallback rather than a promise.
FIG 01 · System Flow
How the system actually runs
Every component below is reconstructed from the project’s own build records. Nothing is added to make it look bigger.
- components
- 44
- components
- stages
- 10
- stages
- decisions & guards
- 19
- decisions & guards
- AI
- 1
- AI
- human handoffs
- 4
- human handoffs
- platforms
- 4
- platforms
- Stage 1, Entry & channels: Every way a lead reaches the agent, and the platform switch that makes email work at all.
- Inbound SMS & email (Source, GoHighLevel). A prospect texts or emails the academy at any hour and the same agent owns both threads. Connects to Primary-bot switch; Concierge agent.
- Reactivation drip reply (Source, GoHighLevel workflow). A cold-list contact replies to the reactivation campaign and is handed straight to the agent with positive intent. Connects to Concierge agent when positive intent.
- Primary-bot switch (Guard, Conversation AI). The agent is set as the account’s primary bot, which the platform requires before it will auto-reply to inbound email at all. Connects to Concierge agent when email auto-reply enabled.
- Stage 2, Conversation control: The persona, the pacing, the caps, and the guards that stop it double-texting.
- Concierge agent (AI, Conversation AI (auto-pilot)). The AI front desk — a fixed program-director persona replying with no human review. Connects to Conversation guardrails; Self-disclosure line when are you a bot?; Pricing deflection when price asked; Objection reflexes when known objection; Billing off-ramp when cancel · freeze · billing; Follow-up engine when contact goes quiet; Human handover when medical · hostile · out of scope.
- Conversation guardrails (Guard, Conversation AI). Three settings held together: a 15-second delay before SMS replies and 5 minutes before email, a hard ceiling of 20 agent messages per conversation, and instant sleep the moment a human or workflow sends into the thread. Connects to Who is training? when after the human-feel delay; Filtered inbox queue when 20-message cap.
- Self-disclosure line (Guard, Prompt (verbatim)). "Are you a bot?" is answered with one exact, unchangeable sentence, and then the agent moves on. Connects to Who is training? when answered, moves on; Human handover when sincere human request.
- Stage 3, Qualification: Establishing who is actually training before anything is offered.
- Who is training? (Decision, Prompt (booking step 1)). The first question always splits three ways — yourself, your child, or multiple family members. Connects to Whose details? when myself / my child; Family booking loop when multiple family members.
- Whose details? (Decision, Prompt). A self-booker gives their own details; a parent gives the child’s first name while the contact record stays the parent — and the agent checks the record first, confirming what is already on file instead of re-asking. Connects to Capture exact age when ask only what is missing.
- Stage 4, Knowledge & locked scripts: What the agent may retrieve, and the verbatim lines it may never improvise around.
- Five-document knowledge base (Data store, GoHighLevel knowledge base). The knowledge base is deliberately split into five documents — core/booking, pricing, membership and cancellation, objections, and boundaries/tone — all configured to always retrieve. Connects to Concierge agent.
- Staff-editable values (CRM record, GoHighLevel custom values). Phone, address, booking-page URL, academy name and the persona name live as CRM custom values the agent interpolates. Connects to Concierge agent.
- Pricing deflection (Guard, Prompt (hard-locked)). The agent may never quote a price, range, floor or anchor — one exact deflection script is used, and a second refusal to defer escalates to a human. Connects to Human handover when second demand; Live slot fetch when accepts, books.
- Objection reflexes (Message, Prompt + KB (verbatim)). Five common objections — not fit enough, too rough for my kid, too old, need to think about it, shy child — have word-for-word replies that all end in a booking nudge. Connects to Live slot fetch when booking nudge accepted.
- Billing off-ramp (Message, Prompt (verbatim)). Cancellation, freeze and billing-change questions get verbatim scripts routing the contact to the academy’s written-request email; the agent never negotiates or processes. Connects to Filtered inbox queue when written request only.
- Stage 5, Age routing: A number turned into exactly one program by table, not by model judgement.
- Capture exact age (Capture, Prompt). The agent must obtain a number before suggesting any program — a school grade, "my toddler" and "my teen" are all rejected as age signals. Connects to Age eligibility guards when range or out of window; Deterministic age router when exact number given.
- Age eligibility guards (Guard, Prompt). Ages outside 3–99 are refused politely, and a range answer ("around 5 or 6") forces a re-ask rather than a pick. Connects to Capture exact age when re-ask exact age; Deterministic age router when age 3–99.
- Deterministic age router (Decision, Multi-calendar booking action). A fixed table maps the age number to exactly one of five program calendars, with no fallback calendar because every eligible age already fits one. Connects to Five program calendars when one bracket, no fallback; Locked bracket rules when boundary age; Guardian consent gate when trainee under 18.
- Locked bracket rules (Guard, Prompt (locked)). Two boundary rules override the table: a 16-year-old always routes to the adult program even though the juniors calendar’s display name reads as if it includes 16, and a child who has just turned into a new bracket books the higher program. Connects to Five program calendars when 16 → adult · just turned 10 → juniors.
- Guardian consent gate (Guard, Prompt). Under-16s self-booking cannot be finalised without a guardian’s first name, phone and email; 16- and 17-year-olds booking the adult program need explicit in-thread guardian confirmation. Connects to Book appointment when guardian captured.
- Stage 6, Booking: Live availability, an explicit yes, and the loop for the rest of the family.
- Five program calendars (Calendar, GoHighLevel calendars). One calendar per age bracket — 3–4, 5–6, 7–9, 10–15 and 16+ — each matched by its exact name plus a keyword list, and offered to the prospect only by its plain-English program name. Connects to Live slot fetch.
- Live slot fetch (Calendar, Booking action). Real bookable slots are pulled from the routed calendar; if the window returns nothing the agent says so and offers the next window rather than inventing a time. Connects to Explicit confirmation when slot chosen; Follow-up engine when zero slots — no booking yet.
- Explicit confirmation (Decision, Prompt (booking step 5)). Name, program and date/time are read back and an affirmative is required before the booking action fires. Connects to Book appointment when explicit yes.
- Book appointment (Workflow, Appointment-booking action). The platform booking action is invoked silently against the matched calendar, then the agent sends the first-class brief — arrive early, workout clothes under a loaned uniform, water, shoes off — and flags the post-class enrolment meeting. Connects to Trainee name & age when trainee is not the contact; Booked tag; Family booking loop when book another?.
- Family booking loop (Decision, Prompt (loop logic)). After each booking the agent asks whether another family member should be booked and, on yes, loops back to name, age, route and confirm for the next person. Connects to Whose details? when yes — next family member; Loop fallback link when second booking action unavailable; Loop race guard when fields overwritten per child.
- Loop fallback link (Decision, Workflow + custom value). If the booking action cannot be re-invoked in one thread, the agent sends the staff-editable self-serve booking link for person two onward and fires a workflow that tags the contact pending and notifies staff; a stricter variant queues a manual callback within one business day. Connects to Staff SMS alert when pending tag + notify; Trial booked when books via the self-serve link.
- Stage 7, CRM writes: Fields, tags and one pipeline record per trainee on every booking.
- Trainee name & age (CRM record, Contact custom fields). The trial student’s first name and a bare numeric age are written to dedicated custom fields — and the name is deliberately not written when the contact is booking for themselves. Connects to Loop race guard.
- Loop race guard (Guard, Design constraint). Because the trainee fields are contact-level they are overwritten per child, so downstream automation must read them synchronously at booking time — mitigated either by creating the record inside the booking chain or by stamping trainee data onto the appointment itself. Connects to One record per trainee when read synchronously at booking.
- One record per trainee (CRM record, Opportunities + 3-stage pipeline). The contact stays the parent while each booked trainee becomes its own opportunity, moved along a dedicated three-stage pipeline by downstream automation rather than by the agent. Connects to Trial booked when moved to the booked stage.
- Booked tag (CRM record, GoHighLevel tag). A win tag applied by the booking action; it is the single signal every other subsystem reads to mean "stop chasing this person". Connects to Stop-bot action when win exit; Reply auto-reset; Day-30 sunset when excluded from sunset.
- Trial booked (Outcome, GoHighLevel). A confirmed trial on the age-correct calendar, trainee data captured, the win tag set and every chase system stood down.
- Stage 8, Follow-up ladder: What happens to a lead who goes quiet, shaped by why they went quiet.
- Follow-up engine (Workflow, Conversation AI auto-followup). The native follow-up engine runs underneath the agent, sending only between 9am and 8pm in the contact’s own timezone. Connects to Follow-up guardrails; Hard opt-out when STOP / unsubscribe; Soft decline when not interested.
- Follow-up guardrails (Guard, Auto-followup + workflows). Three rules wrap every ladder: channel switching is off so follow-ups go out on whichever channel the prospect used, the "trigger a workflow from inside a sequence" toggle is forced off everywhere, and the old scripted nudges in the handoff workflow were deleted while its stall tag and staff notification were kept. Connects to Silent-lead ladder when stopped responding; Busy-lead ladder when said they are busy; Requested-callback ladder when asked us to follow up.
- Silent-lead ladder (Message, Auto-followup (scenario A)). Five touches on a decaying cadence — 4 hours, then +24 hours, +3 days, +7 days, +14 days — each with a distinct frame: check-in, friction removal, social proof, permission to opt out, door-open close. Connects to Reply auto-reset when any inbound reply; Day-30 sunset when still unbooked at day 30.
- Busy-lead ladder (Message, Auto-followup (scenario B)). Three widely spaced touches — 2 days, +1 week, +3 weeks — for someone who explicitly said it is a bad time, ending in a stated farewell. Connects to Reply auto-reset when any inbound reply; Day-30 sunset when still unbooked at day 30.
- Requested-callback ladder (Message, Auto-followup (scenario C)). Two touches — the first timed by the AI to whatever window the contact actually named ("after the holidays", "ping me Monday"), then one friction-reduction message a day later. Connects to Reply auto-reset when any inbound reply.
- Reply auto-reset (Guard, Auto-followup). Any inbound reply cancels the remaining sequences in the active ladder and returns the conversation to the agent. Connects to Concierge agent when agent resumes.
- Stage 9, Suppression & escalation: Opt-out, hostility, sunset, and the eight conditions that fetch a human.
- Hard opt-out (Guard, Native opt-out). STOP, unsubscribe or remove-me applies a hard-stop tag, cancels every sequence, exits every campaign and permanently excludes the contact from future batches. Connects to Stop-bot action.
- Soft decline (Guard, AI suppression). "Not interested" applies a soft-no tag, exits the ladders, and additionally excludes the contact from the day-30 sunset. Connects to Day-30 sunset when excluded from sunset.
- Stop-bot action (Guard, Conversation AI). Four distinct conditions stop the agent for a contact: the win tag, a hard opt-out, hostility, and the sunset handoff tag. Connects to Filtered inbox queue when thread parked for a person.
- Day-30 sunset (Scheduled job, GoHighLevel workflow). At day 30 an unbooked, non-opted-out, non-hostile contact is retagged out of the active campaign and handed to a quarterly reactivation track — and the agent is explicitly stopped at that moment. Connects to Stop-bot action when handed to the quarterly track.
- Human handover (Human, Handover action). Eight named conditions hand the thread to a person — medical or injury, a refused pricing deflection, hostility, a broken link or calendar error, out-of-scope curriculum questions, a non-English message, an explicit ask for a human, and any sincere human request after the self-disclosure line. The agent stops replying and does not announce that it is leaving. Connects to Stop-bot action when agent stops silently; Staff SMS alert.
- Staff SMS alert (Staff alert, GoHighLevel notification). Every handover fires an SMS to the program director — a channel choice explicitly signed off rather than assumed. Connects to Filtered inbox queue.
- Filtered inbox queue (Human, Conversations inbox). Handed-over conversations are picked up in the CRM inbox filtered by the handoff tag. Connects to Trial booked when a human closes the booking.
- Stage 10, QA & rollout: The gates the agent had to pass before, and while, going live.
- 19-case QA suite (Report, Bot trial mode). Nineteen scripted inbound messages with expected behaviours — age-routing edges, the bot-or-human question, the pricing demand, a medical question, a broken link, a non-English message, hostility, STOP, an empty calendar, a cancellation request and the multi-child loop — plus five ladder tests and one end-to-end run on a known-safe number. Connects to 20-conversation audit when 19 cases + safe-contact test pass; Concierge agent when every locked rule made falsifiable.
- 20-conversation audit (Human, Manual review). Exactly twenty real conversations run under transcript review for pricing leakage, routing errors, missed handovers and voice drift before the hold is lifted and the agent handles all inbound unsupervised. Connects to Concierge agent when issues found — rework.
A parent texts at 11pm: "do you have classes for kids?" — the hour that used to mean waiting until morning.
0/17A parent texts at 11pm: "do you have classes for kids?" — the hour that used to mean waiting until morning.
Read this system as text
Stage 01
Entry & channels
Every way a lead reaches the agent, and the platform switch that makes email work at all.
- Inbound SMS & email · Source · GoHighLevel — A prospect texts or emails the academy at any hour and the same agent owns both threads. → Primary-bot switch, Concierge agent
- Reactivation drip reply · Source · GoHighLevel workflow — A cold-list contact replies to the reactivation campaign and is handed straight to the agent with positive intent. → Concierge agent (positive intent)
- Primary-bot switch · Guard · Conversation AI — The agent is set as the account’s primary bot, which the platform requires before it will auto-reply to inbound email at all. → Concierge agent (email auto-reply enabled)
Stage 02
Conversation control
The persona, the pacing, the caps, and the guards that stop it double-texting.
- Concierge agent · AI · Conversation AI (auto-pilot) — The AI front desk — a fixed program-director persona replying with no human review. → Conversation guardrails, Self-disclosure line (are you a bot?), Pricing deflection (price asked), Objection reflexes (known objection), Billing off-ramp (cancel · freeze · billing), Follow-up engine (contact goes quiet), Human handover (medical · hostile · out of scope)
- Conversation guardrails · Guard · Conversation AI — Three settings held together: a 15-second delay before SMS replies and 5 minutes before email, a hard ceiling of 20 agent messages per conversation, and instant sleep the moment a human or workflow sends into the thread. → Who is training? (after the human-feel delay), Filtered inbox queue (20-message cap)
- Self-disclosure line · Guard · Prompt (verbatim) — "Are you a bot?" is answered with one exact, unchangeable sentence, and then the agent moves on. → Who is training? (answered, moves on), Human handover (sincere human request)
Stage 03
Qualification
Establishing who is actually training before anything is offered.
- Who is training? · Decision · Prompt (booking step 1) — The first question always splits three ways — yourself, your child, or multiple family members. → Whose details? (myself / my child), Family booking loop (multiple family members)
- Whose details? · Decision · Prompt — A self-booker gives their own details; a parent gives the child’s first name while the contact record stays the parent — and the agent checks the record first, confirming what is already on file instead of re-asking. → Capture exact age (ask only what is missing)
Stage 04
Knowledge & locked scripts
What the agent may retrieve, and the verbatim lines it may never improvise around.
- Five-document knowledge base · Data store · GoHighLevel knowledge base — The knowledge base is deliberately split into five documents — core/booking, pricing, membership and cancellation, objections, and boundaries/tone — all configured to always retrieve. → Concierge agent
- Staff-editable values · CRM record · GoHighLevel custom values — Phone, address, booking-page URL, academy name and the persona name live as CRM custom values the agent interpolates. → Concierge agent
- Pricing deflection · Guard · Prompt (hard-locked) — The agent may never quote a price, range, floor or anchor — one exact deflection script is used, and a second refusal to defer escalates to a human. → Human handover (second demand), Live slot fetch (accepts, books)
- Objection reflexes · Message · Prompt + KB (verbatim) — Five common objections — not fit enough, too rough for my kid, too old, need to think about it, shy child — have word-for-word replies that all end in a booking nudge. → Live slot fetch (booking nudge accepted)
- Billing off-ramp · Message · Prompt (verbatim) — Cancellation, freeze and billing-change questions get verbatim scripts routing the contact to the academy’s written-request email; the agent never negotiates or processes. → Filtered inbox queue (written request only)
Stage 05
Age routing
A number turned into exactly one program by table, not by model judgement.
- Capture exact age · Capture · Prompt — The agent must obtain a number before suggesting any program — a school grade, "my toddler" and "my teen" are all rejected as age signals. → Age eligibility guards (range or out of window), Deterministic age router (exact number given)
- Age eligibility guards · Guard · Prompt — Ages outside 3–99 are refused politely, and a range answer ("around 5 or 6") forces a re-ask rather than a pick. → Capture exact age (re-ask exact age), Deterministic age router (age 3–99)
- Deterministic age router · Decision · Multi-calendar booking action — A fixed table maps the age number to exactly one of five program calendars, with no fallback calendar because every eligible age already fits one. → Five program calendars (one bracket, no fallback), Locked bracket rules (boundary age), Guardian consent gate (trainee under 18)
- Locked bracket rules · Guard · Prompt (locked) — Two boundary rules override the table: a 16-year-old always routes to the adult program even though the juniors calendar’s display name reads as if it includes 16, and a child who has just turned into a new bracket books the higher program. → Five program calendars (16 → adult · just turned 10 → juniors)
- Guardian consent gate · Guard · Prompt — Under-16s self-booking cannot be finalised without a guardian’s first name, phone and email; 16- and 17-year-olds booking the adult program need explicit in-thread guardian confirmation. → Book appointment (guardian captured)
Stage 06
Booking
Live availability, an explicit yes, and the loop for the rest of the family.
- Five program calendars · Calendar · GoHighLevel calendars — One calendar per age bracket — 3–4, 5–6, 7–9, 10–15 and 16+ — each matched by its exact name plus a keyword list, and offered to the prospect only by its plain-English program name. → Live slot fetch
- Live slot fetch · Calendar · Booking action — Real bookable slots are pulled from the routed calendar; if the window returns nothing the agent says so and offers the next window rather than inventing a time. → Explicit confirmation (slot chosen), Follow-up engine (zero slots — no booking yet)
- Explicit confirmation · Decision · Prompt (booking step 5) — Name, program and date/time are read back and an affirmative is required before the booking action fires. → Book appointment (explicit yes)
- Book appointment · Workflow · Appointment-booking action — The platform booking action is invoked silently against the matched calendar, then the agent sends the first-class brief — arrive early, workout clothes under a loaned uniform, water, shoes off — and flags the post-class enrolment meeting. → Trainee name & age (trainee is not the contact), Booked tag, Family booking loop (book another?)
- Family booking loop · Decision · Prompt (loop logic) — After each booking the agent asks whether another family member should be booked and, on yes, loops back to name, age, route and confirm for the next person. → Whose details? (yes — next family member), Loop fallback link (second booking action unavailable), Loop race guard (fields overwritten per child)
- Loop fallback link · Decision · Workflow + custom value — If the booking action cannot be re-invoked in one thread, the agent sends the staff-editable self-serve booking link for person two onward and fires a workflow that tags the contact pending and notifies staff; a stricter variant queues a manual callback within one business day. → Staff SMS alert (pending tag + notify), Trial booked (books via the self-serve link)
Stage 07
CRM writes
Fields, tags and one pipeline record per trainee on every booking.
- Trainee name & age · CRM record · Contact custom fields — The trial student’s first name and a bare numeric age are written to dedicated custom fields — and the name is deliberately not written when the contact is booking for themselves. → Loop race guard
- Loop race guard · Guard · Design constraint — Because the trainee fields are contact-level they are overwritten per child, so downstream automation must read them synchronously at booking time — mitigated either by creating the record inside the booking chain or by stamping trainee data onto the appointment itself. → One record per trainee (read synchronously at booking)
- One record per trainee · CRM record · Opportunities + 3-stage pipeline — The contact stays the parent while each booked trainee becomes its own opportunity, moved along a dedicated three-stage pipeline by downstream automation rather than by the agent. → Trial booked (moved to the booked stage)
- Booked tag · CRM record · GoHighLevel tag — A win tag applied by the booking action; it is the single signal every other subsystem reads to mean "stop chasing this person". → Stop-bot action (win exit), Reply auto-reset, Day-30 sunset (excluded from sunset)
- Trial booked · Outcome · GoHighLevel — A confirmed trial on the age-correct calendar, trainee data captured, the win tag set and every chase system stood down.
Stage 08
Follow-up ladder
What happens to a lead who goes quiet, shaped by why they went quiet.
- Follow-up engine · Workflow · Conversation AI auto-followup — The native follow-up engine runs underneath the agent, sending only between 9am and 8pm in the contact’s own timezone. → Follow-up guardrails, Hard opt-out (STOP / unsubscribe), Soft decline (not interested)
- Follow-up guardrails · Guard · Auto-followup + workflows — Three rules wrap every ladder: channel switching is off so follow-ups go out on whichever channel the prospect used, the "trigger a workflow from inside a sequence" toggle is forced off everywhere, and the old scripted nudges in the handoff workflow were deleted while its stall tag and staff notification were kept. → Silent-lead ladder (stopped responding), Busy-lead ladder (said they are busy), Requested-callback ladder (asked us to follow up)
- Silent-lead ladder · Message · Auto-followup (scenario A) — Five touches on a decaying cadence — 4 hours, then +24 hours, +3 days, +7 days, +14 days — each with a distinct frame: check-in, friction removal, social proof, permission to opt out, door-open close. → Reply auto-reset (any inbound reply), Day-30 sunset (still unbooked at day 30)
- Busy-lead ladder · Message · Auto-followup (scenario B) — Three widely spaced touches — 2 days, +1 week, +3 weeks — for someone who explicitly said it is a bad time, ending in a stated farewell. → Reply auto-reset (any inbound reply), Day-30 sunset (still unbooked at day 30)
- Requested-callback ladder · Message · Auto-followup (scenario C) — Two touches — the first timed by the AI to whatever window the contact actually named ("after the holidays", "ping me Monday"), then one friction-reduction message a day later. → Reply auto-reset (any inbound reply)
- Reply auto-reset · Guard · Auto-followup — Any inbound reply cancels the remaining sequences in the active ladder and returns the conversation to the agent. → Concierge agent (agent resumes)
Stage 09
Suppression & escalation
Opt-out, hostility, sunset, and the eight conditions that fetch a human.
- Hard opt-out · Guard · Native opt-out — STOP, unsubscribe or remove-me applies a hard-stop tag, cancels every sequence, exits every campaign and permanently excludes the contact from future batches. → Stop-bot action
- Soft decline · Guard · AI suppression — "Not interested" applies a soft-no tag, exits the ladders, and additionally excludes the contact from the day-30 sunset. → Day-30 sunset (excluded from sunset)
- Stop-bot action · Guard · Conversation AI — Four distinct conditions stop the agent for a contact: the win tag, a hard opt-out, hostility, and the sunset handoff tag. → Filtered inbox queue (thread parked for a person)
- Day-30 sunset · Scheduled job · GoHighLevel workflow — At day 30 an unbooked, non-opted-out, non-hostile contact is retagged out of the active campaign and handed to a quarterly reactivation track — and the agent is explicitly stopped at that moment. → Stop-bot action (handed to the quarterly track)
- Human handover · Human · Handover action — Eight named conditions hand the thread to a person — medical or injury, a refused pricing deflection, hostility, a broken link or calendar error, out-of-scope curriculum questions, a non-English message, an explicit ask for a human, and any sincere human request after the self-disclosure line. The agent stops replying and does not announce that it is leaving. → Stop-bot action (agent stops silently), Staff SMS alert
- Staff SMS alert · Staff alert · GoHighLevel notification — Every handover fires an SMS to the program director — a channel choice explicitly signed off rather than assumed. → Filtered inbox queue
- Filtered inbox queue · Human · Conversations inbox — Handed-over conversations are picked up in the CRM inbox filtered by the handoff tag. → Trial booked (a human closes the booking)
Stage 10
QA & rollout
The gates the agent had to pass before, and while, going live.
- 19-case QA suite · Report · Bot trial mode — Nineteen scripted inbound messages with expected behaviours — age-routing edges, the bot-or-human question, the pricing demand, a medical question, a broken link, a non-English message, hostility, STOP, an empty calendar, a cancellation request and the multi-child loop — plus five ladder tests and one end-to-end run on a known-safe number. → 20-conversation audit (19 cases + safe-contact test pass), Concierge agent (every locked rule made falsifiable)
- 20-conversation audit · Human · Manual review — Exactly twenty real conversations run under transcript review for pricing leakage, routing errors, missed handovers and voice drift before the hold is lifted and the agent handles all inbound unsupervised. → Concierge agent (issues found — rework)
Platforms · GoHighLevel · Conversation AI · SMS · Email
What I built
An AI front desk on GoHighLevel Conversation AI, owning SMS and email in auto-pilot. The interesting part is not the answering. It is the rules deciding when the agent must not answer.
The agent and its guardrails
The agent runs as a fixed program-director persona. Three settings sit around it. A fifteen-second delay before an SMS reply and five minutes before an email, a ceiling of twenty agent messages per conversation, and instant sleep the moment a human or workflow sends into the thread. An instant reply reads as a machine, an uncapped agent loops, and a live bot behind a live staff member double-texts the prospect.
Setting the agent as the account's primary bot was a prerequisite, not a preference. Without that switch the platform never auto-answers inbound email at all.
Knowledge and locked scripts
The knowledge base is split into five documents rather than one: core and booking, pricing, membership and cancellation, objections, and boundaries and tone. One long document dilutes retrieval, and the pricing text is the highest-stakes writing in the system.
Pricing is hard-locked. The agent uses one exact deflection script, and a second refusal to defer escalates to a person. The knowledge base's own price anchor was revoked in the prompt, so the system's most important instruction contradicts its own source material. Five common objections carry word-for-word replies ending in a booking nudge, and "are you a bot?" has one unchangeable sentence.
Deterministic age routing
The agent must obtain an actual number before it suggests anything. A school grade, "my toddler" and "my teen" are rejected as age signals. Ages outside 3 to 99 are refused politely, and a range such as "around five or six" forces a re-ask.
A fixed table then maps the number to exactly one of five program calendars: 3-4, 5-6, 7-9, 10-15 and 16+. There is no fallback calendar, because every eligible age already fits a bracket. Two locked rules override the table where the labels lie, since one calendar's display name disagrees with the real rule for legacy reasons and renaming it was not available to me. Routing by table rather than by model judgement is what makes "never books into the wrong program" a design property instead of a hope.
Booking, and the rest of the family
Slots are fetched live from the routed calendar. The agent has no schedule of its own, so it cannot promise a time that does not exist. Name, program and time are read back, and an affirmative is required before the booking action fires. Then comes the first-class brief: arrive early, workout clothes, water, shoes off.
Then it asks whether anyone else should be booked and loops back through name, age, routing and confirmation. The platform does not document re-invoking the booking action in one thread, so the loop carries a fallback. The self-serve booking link for person two onward, a pending tag, and a staff notification.
CRM writes and the overwrite race
Trainee first name and a numeric age write to dedicated contact fields, and the name is not written when someone books for themselves. Those fields are contact-level, so the family loop overwrites them per child. I recorded that as a race with two mitigations, and held multi-person booking at full volume until it is verified. Each trainee becomes its own opportunity on a three-stage pipeline while the parent stays one contact.
The follow-up ladder
The native follow-up engine sends only between 9am and 8pm in the contact's own timezone. Three ladders run beneath it, chosen by why the lead went quiet. Silence gets five touches at four hours, then plus twenty-four hours, three days, seven days and fourteen days. Someone who said it is a bad time gets three widely spaced touches ending in a farewell. Someone who named a window gets two, the first timed to it.
Edge cases and failure handling
- A sixteen-year-old, where the calendar name and the rule disagree: the locked bracket rule wins over the label, and a child who has just aged into a new bracket books the higher program.
- A minor booking themselves: nothing finalises without guardian contact details, and 16- and 17-year-olds need in-thread guardian confirmation.
- A billing, freeze or cancellation question: a verbatim script points the member at the written-request email and the thread lands in a tag-filtered inbox. The handover is silent, because announcing it advertises the software at the worst moment.
- Any inbound reply mid-ladder cancels the remaining sends and returns the thread to the agent.
- STOP cancels every sequence and excludes the contact from future batches. A soft "not interested" also excludes them from the day-30 sunset, so a cleanup job cannot become a second unwanted message.
- Medical questions, hostility, a broken link, an empty calendar, out-of-scope curriculum questions or a non-English message: eight named conditions fetch a person, alert the program director by SMS, and stop the agent.
How I verified it
I wrote a 19-case QA suite and ran it in the platform's bot trial mode before go-live. The cases turn every locked rule into a falsifiable input. Age-routing edges, the bot-or-human question, a pricing demand, a medical question, a broken link, a non-English message, hostility, STOP, an empty calendar and the multi-child loop. Five ladder tests sit alongside, one forcing a test contact into a distant timezone to prove the quiet-hours window.
Go-live was a volume hold rather than a switch. After an end-to-end run on a known-safe number, exactly twenty real conversations ran under transcript review for pricing leakage, routing errors, missed handovers and voice drift. The blast radius of an unknown failure was capped at twenty.
What changed
The academy has an always-on front desk. Every inbound SMS and email is answered as it arrives, so no lead waits for office hours. Prospects are qualified and routed with no human review, into five age-segmented calendars, by table rather than by judgement. Wrong-program bookings are designed out.
The eight handover conditions are the honest part of the claim. This is not a system with no humans in it. It is one that knows which conversations to lose to a person, and fetches one without announcing itself.
Before / after
- Before
- ✕ Leads waited overnight for a reply
- ✕ Front desk triaged every inquiry by hand
- ✕ Families routed to the wrong program
- ✕ After-hours inquiries quietly lost
- After
- ✓ Every inbound answered instantly, day or night
- ✓ Every prospect qualified and routed with zero human review
- ✓ Wrong-program bookings designed out
- ✓ Front desk freed from repetitive booking chat
ScopeFigures on this page describe what was built, covered or verified — not a measured lift.
Related systems
Not a one-off.
Aesthetics clinic · via agency
Live launch & fault triage
The same AI front desk, taken live and fault-triaged under a paid campaign.
5silent faults fixed in a "finished" buildScope
Martial-arts academy · same client as CS-01, via agency
Replicable studio website + CRM template
Same studio — the website and CRM template that feeds this concierge's bookings.
21replication docs — one live site, built to be forkedScope
Home-care agency · multi-county footprint, three payer lanes
Regulated-market lead engine
The same qualify-and-book agent, rebuilt where one wrong message is a legal risk.
0coordinator messages possible — compliance by structureScope
Have something close to this? Book a call. I’ll tell you if I’ve already built it.
One Manila business day to reply. All client work is under NDA; what you see here is redrawn architecture with real metrics.