United Defense Tactical · Glendale n8n end-to-end · live audit 2026-06-20
Voice-AI Automation Handoff

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.

Prepared for
Daylon · United Defense Tactical
The stack
n8n · GoHighLevel · Retell · Twilio
Scale
6 firing workflows · Glendale live
Author
JJ · Automation engineer
Firing — running in production now Sub — reusable building block Standby — built, waiting to switch on Off — inactive (other locations / paused)
Orientation

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.

Phase 1
Lead in → AI dials
Phase 2
AI books, live on the call
Phase 3
Call ends → CRM + next touch
Phase 4
Inbound answered 24/7

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.

StartA new lead comes in — Facebook / Google ad, web form, or missed callSource
Phase 1GoHighLevel creates & tags the contactStage · New Lead
FireGoHighLevel fires the Make_Call webhook into n8nthe starting gun
Phase 2n8n gates the lead and dials it with the AI agent in secondsStage · Speed-to-Lead
CallLive on the call, the AI reads the calendar and books the appointmentStage · Booked
Phase 3Call ends → CRM updated, pipeline moved, next touch scheduledStage · Post-Call
InboundAny inbound call is answered 24/7 and the caller is booked too24 / 7
DoneCustomer shows up · every outcome logged back to GoHighLevelStage · Done

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.

01
Lead source
Ad · form · missed call
02
GoHighLevel
CRM + calendar + tags
03
n8n
The glue — triggers & logic
04
Retell
the voice AI agent
05
Twilio
Carries the calls
One template, three locations
Glendale is the live production system shown here, with real call executions on record. The same five-workflow template also runs Scottsdale and Grapevine (currently paused). Only the config block changes per location: the GoHighLevel location, calendar, phone number, and Retell agent. The logic is identical, which is what makes this a product to stamp out per location, not a one-off build.
Outbound · lead to booked call
Outbound · lead to booked call

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.

n8n · UDT_Glendale_Make_Call — actual build
UDT_Glendale_Make_Call n8n canvas
The live n8n canvas.
→ hands the live call to Calendar_BookingsOutbound · lead to booked call
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
Search contact
Pulls the lead’s full record from GHL
Trigger call
Places the call via Retell (the AI agent)
Check Business Hours
Checks if it is inside business hours
Is Outside Business Hours?
Checks if it is inside business hours
Schedule call back
Retell voice call
Generate Next Day Morning
Logic / decision
Throttle Batch
Caps concurrent calls to Retell’s limit
Human followup gate
Flagged for a human? skip the bot
Throttle Wait
Caps concurrent calls to Retell’s limit
Rate limit dlq placeholder
Logic / decision
Self book gate
Already booked? then do not call
Intl phone gate
Validates the phone number (US / valid only)
Places the Retell call; the agent then uses Calendar_Bookings live→ hands the live call to Calendar_Bookings

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

  1. intl_phone_gateValidates the number. Bad or non-US numbers never get dialed. gate
  2. Check Business Hours → Is Outside?After hours, it generates a next-morning time and schedules the call instead of dialing at 2am. America/Phoenix
  3. search_contactPulls the lead's full record from GoHighLevel.
  4. self_book_gateAlready booked? Then don't call.
  5. human_followup_gateFlagged for a human? Then skip the bot.
  6. Throttle_Batch / Throttle_WaitCaps how many calls fire at once so it never blows past Retell's concurrency limit. concurrency
  7. trigger_callThe POST to Retell that actually places the call. Retell
Why the gates matter
Speed-to-lead wins jobs, but dialing the wrong lead (bad number, already booked, after hours) burns money and trust. The gates make the system fast and safe at once, and the throttle is what lets one instance call hundreds of leads without falling over.
Outbound · lead to booked call

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.

