Work · Speed-to-lead & nurture · Home-care agency · multi-county footprint, three payer lanes
Regulated-market lead engine
An empty CRM, and one referral channel we cannot legally text
A complete lead-capture-to-review CRM build for a home-care agency that started from an empty account — ten cross-wired workflows, an AI intake agent, and a compliance architecture that makes it structurally impossible to message a referral coordinator.
- GoHighLevel
- Conversation AI
- A2P SMS
- Playwright
- Role · sole designer & builder
- 6 min
- workflows · 131 steps, published live
- 10Scope
- messages possible to a referral coordinator — by structure
- 0Scope
- account systems captured read-only before any write
- 11Scope
- System size
- System flow · 10 stages · 45 components reconstructed from the build record
The situation
The agency serves families across a multi-county footprint, with three payer lanes behind one phone number. Enquiries arrived by call, text and chat, and what happened next depended on who picked up.
The CRM was effectively empty. No calendars, no capture path, and a stock pipeline holding four demo records. Nothing was tracked, so nothing could be improved.
The harder problem was the agency's best referral channel. Its strongest source of families is state-program referral coordinators, and anti-kickback law makes sending anything of value to one a crime. The automation could not merely be careful with those contacts. It had to be structurally incapable of messaging them.
What was broken
- No lead capture existed, so a form submission, a missed call and a text ended in different places or nowhere.
- There was no tag taxonomy, no custom fields, and no recorded reason for any lost lead.
- Missed calls fell on the floor, which is the channel a family in crisis reaches for first.
- The intake form looked correct on the public page while its designed fields sat unread in a second array, so nothing reached a contact record.
Constraints
- Sending anything of value to a referral coordinator is a felony risk, so a policy note was not an acceptable control.
- The account was greenfield. Every calendar, field, tag and stage had to exist before a workflow could reference it.
- The lost-reason picklist did not exist, the internal API rejects a batched array, and the public API has no create endpoint for it.
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
- 45
- components
- stages
- 10
- stages
- decisions & guards
- 11
- decisions & guards
- AI
- 1
- AI
- human handoffs
- 4
- human handoffs
- platforms
- 4
- platforms
- Stage 1, Entry doors: Every way a family — or a referral coordinator — can enter the system.
- Intake form (Capture, GoHighLevel). One intake form object placed twice — on the existing site and on the paid-traffic landing page. Connects to Non-lead source filter when form submitted.
- Missed call (Source, A2P SMS). A missed call on the tracked, registration-approved number. Connects to Non-lead source filter when call missed.
- Inbound text (Source, A2P SMS). An inbound text to the tracked number, filtered to contacts with no open card. Connects to Non-lead source filter when inbound text.
- Website chat (Source, GoHighLevel). A chat conversation started on the site. Connects to Non-lead source filter when chat started.
- Stage 2, Guard & compliance: The structural refusals that run before any action can fire.
- Non-lead source filter (Guard, GoHighLevel). Every native trigger filters out the reserved manual, import and bulk contact sources. Connects to Coordinator tag guard when a real door, not an import; Per-workflow publish gate when absent on all ten triggers.
- Coordinator tag guard (Guard, GoHighLevel). The literal step 1 of nine workflows: if the contact carries the referral-partner tag, end the run. Connects to Intake + speed-to-lead when step 1 passes; Reply handler when step 1 passes; Human takeover when step 1 passes; Booked + reminders when step 1 passes; No-show recovery when step 1 passes; Nurture ladder when step 1 passes; Outcome + onboarding when step 1 passes; Review engine when step 1 passes; Stalled re-nurture when step 1 passes; Inverse guard when coordinator tag → run ends.
- Inverse guard (Guard, GoHighLevel). The tenth workflow’s step 1 — it ends the run unless the contact IS a coordinator. Connects to Partner track when IS a coordinator.
- Stage 3, Speed-to-lead: Source stamping, the opportunity card, one instant reply, one owner alert.
- Intake + speed-to-lead (Workflow, GoHighLevel). The capture workflow: guard, funnel tag, then a five-branch source router with its own tail per branch. Connects to Five-branch source router when after the funnel tag.
- Five-branch source router (Decision, GoHighLevel). Branches on landing page, website, missed call, inbound text and chat; branches never re-merge. Connects to Create-or-update card when one source tag stamped.
- Create-or-update card (CRM record, GoHighLevel). Creates the opportunity in the first stage with allow-duplicate off, assigned to the owner. Connects to Instant first reply; Six-stage pipeline when allow duplicate = off.
- Instant first reply (Message, A2P SMS). One source-aware text, no wait, targeting inside sixty seconds, at any hour, with the retry cap set to zero. Connects to New inquiry alert; AI intake agent when family replies.
- New inquiry alert (Staff alert, GoHighLevel). In-app and email alert to the owner carrying source, who-needs-care and county. Connects to Nurture ladder when terminal step: into nurture; Eleven owner alerts when one of eleven.
- Stage 4, Qualification: The two-way conversation designed to fill the record and reach a booking.
- AI intake agent (AI, Conversation AI). A chat agent configured on text and live chat, speaking as the care team with no persona name, working five objectives in order. Connects to Two agent actions when qualified; Five custom fields when four fields + one payer tag; Absolute refusals when restricted topic.
- Absolute refusals (Guard, Conversation AI). Medical, care-recommendation, eligibility and pricing questions get a holding line and an escalation, never an answer. Connects to Two agent actions when holding line, then escalate; Per-workflow publish gate when attestation + probe test.
- Two agent actions (API / service, Conversation AI). A booking action bound to the consult calendar (reschedule on, cancel off) and a trigger-workflow action pointing at the human-takeover workflow. Connects to Consultation calendar when booking action · slot chosen; Human takeover when escalate action.
- Reply handler (Workflow, GoHighLevel). Moves the card to qualifying once, kills the nurture ladder, fires the engaged alert, and routes takeover keywords. Connects to AI intake agent when drip stopped, conversation live; Six-stage pipeline when first reply → qualifying; Nurture ladder when remove from nurture; Takeover keyword branch when takeover phrase matched; STOP handling when STOP received; Stalled re-nurture when any reply starts a fresh clock.
- Takeover keyword branch (Decision, GoHighLevel). On the takeover phrase, wait two minutes, check whether the agent already handed off, and only then send one holding text and enrol the takeover workflow. Connects to Human takeover when agent has not handed off.
- Human takeover (Workflow, GoHighLevel). Tags AI off and AI escalated, removes the contact from nurture and the stall ladder, raises the owner’s task, fires two internal notifications. Connects to Owner task queue when takeover task; Nurture ladder when remove from nurture; Stalled re-nurture when remove from stall ladder.
- Stage 5, Booking & attendance: The calendar built from zero, anchored reminders, and no-show recovery.
- Consultation calendar (Calendar, GoHighLevel). Built from nothing — 30-minute slots, weekdays, a 15-minute buffer, two hours’ minimum notice, one assignee, outbound phone appointment. Connects to Booked + reminders when appointment confirmed.
- Booked + reminders (Workflow, GoHighLevel). Moves the card to booked, assigns it, removes the contact from nurture, recovery and the stall ladder, confirms immediately, then arms anchored reminders. Connects to Six-stage pipeline when move to booked; Two anchored reminders when anchor in the future; Nurture ladder when remove from nurture; No-show recovery when remove from recovery; Stalled re-nurture when remove from stall ladder.
- Two anchored reminders (Wait, GoHighLevel). A 24-hour and a 1-hour reminder, both anchored to the appointment time rather than relative to the previous step. Connects to Attended or not when appointment time passes.
- Attended or not (Decision, GoHighLevel). The owner calls at the booked time; attendance is a human move, non-attendance is driven by appointment status. Connects to No-show recovery when no-show or cancelled; Outcome + onboarding when attended · owner moves the card.
- No-show recovery (Workflow, GoHighLevel). Two triggers — no-show and cancelled — behind a “recovery already running” guard, then three guarded touches at ten minutes, day one and day three. Connects to Booked + reminders when remove from reminders; Owner task queue when cancel branch; Nurture ladder when recovery exhausted at day 3.
- Stage 6, Nurture & stall: The silent-lead ladder and the stalled-conversation nudges.
- Nurture ladder (Workflow, GoHighLevel). No triggers of its own — enrolled by capture, recovery and the outcome workflow, with touches at day 1, 3, 7, 14, 45, 75 and a day-90 terminal. Connects to Reply handler when family replies mid-ladder; Nurture dedup guard when on enrolment.
- Nurture dedup guard (Guard, GoHighLevel). If an active-nurture tag is already present, end the run. Connects to Closed-lost with reason when day 90, unanswered.
- Stalled re-nurture (Workflow, GoHighLevel). Any reply starts a stall clock; guarded on a never-removed “already nudged” tag, it finds the card, checks the stage, nudges at 48 hours and again three days later, then exhausts into the long-tail ladder. Connects to Owner task queue when two nudges exhausted; Nurture ladder when on exhaustion.
- STOP handling (Guard, GoHighLevel). A stop request sets do-not-disturb natively and hard-blocks every send; one workflow stamps a visible honoured tag and strips the contact out of four ladders. Connects to Stalled re-nurture when strip out of four ladders.
- Stage 7, Outcome & review: Won or undecided, the closed-lost terminal, and the review ask.
- Outcome + onboarding (Workflow, GoHighLevel). One stage-updated trigger with two branches: won onboards, alerts and starts the review clock; undecided waits out a decision window then returns the family to nurture with context. Connects to Review engine when won; Nurture ladder when undecided after the window.
- Review engine (Workflow, GoHighLevel). No triggers — enrolled by the won branch. A once-per-contact guard, a wait anchored to the service start date, one review ask through a trackable link, and one polite reminder if the link goes unclicked.
- Closed-lost with reason (Outcome, GoHighLevel). At day 90 the ladder tags the contact exhausted, moves the card to lost with a native lost reason, and alerts the owner.
- Stage 8, Human tasks & alerts: The notifications and tasks that carry what automation must not.
- Partner track (Workflow, GoHighLevel). The inverse guard, then a monthly relationship task and one internal notification, on a loop. Connects to Owner task queue when monthly relationship task; Eleven owner alerts when one internal notification; Per-workflow publish gate when zero outbound sends, audited.
- Owner task queue (Human, GoHighLevel). The tasks that carry what automation must not: a takeover task, a cancellation task, a stall-exhausted task, and the monthly partner touch.
- Eleven owner alerts (Staff alert, GoHighLevel). Eleven notifications, each a step inside its own triggering workflow rather than a standalone notification workflow.
- Quiet-hours escalation (Human, Builder UI). The evening send window has no create-API expression, so it was escalated as a per-workflow human task instead of being written blind. Connects to Per-workflow publish gate when blocks seven publishes.
- Stage 9, CRM data model: Pipeline, fields, tags, form schema and phone — the objects everything reads.
- Six-stage pipeline (CRM record, GoHighLevel). One sales pipeline, six stages, exactly one owner per transition; three transitions are human-only moves. Connects to Outcome + onboarding when stage updated.
- Five custom fields (Data store, GoHighLevel). Payer type, who-needs-care, county, urgency and service start date, created into an empty namespace with binding picklists. Connects to Review engine when service start date has a value.
- Tag & value registry (Data store, GoHighLevel). A 23-tag namespaced taxonomy plus nine custom values — six filled, three held open behind named fill tokens with an owner and a blocked item each. Connects to Coordinator tag guard when partner tag, written by hand.
- Recovered form schema (API / service, GoHighLevel). The public renderer showed a stock template while the designed fields sat in a second, unread array; the real mapping key was recovered from the form builder’s own bundle and written through the internal path. Connects to Five custom fields when field id is the mapping key; Intake form when live form document.
- Tracked number (CRM record, A2P SMS). One SMS-capable tracked number with carrier registration approved — the dependency under every text in the design. Connects to Missed call when registration approved; Inbound text.
- Stage 10, Capture & verification: Read-only capture, the substitution register, the audit re-check, the publish gate.
- 11-system capture (Report, GoHighLevel). Eleven areas swept read-only before any write — pipelines, opportunities, fields, values, tags, calendars, users, numbers, AI agents, workflows, integrations. Connects to Architecture registry when live state, not assumption.
- Architecture registry (Report, Docs). The single binding document — stages, stage-move map, mechanism policies, tag, field and value registries, notification map, divergence log and token registry. Connects to 14 platform substitutions when where the API cannot express it; Tag & value registry when one binding registry; Six-stage pipeline when stage-move map.
- 14 platform substitutions (Guard, Docs + builder UI). Fourteen recorded places where the create API cannot express a design condition, each with a sanctioned fallback that is live plus the exact UI step to restore full behaviour. Connects to Quiet-hours escalation when no API expression; Per-workflow publish gate when each gap is a pre-publish item.
- Per-workflow publish gate (Guard, Builder UI). Each workflow is its own human publish decision; on the go-live pass nine were held with the reason stated per workflow and one was published.
- Third-party audit re-verified (Report, Live API reads). A second AI’s nineteen-finding audit re-checked line by line against live reads. Connects to Per-workflow publish gate when four missed launch-blockers.
- 90-day marketing plan (Report, Docs). An executive summary, a week-one free audit phase, four audience playbooks, a three-month calendar, budget tiers, a one-number-per-goal KPI sheet, a weekly routine and an appendix of flagged assumptions. Connects to Intake form when planned demand into the doors.
A daughter fills in the intake form on the site at 21:04, looking for care for her father.
0/15A daughter fills in the intake form on the site at 21:04, looking for care for her father.
Read this system as text
Stage 01
Entry doors
Every way a family — or a referral coordinator — can enter the system.
- Intake form · Capture · GoHighLevel — One intake form object placed twice — on the existing site and on the paid-traffic landing page. → Non-lead source filter (form submitted)
- Missed call · Source · A2P SMS — A missed call on the tracked, registration-approved number. → Non-lead source filter (call missed)
- Inbound text · Source · A2P SMS — An inbound text to the tracked number, filtered to contacts with no open card. → Non-lead source filter (inbound text)
- Website chat · Source · GoHighLevel — A chat conversation started on the site. → Non-lead source filter (chat started)
Stage 02
Guard & compliance
The structural refusals that run before any action can fire.
- Non-lead source filter · Guard · GoHighLevel — Every native trigger filters out the reserved manual, import and bulk contact sources. → Coordinator tag guard (a real door, not an import), Per-workflow publish gate (absent on all ten triggers)
- Coordinator tag guard · Guard · GoHighLevel — The literal step 1 of nine workflows: if the contact carries the referral-partner tag, end the run. → Intake + speed-to-lead (step 1 passes), Reply handler (step 1 passes), Human takeover (step 1 passes), Booked + reminders (step 1 passes), No-show recovery (step 1 passes), Nurture ladder (step 1 passes), Outcome + onboarding (step 1 passes), Review engine (step 1 passes), Stalled re-nurture (step 1 passes), Inverse guard (coordinator tag → run ends)
- Inverse guard · Guard · GoHighLevel — The tenth workflow’s step 1 — it ends the run unless the contact IS a coordinator. → Partner track (IS a coordinator)
Stage 03
Speed-to-lead
Source stamping, the opportunity card, one instant reply, one owner alert.
- Intake + speed-to-lead · Workflow · GoHighLevel — The capture workflow: guard, funnel tag, then a five-branch source router with its own tail per branch. → Five-branch source router (after the funnel tag)
- Five-branch source router · Decision · GoHighLevel — Branches on landing page, website, missed call, inbound text and chat; branches never re-merge. → Create-or-update card (one source tag stamped)
- Create-or-update card · CRM record · GoHighLevel — Creates the opportunity in the first stage with allow-duplicate off, assigned to the owner. → Instant first reply, Six-stage pipeline (allow duplicate = off)
- Instant first reply · Message · A2P SMS — One source-aware text, no wait, targeting inside sixty seconds, at any hour, with the retry cap set to zero. → New inquiry alert, AI intake agent (family replies)
- New inquiry alert · Staff alert · GoHighLevel — In-app and email alert to the owner carrying source, who-needs-care and county. → Nurture ladder (terminal step: into nurture), Eleven owner alerts (one of eleven)
Stage 04
Qualification
The two-way conversation designed to fill the record and reach a booking.
- AI intake agent · AI · Conversation AI — A chat agent configured on text and live chat, speaking as the care team with no persona name, working five objectives in order. → Two agent actions (qualified), Five custom fields (four fields + one payer tag), Absolute refusals (restricted topic)
- Absolute refusals · Guard · Conversation AI — Medical, care-recommendation, eligibility and pricing questions get a holding line and an escalation, never an answer. → Two agent actions (holding line, then escalate), Per-workflow publish gate (attestation + probe test)
- Two agent actions · API / service · Conversation AI — A booking action bound to the consult calendar (reschedule on, cancel off) and a trigger-workflow action pointing at the human-takeover workflow. → Consultation calendar (booking action · slot chosen), Human takeover (escalate action)
- Reply handler · Workflow · GoHighLevel — Moves the card to qualifying once, kills the nurture ladder, fires the engaged alert, and routes takeover keywords. → AI intake agent (drip stopped, conversation live), Six-stage pipeline (first reply → qualifying), Nurture ladder (remove from nurture), Takeover keyword branch (takeover phrase matched), STOP handling (STOP received), Stalled re-nurture (any reply starts a fresh clock)
- Takeover keyword branch · Decision · GoHighLevel — On the takeover phrase, wait two minutes, check whether the agent already handed off, and only then send one holding text and enrol the takeover workflow. → Human takeover (agent has not handed off)
- Human takeover · Workflow · GoHighLevel — Tags AI off and AI escalated, removes the contact from nurture and the stall ladder, raises the owner’s task, fires two internal notifications. → Owner task queue (takeover task), Nurture ladder (remove from nurture), Stalled re-nurture (remove from stall ladder)
Stage 05
Booking & attendance
The calendar built from zero, anchored reminders, and no-show recovery.
- Consultation calendar · Calendar · GoHighLevel — Built from nothing — 30-minute slots, weekdays, a 15-minute buffer, two hours’ minimum notice, one assignee, outbound phone appointment. → Booked + reminders (appointment confirmed)
- Booked + reminders · Workflow · GoHighLevel — Moves the card to booked, assigns it, removes the contact from nurture, recovery and the stall ladder, confirms immediately, then arms anchored reminders. → Six-stage pipeline (move to booked), Two anchored reminders (anchor in the future), Nurture ladder (remove from nurture), No-show recovery (remove from recovery), Stalled re-nurture (remove from stall ladder)
- Two anchored reminders · Wait · GoHighLevel — A 24-hour and a 1-hour reminder, both anchored to the appointment time rather than relative to the previous step. → Attended or not (appointment time passes)
- Attended or not · Decision · GoHighLevel — The owner calls at the booked time; attendance is a human move, non-attendance is driven by appointment status. → No-show recovery (no-show or cancelled), Outcome + onboarding (attended · owner moves the card)
- No-show recovery · Workflow · GoHighLevel — Two triggers — no-show and cancelled — behind a “recovery already running” guard, then three guarded touches at ten minutes, day one and day three. → Booked + reminders (remove from reminders), Owner task queue (cancel branch), Nurture ladder (recovery exhausted at day 3)
Stage 06
Nurture & stall
The silent-lead ladder and the stalled-conversation nudges.
- Nurture ladder · Workflow · GoHighLevel — No triggers of its own — enrolled by capture, recovery and the outcome workflow, with touches at day 1, 3, 7, 14, 45, 75 and a day-90 terminal. → Reply handler (family replies mid-ladder), Nurture dedup guard (on enrolment)
- Nurture dedup guard · Guard · GoHighLevel — If an active-nurture tag is already present, end the run. → Closed-lost with reason (day 90, unanswered)
- Stalled re-nurture · Workflow · GoHighLevel — Any reply starts a stall clock; guarded on a never-removed “already nudged” tag, it finds the card, checks the stage, nudges at 48 hours and again three days later, then exhausts into the long-tail ladder. → Owner task queue (two nudges exhausted), Nurture ladder (on exhaustion)
- STOP handling · Guard · GoHighLevel — A stop request sets do-not-disturb natively and hard-blocks every send; one workflow stamps a visible honoured tag and strips the contact out of four ladders. → Stalled re-nurture (strip out of four ladders)
Stage 07
Outcome & review
Won or undecided, the closed-lost terminal, and the review ask.
- Outcome + onboarding · Workflow · GoHighLevel — One stage-updated trigger with two branches: won onboards, alerts and starts the review clock; undecided waits out a decision window then returns the family to nurture with context. → Review engine (won), Nurture ladder (undecided after the window)
- Review engine · Workflow · GoHighLevel — No triggers — enrolled by the won branch. A once-per-contact guard, a wait anchored to the service start date, one review ask through a trackable link, and one polite reminder if the link goes unclicked.
- Closed-lost with reason · Outcome · GoHighLevel — At day 90 the ladder tags the contact exhausted, moves the card to lost with a native lost reason, and alerts the owner.
Stage 08
Human tasks & alerts
The notifications and tasks that carry what automation must not.
- Partner track · Workflow · GoHighLevel — The inverse guard, then a monthly relationship task and one internal notification, on a loop. → Owner task queue (monthly relationship task), Eleven owner alerts (one internal notification), Per-workflow publish gate (zero outbound sends, audited)
- Owner task queue · Human · GoHighLevel — The tasks that carry what automation must not: a takeover task, a cancellation task, a stall-exhausted task, and the monthly partner touch.
- Eleven owner alerts · Staff alert · GoHighLevel — Eleven notifications, each a step inside its own triggering workflow rather than a standalone notification workflow.
- Quiet-hours escalation · Human · Builder UI — The evening send window has no create-API expression, so it was escalated as a per-workflow human task instead of being written blind. → Per-workflow publish gate (blocks seven publishes)
Stage 09
CRM data model
Pipeline, fields, tags, form schema and phone — the objects everything reads.
- Six-stage pipeline · CRM record · GoHighLevel — One sales pipeline, six stages, exactly one owner per transition; three transitions are human-only moves. → Outcome + onboarding (stage updated)
- Five custom fields · Data store · GoHighLevel — Payer type, who-needs-care, county, urgency and service start date, created into an empty namespace with binding picklists. → Review engine (service start date has a value)
- Tag & value registry · Data store · GoHighLevel — A 23-tag namespaced taxonomy plus nine custom values — six filled, three held open behind named fill tokens with an owner and a blocked item each. → Coordinator tag guard (partner tag, written by hand)
- Recovered form schema · API / service · GoHighLevel — The public renderer showed a stock template while the designed fields sat in a second, unread array; the real mapping key was recovered from the form builder’s own bundle and written through the internal path. → Five custom fields (field id is the mapping key), Intake form (live form document)
- Tracked number · CRM record · A2P SMS — One SMS-capable tracked number with carrier registration approved — the dependency under every text in the design. → Missed call (registration approved), Inbound text
Stage 10
Capture & verification
Read-only capture, the substitution register, the audit re-check, the publish gate.
- 11-system capture · Report · GoHighLevel — Eleven areas swept read-only before any write — pipelines, opportunities, fields, values, tags, calendars, users, numbers, AI agents, workflows, integrations. → Architecture registry (live state, not assumption)
- Architecture registry · Report · Docs — The single binding document — stages, stage-move map, mechanism policies, tag, field and value registries, notification map, divergence log and token registry. → 14 platform substitutions (where the API cannot express it), Tag & value registry (one binding registry), Six-stage pipeline (stage-move map)
- 14 platform substitutions · Guard · Docs + builder UI — Fourteen recorded places where the create API cannot express a design condition, each with a sanctioned fallback that is live plus the exact UI step to restore full behaviour. → Quiet-hours escalation (no API expression), Per-workflow publish gate (each gap is a pre-publish item)
- Per-workflow publish gate · Guard · Builder UI — Each workflow is its own human publish decision; on the go-live pass nine were held with the reason stated per workflow and one was published.
- Third-party audit re-verified · Report · Live API reads — A second AI’s nineteen-finding audit re-checked line by line against live reads. → Per-workflow publish gate (four missed launch-blockers)
- 90-day marketing plan · Report · Docs — An executive summary, a week-one free audit phase, four audience playbooks, a three-month calendar, budget tiers, a one-number-per-goal KPI sheet, a weekly routine and an appendix of flagged assumptions. → Intake form (planned demand into the doors)
Platforms · GoHighLevel · Conversation AI · A2P SMS · Playwright
What I built
The whole lead path from capture to review: ten cross-wired workflows over a CRM data model that did not exist beforehand, shaped throughout by the compliance ceiling.
Before writing anything I swept eleven account systems read-only, with zero mutations, recorded in a manifest. That capture proved the stock pipeline held only demo records, so retiring it was a fact rather than a guess. Everything after it hung off one binding architecture registry, so taxonomy disputes are settled by precedence.
Compliance as a property of the graph
The coordinator guard is literally step one of nine workflows. If the contact carries the referral-partner tag, the run ends. Not a skipped send, not a held message. It is over before any action can fire. It sits in two layers on purpose: an enrolment condition can be edited away in the builder by accident, whereas a step that ends the run is visible on the canvas. The partner tag is only ever applied by a human, by hand.
The tenth workflow carries the inverse guard: it ends the run unless the contact is a coordinator. Its entire step census is one monthly relationship task and one internal notification. Zero SMS, zero email, zero calls, audited. The task tells the owner to make that touch personally.
Four doors and one instant reply
One capture workflow owns all four live doors: the intake form, a missed call, an inbound text and website chat. A five-branch source router stamps exactly one source tag, and the branches never re-merge, so attribution is set at entry where it is still recoverable. Cards are created with allow-duplicate off, so a second enquiry updates the open opportunity rather than stacking one.
One source-aware text then goes out with no wait, at any hour, with the retry cap at zero. That text and the booking confirmation are the only two sanctioned exceptions to the evening send window, because both answer something the family just did.
The intake agent, and what it refuses
The AI intake agent is configured on text and live chat, speaking as the care team with no persona name. It works five objectives in order: who needs care, which county, how care would be paid, urgency, then book. Its refusals matter more than its answers. Medical, care, eligibility and pricing questions get a holding line and an escalation, never an answer. None of that is verifiable through any API, so I did not claim it as verified. It became a twelve-item attestation list and a twelve-probe live test held as a go-live gate, and every read still returns the agent's mode as off.
Booking, recovery and the ladders
I built the consultation calendar from nothing: 30-minute slots, weekdays, a 15-minute buffer, two hours' minimum notice. Booking moves the card, removes the contact from three ladders, confirms immediately, then arms two reminders anchored to the appointment time itself. The nurture ladder was built first of the ten, because three workflows enrol into it and three remove from it, and cross-workflow wiring needs a live id. A tenth closes the leak the original nine had: a family who engaged then went quiet was the warmest segment in the pipeline, and nothing re-enrolled them.
Recording what the platform cannot do
Fourteen places where the create API cannot express a design condition are written down, each with a live fallback plus the exact UI step to restore full behaviour.
The evening send window is the one I refused to guess at. I read the engine's own edit dispatcher to confirm its operation set holds nothing for workflow-level settings, then escalated it as a human task instead of writing a value blind. A malformed window would look applied in the JSON while doing nothing, and that failure mode ends with a 3am text to a grieving family.
Edge cases and failure handling
- A referral coordinator texts in: step one reads the tag and ends the run. No tag, no card, no task, no notification, nothing of value.
- A manually created or imported contact, including my own build-session dummy record: a non-lead source filter stops it receiving a speed-to-lead text.
- A lead quiet for ninety days: the ladder tags them exhausted and closes the card as lost, with a recorded reason.
- A same-day booking: reminders are anchored to the appointment, so an anchor in the past is skipped rather than firing "your consultation is tomorrow" seconds later.
- A STOP message: do-not-disturb is set natively, an honoured tag is stamped, and the contact is stripped out of four ladders at once.
How I verified it
Verified means read back, not a 200 response. The recovered intake-form schema was proven with a browser accessibility snapshot of the live page after the write. The seven lost reasons were created one call at a time, each read back and spelled exactly.
The coordinator acceptance criterion, that no workflow anywhere in the account can send anything of value to a coordinator-tagged contact, was audited across all ten and recorded as a pass. The partner workflow's zero-send status was proven by a step-type census, not by reading its intent.
I re-checked a third-party audit of the account line by line against live reads. Four findings were false and two diagnoses backwards. One recommendation would have deleted the field the review engine reads, another would have double-messaged every family, and four launch-blockers it missed turned up by fetching the public pages.
Publishing is a per-workflow human decision. On the go-live pass one workflow was published and nine were held, each with its reason stated: chiefly the absent source filter and the send window nothing could express.
What changed
The agency has a lead engine where it had an empty account. Ten workflows across four live doors, a calendar built from zero with a passing free-slot check, a 23-tag namespaced taxonomy, five custom fields and seven lost reasons.
The compliance claim is worth stating plainly. Messaging a referral coordinator is structurally impossible rather than discouraged, because the refusal is step one of nine workflows. The only workflow permitted to touch those contacts can create a task and send a notification, and nothing else. The client owns the paperwork too: the capture manifest, the architecture registry, the substitution register, and the audit re-verification with its work list.
Before / after
- Before
- ✕ Zero calendars, zero capture path, a stock demo pipeline
- ✕ The one proven referral channel legally untouchable by automation
- ✕ No tag taxonomy, no custom fields, no lost reasons
- ✕ A third-party audit with false findings about to be actioned
- After
- ✓ Ten live workflows, 131 steps, four entry doors covered
- ✓ Messaging a coordinator is structurally impossible, audited
- ✓ A 23-tag namespaced taxonomy and full field architecture
- ✓ The audit re-verified: four findings killed, four real gaps revealed
ScopeFigures on this page describe what was built, covered or verified — not a measured lift.
Related systems
Not a one-off.
Marketing agency · nine clinic builds
White-label agency delivery
The same repeatable acquisition build, in a market with legal constraints.
9client builds in 5.5 weeksScope
Aesthetics clinic · via agency
Live launch & fault triage
Both rebuild speed-to-lead and staff alerting from a broken baseline.
5silent faults fixed in a "finished" buildScope
Local martial-arts academy
AI Booking Concierge
The same intake-and-book agent pattern.
0leads left waitingScope
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.