AI Voice, SMS, and Worker Dispatch System for Service Businesses

By Amar Kumar

This brief proposes an AI voice and SMS dispatch system for a one-person field-service operation moving to a remote model: local sub-contractors perform on-site work while the owner manages bookings from another time zone. The architecture would combine Vapi.ai for inbound voice, Twilio for SMS, Make.com as the orchestration layer, OpenAI for unstructured text interpretation, and a job-management CRM such as ServiceM8 or Tradify — automating the path from first phone call through property-access negotiation to sub-contractor confirmation.

Proposed outcome: A hands-free dispatch pipeline where callers receive a booking link mid-call, paid web forms create provisional job cards, Make.com texts real-estate agents for access, and sub-contractors accept jobs via Y/N SMS — with WhatsApp escalation only when automation cannot resolve the thread.

Scenario

This is a proposed solution for a recurring pattern: a solo operator in the trades or inspection space who must scale without being on the phone all day.

Problem

When the owner moves time zones, the manual loop — answer phone, text agent, call subbie, update CRM — becomes a single point of failure. Missed calls mean lost revenue; delayed access texts stall the whole day.

Requirements

Functional

Non-functional

Architecture

Three Make.com scenarios (voice-adjacent webhook, booking intake, SMS conversation hub) sit between customer touchpoints and the CRM. Vapi owns real-time voice; Twilio owns SMS transport; OpenAI modules classify agent and subbie replies.

flowchart TB classDef voice fill:#ede9fe,stroke:#7c3aed,color:#5b21b6 classDef orch fill:#dbeafe,stroke:#2563eb,color:#1e3a8a classDef sms fill:#ccfbf1,stroke:#0d9488,color:#115e59 classDef crm fill:#f1f5f9,stroke:#64748b,color:#334155 classDef human fill:#fef3c7,stroke:#d97706,color:#92400e CALL["Inbound caller\nTwilio PSTN"]:::voice VAPI["Vapi voice assistant\ncustom script + tools"]:::voice CALL --> VAPI VAPI -->|"send_sms tool"| TWOUT["Twilio outbound SMS\nbooking link"]:::sms FORM["Website form + payment\nStripe / WP webhook"]:::orch MK1["Make: Booking intake\naddress clean + CRM create"]:::orch FORM --> MK1 MK1 --> CRM["ServiceM8 / Tradify\nprovisional job card"]:::crm MK1 --> MK2 MK2["Make: Access + dispatch hub\nrouters + delays"]:::orch MK2 -->|"3A: access ask"| AGENT["Real-estate agent SMS"]:::sms AGENT -->|"inbound reply"| MK2 MK2 --> GPT["OpenAI structured parse\nintent + lockbox + time"]:::orch GPT --> MK2 MK2 -->|"3C: dispatch offer"| SUB["Sub-contractor SMS\nY / N loop"]:::sms SUB --> MK2 MK2 --> CRM MK2 -->|"unclear / all decline"| WA["Owner WhatsApp alert"]:::human

System architecture — Vapi handles voice and mid-call SMS; Make.com orchestrates booking intake, agent negotiation, and sub-contractor dispatch with CRM as system of record

sequenceDiagram autonumber participant Agent as Real-estate agent participant Twilio as Twilio SMS participant Make as Make.com hub participant GPT as OpenAI GPT-4o participant CRM as ServiceM8 participant Sub as Sub-contractor participant Owner as Owner WhatsApp Make->>Twilio: access request SMS Twilio->>Agent: deliver Agent->>Twilio: reply text Twilio->>Make: inbound webhook Make->>GPT: parse reply JSON schema GPT->>Make: intent + fields alt confirmed or lockbox Make->>CRM: access_confirmed + code Make->>Twilio: dispatch offer to subbie Twilio->>Sub: job details + Y/N Sub->>Twilio: Y Make->>CRM: dispatched + assign subbie else alternate time Make->>CRM: reschedule slot Make->>Twilio: confirm new time to agent else unclear or NO Make->>Owner: high-priority WhatsApp Make->>CRM: escalated end

Agent reply sequence — OpenAI classifies unstructured SMS; confirmed access triggers sub-contractor loop; ambiguous threads escalate to owner

Component map by integration layer (major services per tier)

End-to-end flow

Happy-path pipeline — escalation branches (agent confusion, subbie decline) route to owner without blocking other jobs

