Logistics & freight
Teaching a voice agent to negotiate a truck booking, not just take one
An outbound agent that calls transporters directly, holds a rate band instead of reading a script, and hands off to a human the moment a call needs one — built for a market that runs on phone calls, not portals.
- Time to a confirmed booking
- the better part of an hour → single-digit minutes
- Loads placed without a dispatcher call
- zero → a clear majority
- Double-booked slots
- occasional → zero, by design
- Sector
- Logistics & freight brokerage
- Volume
- ~1,800 negotiation calls/week, 4 states
- Engagement
- Proof of value, then delivery pod
- Duration
- 7 months to production
Stack
- Twilio Voice
- Deepgram streaming ASR
- Regional-language TTS
- Claude
- GPT-4 class models
- Redis
- FastAPI
- PostgreSQL
- Kafka
Practices involved
Discuss a similar problemThe situation
Confirming a load meant a dispatcher working down a list of transporters by phone, negotiating rate and pickup slot one call at a time, in whatever language the transporter answered in. Most of the fleet the brokerage relied on was small owner-operators reachable only by phone — no app, no portal, no interest in one. The fastest dispatchers were fast because they had the list memorised, and the business could not hire its way to more of them.
The constraint
This was not a transcription problem, it was a transactional one. The agent would be authorising real cargo capacity on a real call, in Hindi and regional languages with heavy code-switching and highway background noise, and it had to sound like it was actually negotiating — making a concession, holding a line — rather than reading a script with variables filled in. At the same time it could never agree a rate outside the band the business had approved, and because a load can only go to one truck, calling several transporters at once for the same slot meant something had to resolve the race the instant anyone said yes.
What we built
A negotiation policy, not a script
The rate band, the concession steps and the acceptable slot windows are configuration, not prompt text. The model generates the actual words — it can vary tone, respond to a counter-offer, ask a clarifying question — but every offer it is allowed to make is checked against the policy before it leaves the model, so the business risk sits in a rule the ops team can read, not in phrasing.
Voice built for the actual callers
Streaming transcription tuned for phone audio and highway noise, language identification per turn, and barge-in handling, because a real negotiation involves people talking over each other and a system that cannot be interrupted reads as a script within one sentence.
Concurrent calling with one source of truth for capacity
For a time-sensitive load, several transporters are called in parallel. The instant one accepts, the load is locked atomically against the dispatch system, and every other in-progress call is closed out with a short, honest message rather than left hanging or, worse, allowed to also say yes.
A human handoff that is a first-class path
Any call that moves outside the approved band, turns into a complaint, or asks for something the agent is not authorised to promise transfers live to a dispatcher, with the transcript and the negotiation state already on their screen. The transporter does not repeat themselves, and the handoff rate is a monitored number, not an afterthought.
Every call graded like the extraction pipeline it is
A graded set of real negotiation calls, built with the dispatch team, scores outcome against a human-dispatcher baseline. Recorded calls near the decision boundary go into a review queue, and corrections feed back into the graded set — the same discipline as the evaluation harness we build for any production LLM feature.
What changed
Time to a confirmed booking fell from the better part of an hour to single-digit minutes, and a clear majority of loads now place without a dispatcher touching the phone at all. Dispatchers moved from routine outbound calling to the calls the agent hands them — which are, by construction, the ones that need a person.
What we would do differently
We initially fanned out to every transporter within radius simultaneously, to minimise time-to-fill. Transporters who got called and then heard the load was already placed twice in a week started declining to pick up at all. We added a tiered calling policy — best-fit transporters first, wider fan-out only if the top tier does not confirm within a window — in month three. It should have been the starting design, not a patch; the relationship with the transporter network is as much the product as the booking speed is.
Outcomes
- Time to a confirmed booking
- the better part of an hour → single-digit minutes
- Loads placed without a dispatcher call
- zero → a clear majority
- Double-booked slots
- occasional → zero, by design
Client identity withheld under a mutual NDA. Figures are illustrative — rounded and directional, meant to show the shape of the change rather than an audited result. We will walk through the real numbers, and how they were measured, under NDA on a call.
More work
Other engagements.
Case studiesCutting stockouts across 240 stores with a forecast the buyers trust
A hierarchical demand forecast, a promo-aware feature store and a replenishment workflow the category team can override — because a model nobody overrides is a model nobody uses.
Read the case studyShipping firmware to 6,000 imaging consoles without a truck roll
A signed, resumable, rollback-safe update channel for regulated ultrasound hardware sitting on hospital networks that block almost everything.
Read the case studyA reproducible pipeline for a diagnostics lab that had outgrown its scripts
Genomic and assay data moving from instruments to reportable results, with provenance for every derived value and a turnaround clock the lab director can see.
Read the case studyNext step
Tell us what you're trying to ship.
Send the brief, the RFP, or three messy sentences about the problem. You get a written point of view from an architect within two working days — not a sales deck.