n8n · UDT_Glendale_Calendar_Bookings — actual build
UDT_Glendale_Calendar_Bookings n8n canvas
The live n8n canvas.
← used live by the call · booking tags drive Post_CallOutbound · lead to booked call
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Set Variables
Logic / decision
Switch
Routes to the matching function
Start Time
Logic / decision
Add Day
Logic / decision
End Date
Logic / decision
Get Open Slots
Returns human time ranges to the AI
Success get Open Slots
Returns human time ranges to the AI
Book Appointment
Books the slot in GHL + tags the win
Booking Success
Logic / decision
Success Booking
Returns the response
Unsuccessful Booking
Returns the response
Set Contact Id Found
Logic / decision
Code
Logic / decision
Start Time1
Logic / decision
Add Day1
Logic / decision
End Date1
Logic / decision
Get Open Slots1
Returns human time ranges to the AI
Success get Open Slots1
Returns human time ranges to the AI
Code1
Logic / decision
Formatted Date
Logic / decision
Merge
Merges the branches back together
Code2
Logic / decision
Code3
Logic / decision
Success Booking1
Returns the response
Unsuccessful Booking1
Returns the response
Set Contact Id Found1
Logic / decision
Formatted Date1
Logic / decision
Merge1
Merges the branches back together
Update Appointment
Reschedules the appointment
Updating Success
Logic / decision
Get Location ID1
GoHighLevel API call
Edit Fields
Logic / decision
Webhook
Entry point — receives the trigger
Update contact2
Saves a fact to the contact
If
Logic / decision
If1
Logic / decision
Update contact
Saves a fact to the contact
HTTP Request
Calendar read / write
Split Out
Logic / decision
Filter
Logic / decision
Sort
Logic / decision
Limit
Logic / decision
Edit Fields1
Logic / decision
Success get Open Slots2
Returns human time ranges to the AI
If2
Logic / decision
Reomve tags
Adds / removes a CRM tag
Add tag
Adds / removes a CRM tag
Reomve tags1
Adds / removes a CRM tag
Add tag1
Adds / removes a CRM tag
Search Opportunity
GoHighLevel API call
Move to Appt Booked
GoHighLevel API call
Called by the Retell agent mid-call (5 functions)← used live by the call · booking tags drive Post_Call

Trigger

The Retell agent calls these webhook functions live during the conversation, as tools it can reach for while talking.

Module flow

  1. check_calendar_availability"What's open Friday?" reads GHL free-slots and answers with real times.
  2. book_appointment"Book me Friday 2pm" converts the timezone, books in GHL, updates and tags the contact, then confirms. timezone tag
  3. getOpenSlotsReturns human ranges ("Morning 9 to 12, Afternoon 1 to 5") and handles non-local callers.
  4. reschedule (Get / Update Appointment)"Move my appointment to next week" finds the event and updates it.
  5. get appointment"What do I have booked?" fetches the confirmed future appointment.
Why under 10 seconds
Retell holds the call open waiting for this workflow to answer. If it takes too long the caller hears dead air and the call fails. Every route reads or writes GoHighLevel and responds fast, which is what makes booking feel natural mid-conversation instead of "let me take a message."
Outbound · lead to booked call

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.

n8n · UDT_Glendale_Update_Contact — actual build
UDT_Glendale_Update_Contact n8n canvas
The live n8n canvas.
← called by the agent · writes to GoHighLevelOutbound · lead to booked call
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
Update GHL Contact
Writes the field back to GHL
Respond to Webhook
Responds to the caller / agent
Called by the Retell agent mid-call← called by the agent · writes to GoHighLevel

Trigger

The Retell agent calls this webhook whenever it learns a fact worth storing.

Module flow

  1. WebhookThe agent hits this with the field to save.
  2. Update_GHL_ContactWrites the value onto the contact in GoHighLevel. GHL
  3. RespondConfirms back to the agent so the call keeps flowing.
Small but important
Without this, details the customer gives mid-call would be lost or need manual entry later. It keeps the CRM truthful in real time, the same visible-artifact rule the whole system follows.
Outbound · lead to booked call

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.

