System online · Lahore
Case · 02 / 05
Anonymized
Field ops · Dispatch · Tier A · 10 weeks

Autonomous dispatch agent for a North American service network.

Routing, scheduling, and customer-communication agents wired into the existing CRM. The network scaled to 24/7 coverage without adding headcount.

Headline outcome 24/7 coverage with zero new hires
EngagementTier A · 10 weeks
Team1 founder + 1 contractor
StackFastAPI, OpenAI, Postgres
StatusShipped · in production
01The problem

A small dispatch team couldn't keep up with after-hours volume.

The client operates a service network across multiple US regions — technicians in the field, a central dispatch desk, and customers calling for service requests. Most of the volume hit between 9am and 6pm local time, but a stubborn 30 — 40% of it landed outside business hours. After-hours requests either waited until morning or pushed dispatchers into expensive on-call rotations.

The team had explored hiring a second-shift dispatch crew, but the math didn't work — the after-hours volume was significant in aggregate but uneven enough that any individual shift sat idle most of the time. They needed a system that could handle the predictable parts of dispatch — intake, basic triage, technician matching, scheduling, customer confirmation — and escalate only the complex cases to a human.

The CRM was already custom and integrated with their technician app and billing system. The new system had to fit inside that existing graph, not replace it.

02What we built

Three agents, one orchestrator, all wired through the existing CRM.

Fig. 02.B · Dispatch flow Production
CALL · ROUTE · SCHEDULE · CONFIRM Phone SMS Web form Triage + severity score Routing agent tech selection Schedule agent time-window fit Comms agent SMS + voice CRM existing system Human if uncertain

The triage agent fronts the system. It pulls signal from the inbound channel, assigns a severity score, classifies the service category, and decides whether to route the case to the agents or escalate immediately to a human dispatcher. Anything urgent or anomalous — a safety issue, a customer at risk of churn, a request the model isn't confident about — goes straight to a person.

Three specialist agents handle the routine cases. The routing agent picks the right technician from a pool of dozens based on skills, current location, certifications, and historical fit. The schedule agent finds a time window that works for both the customer and the tech, accounting for travel time and existing appointments. The comms agent handles the customer-facing thread — SMS confirmations, voice calls for older customers who prefer them, follow-ups when a tech is running late.

Everything writes back to the existing CRM as the source of truth. The agents read and write through a thin service layer — they never touch the CRM database directly, which kept the integration tight and made rollback trivial during the first weeks.

03How we built it

Four phases. Ten weeks.

01 · Map

Two-day discovery

Shadowed the dispatch desk for a day, mapped every decision point, and identified the cases the agents could safely take versus the ones that always needed a human.

Days 1 — 2
02 · Build

Spine + CRM bridge

Built the triage skeleton and the read/write service layer to the CRM first. Verified writes were idempotent and reversible before any agent code touched real data.

Weeks 1 — 4
03 · Wire

Agents land one at a time

Routing first, then scheduling, then comms. Each shadowed real dispatch decisions for a week before being trusted with live writes. Eval rubric scored each agent's pick against what the human dispatcher chose.

Weeks 4 — 8
04 · Ship

After-hours first, then full

Went live for after-hours requests only for two weeks before extending to daytime fallback. Loom walkthrough, runbook, 30-day support tail. Dispatch desk supervises with override authority.

Weeks 9 — 10
04Stack & tradeoffs

Why these tools.

FastAPI for the service layer between agents and CRM. The team's existing stack was Python; staying in-language meant their engineers could review and extend the code without context-switching. OpenAI for the agent calls — at the time of build, function-calling reliability on dispatch-style structured outputs was the strongest among options we benchmarked.

Postgres for the agent state store, sitting alongside the CRM's existing Postgres. No new database technology introduced. The schedule-agent's time-window logic ran as deterministic SQL with the LLM only used to summarize and explain — a deliberate choice to keep the highest-stakes decisions out of model reasoning.

Considered and rejected: a no-code dispatch platform (couldn't express the CRM-specific routing logic), a single big agent with all three responsibilities (failed safety review on the comms-agent voice tone in week 2 testing), and routing entirely through model context (degraded over long conversations, lost track of half-scheduled appointments).

05Outcomes

What changed after deploy.

After-hours requests handled autonomously ~70% routed end-to-end
Escalation rate (to human) ~30% caught early on triage
Customer wait at intake Min → sec SMS confirmation

Illustrative ranges. Specific client metrics are confirmed under NDA. Numbers shown reflect reported outcomes at handover.

More work

Other systems we've shipped.

Want one of these for your team?

30-min scope call. By the end you'll know what we'd build, in what order, what it costs.