The voice-AI lead machine,
explained end to end.
Every firing n8n workflow behind United Defense Tactical's (Glendale) voice-AI system, a firearms-training & self-defense range, inbound and outbound: what fires it, what each module does, and where it hands off next. Verified against the live system on 2026-06-20 with real executions on record. Only the workflows actually running in production are shown here, each at full module-flow depth.
01System overview
One system handles leads in both directions. Outbound: the AI calls new leads in seconds and books them. Inbound: it answers every call 24/7 and books those too. n8n sits in the middle, orchestrating Retell, the GoHighLevel calendar, and the CRM.
The big picture
A new lead is created and tagged in GoHighLevel. Within seconds, n8n dials the lead with the AI agent. On the call it checks the calendar and books the appointment live, converting timezones and tagging the win. When the call ends, the system updates the CRM, moves the pipeline, and schedules the next touch in a 7-day / 7-call cadence, unless the lead asked to stop. Meanwhile, any inbound caller is answered 24/7, recognized as new or returning, and booked. Your team only shows up to the appointment, and 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, makes the decisions, and orchestrates Retell, Twilio and the CRM.
The outbound dialer
UDT_Glendale_Make_CallfiringThe moment a lead is ready, fire the AI phone call. But only the right leads, only in business hours, and never more than Retell can handle.Outcome A fresh lead is dialed by the AI within seconds, gated so bad numbers, already-booked, and after-hours leads are handled correctly, and call volume never exceeds Retell's concurrency limit.

Trigger
GoHighLevel pings the webhook the instant a lead is created or tagged. This is the speed-to-lead entry point for the whole outbound flow.
Module flow
- intl_phone_gate—Validates the number. Bad or non-US numbers never get dialed. gate
- Check Business Hours → Is Outside?—After hours, it generates a next-morning time and schedules the call instead of dialing at 2am. America/Phoenix
- search_contact—Pulls the lead's full record from GoHighLevel.
- self_book_gate—Already booked? Then don't call.
- human_followup_gate—Flagged for a human? Then skip the bot.
- Throttle_Batch / Throttle_Wait—Caps how many calls fire at once so it never blows past Retell's concurrency limit. concurrency
- trigger_call—The POST to Retell that actually places the call. Retell
The real-time booking brain
UDT_Glendale_Calendar_BookingsfiringWhat the AI uses live, mid-call, to read the calendar and book. It must answer in under 10 seconds or the call breaks, which is why it is built so tightly. 49 nodes, 5 routes.Outcome While the agent is still on the call, it can see open times, book the appointment, reschedule, or read back what's booked. All against the real GoHighLevel calendar, timezone-correct.

Trigger
The Retell agent calls these webhook functions live during the conversation, as tools it can reach for while talking.
Module flow
- check_calendar_availability—"What's open Friday?" reads GHL free-slots and answers with real times.
- book_appointment—"Book me Friday 2pm" converts the timezone, books in GHL, updates and tags the contact, then confirms. timezone tag
- getOpenSlots—Returns human ranges ("Morning 9 to 12, Afternoon 1 to 5") and handles non-local callers.
- reschedule (Get / Update Appointment)—"Move my appointment to next week" finds the event and updates it.
- get appointment—"What do I have booked?" fetches the confirmed future appointment.
Mid-call memory
UDT_Glendale_Update_ContactfiringA tiny utility the AI calls mid-conversation to save a fact instantly. An address, a detail, written straight onto the contact.Outcome Whatever the AI learns on the call is written to GoHighLevel the moment it is said, so the record is current before the call even ends.

Trigger
The Retell agent calls this webhook whenever it learns a fact worth storing.
Module flow
- Webhook—The agent hits this with the field to save.
- Update_GHL_Contact—Writes the value onto the contact in GoHighLevel. GHL
- Respond—Confirms back to the agent so the call keeps flowing.
After every call
UDT_Glendale_Post_CallfiringWhen the call ends, decide the next move and keep the CRM perfect. A compliance gate first, then one of three outcome paths. 59 nodes.Outcome Every call ends with the CRM updated, the lead tagged, the pipeline moved, and the next touch already scheduled. A do-not-call request stops everything, for compliance.