n8n · UDT_Glendale_Post_Call — actual build
UDT_Glendale_Post_Call n8n canvas
The live n8n canvas.
→ schedules the next call (7-day / 7-call cadence)Outbound · lead to booked call
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
If
Logic / decision
Call Back Requested
Logic / decision
Update contact1
Saves a fact to the contact
Schedule call back
Retell voice call
Call back time unix
Logic / decision
Call not connected
Logic / decision
Get current day time
Logic / decision
Schedule call back1
Retell voice call
Update contact
Saves a fact to the contact
Schedule call back2
Retell voice call
Get opportunity
GoHighLevel API call
Get opportunity 1
GoHighLevel API call
Update pipeline stage
Moves the opportunity to the next stage
Update pipeline stage1
Moves the opportunity to the next stage
Reomve tags
Adds / removes a CRM tag
Add tag
Adds / removes a CRM tag
If2
Logic / decision
Reomve tags3
Adds / removes a CRM tag
Add tag3
Adds / removes a CRM tag
Reomve tags4
Adds / removes a CRM tag
Add tag4
Adds / removes a CRM tag
If3
Logic / decision
Reomve tags5
Adds / removes a CRM tag
Add tag5
Adds / removes a CRM tag
Reomve tags6
Adds / removes a CRM tag
Add tag6
Adds / removes a CRM tag
Config
Loads the GHL location, keys & settings
Call Evaluator App
API call
HTTP Request
Calendar read / write
Wait
Logic / decision
If4
Logic / decision
Sort
Logic / decision
Limit
Logic / decision
Split Out1
Logic / decision
Check If Item Exists
Logic / decision
Calculate Next Call Time
Logic / decision
Dnc check
Do-not-call gate: stop if they opted out
Set DND
GoHighLevel API call
Remove Cadence Tags
Adds / removes a CRM tag
Add DNC Tags
Do-not-call gate: stop if they opted out
Audit Note
Writes a visible audit note to the CRM
Write Transcript Note
Writes the call summary to the contact
Tag AI Call Logged
Adds / removes a CRM tag
Fetch current tags
Adds / removes a CRM tag
Human only gate
Logic / decision
Dup check gate
Logic / decision
Fetch appointments
Calendar read / write
Detect duplicate
Logic / decision
Is duplicate branch
Logic / decision
Tag duplicate
Adds / removes a CRM tag
Note duplicate
Writes a note to the CRM
Needs text followup check
Logic / decision
Send followup sms
GoHighLevel API call
Tag sms sent
Adds / removes a CRM tag
Slack alert duplicate
Posts the booking alert to Slack
Booking win check
Logic / decision
Slack alert win
Posts the booking alert to Slack
Fired by Retell when the call ends→ schedules the next call (7-day / 7-call cadence)

Trigger