Automation coverage by workflow stage (% of steps handled without owner intervention on happy path)

Indicative job distribution across CRM states during steady-state operations

Recommendation: Keep the client’s stated stack — Make.com for routers and delays, Vapi.ai for voice, Twilio for SMS, OpenAI GPT-4o inside Make for JSON extraction — paired with ServiceM8 (strong AU tradie adoption) or Tradify if already licensed. A Google Sheet or Airtable sms_threads table would act as a lightweight conversation index when the CRM API lacks native SMS logging.

LayerTechnologyWhy
Voice AIVapi.ai + Twilio numberNative function-calling for mid-call SMS; lower latency than bolting STT/LLM/TTS yourself
SMS transportTwilio MessagingSeparate inbound webhooks per number; delivery receipts for Make error branches
OrchestrationMake.com (3 scenarios)Visual routers, sleep modules for 30-min subbie timeout, OpenAI module with JSON schema output
LLM parsingOpenAI GPT-4o via MakeStructured outputs for agent intent; temperature 0 for classification tasks
Job CRMServiceM8 API (or Tradify)Native job statuses, staff assignment, AU address fields; webhook on job create optional
Booking formExisting site form + StripeWebhook to Make on successful payment — avoids building custom checkout
Subbie rosterGoogle Sheet or AirtablePostcode → primary/backup mapping editable without redeploying scenarios
Owner alertsWhatsApp Business Cloud API or Twilio WhatsAppHigh-priority template messages when automation stops
Audit logGoogle Sheet dispatch_logEvery SMS in/out with job_id, timestamp, parsed intent — cheap ops visibility

Why Make.com over custom code? The owner needs maintainable scenarios they can inspect; Make’s router modules map directly to the YES / alternate / NO branches. Custom Node would be cheaper at scale but harder to hand over.

Why Vapi over Twilio Studio + OpenAI? Studio struggles with natural multi-turn dialog and tool calls during live audio. Vapi’s send_sms server tool fires while the caller is still on the line — the exact UX the workflow demands.

ServiceM8 vs Tradify vs Sheets? ServiceM8’s REST API and job-status model fit provisional → scheduled → dispatched. Sheets work for MVP roster lookup but should not be the long-term job system of record.

Agent & component design

1 — Vapi inbound voice assistant

2 — Make scenario: booking-intake

3 — Make scenario: access-dispatch (router hub)

BranchTriggerActions
3A — Outbound accessNew job eventLookup agent mobile from job custom field → Twilio SMS template → set CRM access_pending
3B — Agent inboundTwilio inbound SMS webhookMatch thread_id by agent number + open job → GPT parse → router
3B — YES / lockboxintent=confirmedStore code in CRM note → branch 3C
3B — Alternate timeintent=rescheduleUpdate job schedule → confirmation SMS to agent
3B — Escalateintent=unclear|declinedCRM escalated → WhatsApp owner with thread link
3C — Subbie offerAccess confirmedSheet lookup by postcode → SMS primary → sleep 30 min → router on reply
3C — AcceptReply matches YAssign staff in CRM → status dispatched → confirmation SMS
3C — Decline / timeoutN or no replyTry backup subbie; if exhausted → WhatsApp owner

4 — OpenAI reply classifier (shared module)

5 — Sub-contractor roster service

Typical dispatch lifecycle — median vs p95 duration by stage (illustrative, happy path)

Implementation plan

Phase 1 — Discovery & account wiring (week 1)

Confirm CRM choice (ServiceM8 vs Tradify), export API credentials, inventory website form webhook shape, and document subbie postcode roster. Provision Twilio AU number, Vapi assistant shell, Make organization, and staging contacts for mock agent/subbie. Define job status enum aligned to CRM native values.

Risk: CRM API limits on trial tier — upgrade before integration tests. Rollback: manual job creation remains available; automations disabled via Make scenario toggle.

Phase 2 — Workflow 1: Vapi voice + mid-call SMS (week 2)

Import Twilio number to Vapi; load owner script; configure send_booking_link server tool hitting Twilio Messages API. Record 5 test calls; tune interruption sensitivity and SMS timing. Optional: post-call webhook to dispatch_log.

Risk: Caller ID ≠ mobile (landline) — script branch asks for mobile to text. Rollback: forward number to owner mobile while Vapi is adjusted.