Trigger
Retell calls this webhook the moment a call ends (the outbound agent's post-call webhook).
Module flow
- dnc_check—First gate: if they said "stop calling," tag DNC and stop everything. compliance
- Path · callback requested—Schedules a Retell call for their preferred time and updates GHL.
- Path · not connected—Waits, checks for an existing appointment, then schedules the next call in the 7-day / 7-call cadence.
- Path · connected, no booking—Updates GHL with everything the AI learned and schedules a same-day follow-up.
- Write_Transcript_Note / Audit_Note—Writes the call summary back to the contact, so a human always sees what the bot did. visible artifact
- update_pipeline_stage + tags—Moves the opportunity (New Lead → Contacted → Booked).
The 24/7 answering machine
UDT_Glendale_InBound_callfiringWhen someone calls the business, the inbound AI instantly knows if you are open and who is calling, so it greets returning customers by name and books new ones, around the clock.Outcome Every inbound call is answered instantly. The AI knows your hours and whether the caller is new or returning, and either way they are in your CRM before the call ends. No missed calls, ever.

Trigger
The Retell inbound agent fires this webhook the moment a call comes in.
Module flow
- Config—Loads the GHL keys and location.
- Check Business Hours → Set True/False → Merge—Passes open/closed status so the agent can say "we're closed now, but I can get you booked." America/Phoenix
- Search_contact—Looks up the caller's phone number in GoHighLevel.
- new_customer (If)—New caller → Create_Contact → respond. Returning caller → format their record → respond, and the agent greets them by name.
Booked-appointment Slack alert
UDT_Glendale_ApptBooked_Slack_AlertfiringThe moment an appointment is booked, drop a real-time alert into Slack so the team sees the win instantly.Outcome Every booking pings the team's Slack channel with the appointment details. Instant visibility into what the AI is closing, without anyone watching the CRM.

Trigger
Fires when an appointment is booked (the booking event).
Module flow
- Trigger—Picks up the new booking.
- Format message—Builds the alert: who, when, and which service.
- Slack post—Drops the alert into the team channel. Slack
GoHighLevel · the CRM layer
GoHighLevel is the system of record: every lead, the pipeline, and the tags live here. A new lead tagged in GHL is the speed-to-lead trigger that fires the n8n outbound dialer, and every call writes its outcome straight back to the contact. UDT is voice-first, so GHL's job is to hold the lead and keep the record complete.
The tags that drive everything
Adding a tag in GoHighLevel is what fires an automation.
| Tag / event | What it triggers |
|---|---|
| New lead created + tagged | Speed-to-lead: GHL fires the Make_Call webhook into n8n in seconds |
| booked | State tag: suppresses further dials and the call cadence (GR-001) |
| ai-active | Lead is engaged — don't dial over an active conversation |
| DNC | Do-not-call: stops everything, for compliance |
GHL-side workflows & pipeline
| In GoHighLevel | Role |
|---|---|
| Speed-to-lead trigger | New tagged lead → fires the n8n Make_Call dialer instantly |
| Lead pipeline | New Lead → Contacted → Booked — moved by the n8n Post-Call workflow |
| Reminders & cadence | GHL sends the appointment reminders; n8n drives the 7-day / 7-call follow-up |
| Custom fields | Booking fields + call outcome, written back by the n8n engines |
cHM5P4HJGQqk3nYviV4T · timezone America/Phoenix (hardcoded).Retell · the voice agent
Retell is the voice. An outbound agent calls new leads in seconds and an inbound agent answers the line 24/7. Mid-call, the agent reaches into n8n through function tools to read and write the calendar in real time, the same booking brain documented above.
| Agent | Role |
|---|---|
| UDT_GLENDALE_OUTBOUND | Calls new leads, qualifies, books live on the call |
| UDT_Glendale_Inbound | Answers the line 24/7, recognizes callers, books |
| Number | +1 480 405 5948 |
Functions — the tools the agent calls mid-call
Each is a live webhook into the n8n booking workflows. The agent must answer within Retell's ~10-second tool window, which is why the booking brain is built so tightly.
| Function | What it does |
|---|---|
| check_calendar_availability | Is a specific date/time open? |
| getOpenSlots | Return real open slots as human ranges (“Morning 9 to 12”) |
| book_appointment | Book the appointment, convert timezone, tag the win |
| reschedule (get / update appointment) | Find and move the existing appointment |
| get_appointment | Read back what the caller has booked |
| update_contact | Save a fact to the contact mid-call |
Dynamic variables — context passed in at call time
Injected from GoHighLevel so the agent knows the lead before it speaks:
Prompt structure
The agent prompt follows the engineer playbook, not improvisation. Its backbone:
| Section | Why it's there |
|---|---|
| Identity + goal | Who the agent is and the one job: book the appointment |
| Existing-appointment confirm mode | Re-checks for a booking before offering a time — anti double-booking (GR-001) |
| Real-slots only | Offers only times the calendar actually has open — never invents a slot |
| Recording & compliance | Discloses recording near the top of the call |
| Voice & style | Warm, human, no “AI tells” |
Full workflow inventory
UDT voice-AI workflows with live status. firing = running now (Glendale) · standby = built, run on demand · off = inactive (other locations / paused). The six firing Glendale workflows are detailed in full above.
Glendale — live production firing
| Workflow | Job |
|---|---|
| UDT_Glendale_Make_Call | Outbound dialer — gates + places the AI call |
| UDT_Glendale_Calendar_Bookings | Live booking brain, 5 routes (49 nodes) |
| UDT_Glendale_Update_Contact | Mid-call contact-field writer |
| UDT_Glendale_Post_Call | Post-call CRM update + 7-day cadence (59 nodes) |
| UDT_Glendale_InBound_call | 24/7 inbound answering + caller lookup |
| UDT_Glendale_ApptBooked_Slack_Alert | Booking → real-time Slack alert |
Other locations & on-demand
| Workflow | Status |
|---|---|
| UDT_Glendale_Reactivation_call | standby bulk re-dial of dormant leads — run as a manual batch, not always-on |
| UDT_Scottsdale_* (Make_Call, Post_Call, error_alert) | off same template, Scottsdale config — currently paused |
| UDT_Grapevine_* (InBound, GV_Post_Call, GV_Reactivation, error_alert) | off same template, Grapevine config — currently paused |
What triggers what
The master map: every source event, the workflow it hits, and what happens next.
| Source | → Workflow | Downstream effect |
|---|---|---|
| New lead created + tagged in GoHighLevel | Make_Call | Gates the lead, then dials it with the AI |
| Retell agent (mid-call) | Calendar_Bookings | Check / book / reschedule / get appointment |
| Retell agent (mid-call) | Update_Contact | Save a fact to the contact live |
| Retell (outbound call ends) | Post_Call | DNC gate → outcome path → CRM + next touch |
| Retell inbound agent (call in) | InBound_call | Hours + new/returning lookup → book |
| Appointment booked | ApptBooked_Slack_Alert | Real-time Slack alert to the team |
Key IDs & config
Identifiers the Glendale workflows rely on. Secrets (keys/tokens) are redacted to their shape — real values live in the credential vault.
| Item | Value |
|---|---|
| GHL location (Glendale) | cHM5P4HJGQqk3nYviV4T |
| Voice number | +1 480 405 5948 |
| Timezone | America/Phoenix |
| Retell outbound agent | UDT_GLENDALE_OUTBOUND |
| Retell inbound agent | UDT_Glendale_Inbound |
| GHL token (PIT) | pit-xxxxxxxx-xxxx-… |
| Retell API key | key_xxxxxxxx… |
| 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 |
| n8n instance | guerilla-fi.app.n8n.cloud |