Retell calls this webhook the moment a call ends (the outbound agent's post-call webhook).

Module flow

  1. dnc_checkFirst gate: if they said "stop calling," tag DNC and stop everything. compliance
  2. Path · callback requestedSchedules a Retell call for their preferred time and updates GHL.
  3. Path · not connectedWaits, checks for an existing appointment, then schedules the next call in the 7-day / 7-call cadence.
  4. Path · connected, no bookingUpdates GHL with everything the AI learned and schedules a same-day follow-up.
  5. Write_Transcript_Note / Audit_NoteWrites the call summary back to the contact, so a human always sees what the bot did. visible artifact
  6. update_pipeline_stage + tagsMoves the opportunity (New Lead → Contacted → Booked).
Why this is the most important workflow
This is the difference between a bot that calls and a system that runs the lead. It guarantees the CRM is never stale, the cadence never drops a lead, and every call leaves a visible note. The exact lesson that keeps clients from thinking "the bot isn't working" when it actually is.
Inbound · 24/7 answering
Inbound · 24/7 answering

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.

n8n · UDT_Glendale_InBound_call — actual build
UDT_Glendale_InBound_call n8n canvas
The live n8n canvas.
→ returns caller context to the inbound agentInbound · 24/7 answering
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
Search contact1
Pulls the lead’s full record from GHL
New customer1
New caller vs returning caller?
Create Contact
Creates the contact in GHL
Code
Logic / decision
Respond to Webhook
Responds to the caller / agent
Respond to Webhook1
Responds to the caller / agent
Check Business Hours
Checks if it is inside business hours
Set Business Hours True
Checks if it is inside business hours
Set Business Hours False
Checks if it is inside business hours
Merge
Merges the branches back together
Config
Loads the GHL location, keys & settings
Fired by the Retell inbound agent on every call→ returns caller context to the inbound agent

Trigger

The Retell inbound agent fires this webhook the moment a call comes in.

Module flow

  1. ConfigLoads the GHL keys and location.
  2. Check Business Hours → Set True/False → MergePasses open/closed status so the agent can say "we're closed now, but I can get you booked." America/Phoenix
  3. Search_contactLooks up the caller's phone number in GoHighLevel.
  4. new_customer (If)New caller → Create_Contact → respond. Returning caller → format their record → respond, and the agent greets them by name.
Why inbound matters as much as outbound
A missed inbound call is a customer who was ready to buy. This answers 24/7, never puts anyone on hold, and makes the business look bigger and more responsive than it is, while quietly keeping the CRM complete.
Ops & alerts
Ops & alerts

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.

n8n · UDT_Glendale_ApptBooked_Slack_Alert — actual build
UDT_Glendale_ApptBooked_Slack_Alert n8n canvas
The live n8n canvas.
fires on each new bookingOps & alerts
Schematic · module flow — drag & zoom
drag to pan · scroll or +/− to zoom
Webhook
Entry point — receives the trigger
Format Message
Logic / decision
Post to Slack
Posts the booking alert to Slack
Triggered when a booking is createdfires on each new booking

Trigger

Fires when an appointment is booked (the booking event).

Module flow

  1. TriggerPicks up the new booking.
  2. Format messageBuilds the alert: who, when, and which service.
  3. Slack postDrops the alert into the team channel. Slack
Why a visible win matters
When the team sees bookings land in real time, they trust the system and act on them fast. The same visible-artifact principle: proof the automation is working, right where the humans already look.
Platform layer · the CRM

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.

Voice-first, CRM-complete
The conversation happens on the phone (Retell), not over SMS. GoHighLevel is where the lead is created, tagged, and moved through the pipeline, and where the post-call workflow writes the summary, the booking, and the next touch. The CRM is always the visible truth.

The tags that drive everything

Adding a tag in GoHighLevel is what fires an automation.

Tag / eventWhat it triggers
New lead created + taggedSpeed-to-lead: GHL fires the Make_Call webhook into n8n in seconds
bookedState tag: suppresses further dials and the call cadence (GR-001)
ai-activeLead is engaged — don't dial over an active conversation
DNCDo-not-call: stops everything, for compliance

GHL-side workflows & pipeline

In GoHighLevelRole
Speed-to-lead triggerNew tagged lead → fires the n8n Make_Call dialer instantly
Lead pipelineNew Lead → Contacted → Booked — moved by the n8n Post-Call workflow
Reminders & cadenceGHL sends the appointment reminders; n8n drives the 7-day / 7-call follow-up
Custom fieldsBooking fields + call outcome, written back by the n8n engines
Platform layer · the voice agent

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.

AgentRole
UDT_GLENDALE_OUTBOUNDCalls new leads, qualifies, books live on the call
UDT_Glendale_InboundAnswers 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.

FunctionWhat it does
check_calendar_availabilityIs a specific date/time open?
getOpenSlotsReturn real open slots as human ranges (“Morning 9 to 12”)
book_appointmentBook the appointment, convert timezone, tag the win
reschedule (get / update appointment)Find and move the existing appointment
get_appointmentRead back what the caller has booked
update_contactSave 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:

first_namelast_namefull_namephoneemailprospect_timezonecurrent_timelead_source

Prompt structure

The agent prompt follows the engineer playbook, not improvisation. Its backbone:

SectionWhy it's there
Identity + goalWho the agent is and the one job: book the appointment
Existing-appointment confirm modeRe-checks for a booking before offering a time — anti double-booking (GR-001)
Real-slots onlyOffers only times the calendar actually has open — never invents a slot
Recording & complianceDiscloses recording near the top of the call
Voice & styleWarm, human, no “AI tells”
Developer Reference

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

WorkflowJob
UDT_Glendale_Make_CallOutbound dialer — gates + places the AI call
UDT_Glendale_Calendar_BookingsLive booking brain, 5 routes (49 nodes)
UDT_Glendale_Update_ContactMid-call contact-field writer
UDT_Glendale_Post_CallPost-call CRM update + 7-day cadence (59 nodes)
UDT_Glendale_InBound_call24/7 inbound answering + caller lookup
UDT_Glendale_ApptBooked_Slack_AlertBooking → real-time Slack alert

Other locations & on-demand

WorkflowStatus
UDT_Glendale_Reactivation_callstandby 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→ WorkflowDownstream effect
New lead created + tagged in GoHighLevelMake_CallGates the lead, then dials it with the AI
Retell agent (mid-call)Calendar_BookingsCheck / book / reschedule / get appointment
Retell agent (mid-call)Update_ContactSave a fact to the contact live
Retell (outbound call ends)Post_CallDNC gate → outcome path → CRM + next touch
Retell inbound agent (call in)InBound_callHours + new/returning lookup → book
Appointment bookedApptBooked_Slack_AlertReal-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.

ItemValue
GHL location (Glendale)cHM5P4HJGQqk3nYviV4T
Voice number+1 480 405 5948
TimezoneAmerica/Phoenix
Retell outbound agentUDT_GLENDALE_OUTBOUND
Retell inbound agentUDT_Glendale_Inbound
GHL token (PIT)pit-xxxxxxxx-xxxx-…
Retell API keykey_xxxxxxxx…
n8n instanceguerilla-fi.app.n8n.cloud

Who to contact

RoleContact
Automation engineerJJ · jjcavada1@gmail.com
Error alerts go tojjcavada1@gmail.com
n8n instanceguerilla-fi.app.n8n.cloud