Phase 3 — Workflow 2: Form → provisional job (week 2–3)

Build booking-intake scenario: payment webhook, idempotency key store, OpenAI address module, ServiceM8 job create. Validate 20 historical addresses. Connect form staging URL for UAT.

Risk: Malformed webhook payloads from form plugin — add Make Data Store schema validation. Rollback: email notification to owner with raw payload for manual entry.

Phase 4 — Workflow 3A–3B: Agent SMS loop (week 3–4)

Outbound access template; inbound Twilio webhook to access-dispatch; GPT classifier with JSON schema; routers for confirm / reschedule / escalate. Thread matching via job custom field storing agent mobile. Live test with mock agent phone.

Risk: Agent replies to wrong thread if they manage multiple listings — include address in every outbound SMS. Rollback: pause outbound; owner texts agents manually from CRM.

Phase 5 — Workflow 3C: Sub-contractor dispatch (week 4–5)

Postcode roster sheet; primary/backup SMS offer; 30-minute sleep + timeout router; CRM staff assignment on accept. WhatsApp alert template for all-decline. End-to-end rehearsal: call → form → agent YES → subbie Y.

Risk: Subbie replies “Yes” vs “Y” — normalize with GPT or regex OR-list. Rollback: disable auto-dispatch; owner assigns staff in CRM.

Phase 6 — Hardening, docs & handover (week 5–6)

Error-handler sub-scenarios on every Twilio/OpenAI/CRM module; runbook for scenario toggles; Loom walkthrough of mock E2E test; credential rotation notes. Monitor first two weeks of prod with daily execution review.

Risk: Make operation quota during burst bookings — upgrade plan or add queue delay. Rollback: scenario snapshots exported to JSON; one-click restore.

Reporting & ops

SignalSourceCadence
Vapi call volume + SMS tool successVapi dashboard + Twilio delivery logsDaily email digest first 14 days
Make scenario failuresMake execution history + error handler routeImmediate WhatsApp on CRM write failure
Agent response timedispatch_log timestampsWeekly — alert if median > 4 h
Subbie accept rateCRM dispatched vs offers sentWeekly per postcode region
Escalation rateJobs in escalated statusWeekly — tune GPT prompts if > 15%
OpenAI parse confidenceLogged confidence fieldMonthly review of low-confidence samples
Booking funnelCalls → SMS sent → form paid → dispatchedMonthly conversion chart in Sheet

Ops cadence would include a 15-minute daily check (failed Make runs, escalated jobs) while the owner is in a distant time zone, then a weekly 30-minute tuning session for Vapi script and SMS templates. Twilio balance and Make operation usage alerts prevent silent outages.

Proposed deliverables

Following the phased plan, a build would ship these artifacts:

Effort estimate

Indicative effort for the three workflows through E2E test and handover (assumes CRM API access, existing website form, and owner available for UAT calls):

ScopeHours (range)
Phases 1–6 (Vapi + 3 Make workflows + E2E test)70–110 hrs
CRM migration (if starting from Sheets only)+12–20 hrs
Ongoing tuning (scripts, postcode roster, GPT fixtures)2–4 hrs/month
Platform costs (indicative monthly)Make Pro, Vapi usage, Twilio SMS, OpenAI — typically AUD 150–350 at low volume

The hour range reflects ServiceM8 vs Tradify API familiarity, whether the website form already emits clean webhooks, and how many edge cases appear in real agent SMS threads during UAT. A fixed-price engagement would scope exactly three workflows with one CRM integration and two subbie tiers per postcode.

Glossary

TermMeaning
VapiVoice AI platform that connects telephony to LLM assistants with server-side tool calling
Make.com scenarioVisual automation workflow — equivalent to a Zap with routers, filters, and sleep modules
Provisional jobCRM job card created on payment but not yet confirmed for dispatch — access and subbie steps still pending
Router moduleMake.com branching node that sends execution down exactly one path based on filters
Structured outputLLM response constrained to a JSON schema — used here for agent intent classification
Thread IDCorrelation key linking inbound SMS to an open job — typically agent mobile + job UUID
Idempotency keyUnique payment or webhook ID preventing duplicate job creation on retry
ServiceM8Australian field-service job management platform with REST API for jobs, staff, and scheduling
Sleep moduleMake.com delay step — used for 30-minute sub-contractor response timeout