Freight brokerage

Reliable voice agents look more like code than conversations.

A carrier check-call and a rate negotiation share most of their skeleton
— verify the carrier, pull the load, log to the TMS
— but the middle is completely different. One captures status. The other negotiates a number.

Below: the thesis, the primitives, and how the same agent fabric handles both.

5 min read · concrete example included
The thesis

A reliable voice agent is composed, not prompted.

ElevenLabs, Vapi, Bland start from one capable agent you steer with a prompt, then add workflows and tools on top. We start from the other end — a library of small, specialized sub-agents that compose into the call.

An orchestrator picks the right ones for each role. Cross-cutting listeners run across the whole call to score things like communication skill.

Workflow
orchestrator picks
sub-agent
load_contextpre-call
Runs before the agent speaks — matches the carrier and reads the load from the TMS. By the time the line connects, the agent knows the lane, the equipment, and the last note on file.
Build
/pre-calllookup_carrier
source=tms.carriers.match(phone_number)
fields=mc_number, carrier_name, authority_status, last_loads[]
/pre-calllookup_load
source=tms.loads.active(carrier_id)
fields=load_id, origin, destination, equipment_type, pickup_time, last_note
Transcript
Pre-call · no spoken turns
Runs before the agent's first word. Matches the carrier by phone number and reads the load — lane, equipment, and the last note on file.
By the time the line connects, the agent already knows the lane, the equipment, and the last note on file. The rate ceiling never reaches the carrier.
A monolithic agent can't do this — it can't run anything before its first speech turn. The rate ceiling never reaches the carrier.
Plus a global listener for communication skill, scoring across the entire call.
The primitives

Nine primitives. Compose them. Ship reliable agents.

Voice agents in Feliciti are built like Notion documents — slash commands compose into blocks, blocks compose into sub-agents, sub-agents compose into the full call flow.

Nine primitives are all you need — one runs before the call connects, the rest run during.

  • /pre-call

    Read state before speaking.

    Match the customer, fetch their record, load context — all before the first hello.

  • /speak

    Speak a turn.

    One bounded utterance. Variables interpolate, tone is set per sub-agent.

  • /collect

    Ask and capture an answer.

    A scripted question that records a typed value back into the call state.

  • /conditional_collect

    Branch on a prior value.

    Asks only if a condition holds. The branch is explicit, not a prompt heuristic.

  • /set

    Write to a system of record.

    Commit a value to the DMS, ATS, or TMS. Triggers fire on side-effects.

  • /end

    Close the call.

    Wrap up cleanly with a final line and end the session.

  • /transfer

    Hand off to a human.

    Warm-transfer to the right queue or advisor when escalation is needed.

  • /prompt

    Free-form generation.

    When a step needs a small LLM call — kept narrow, kept testable.

  • /condition

    Route between sub-agents.

    The orchestrator's decision point — composition, not a chain of prompts.

composition

Stack the primitives into a sub-agent.

A sub-agent is a named, reusable unit — a linear sequence of these primitives. Tested in isolation against its own scenarios. Composed with other sub-agents to form the full call flow.

Compared to

What composition gives you that general-purpose platforms don't.

ElevenLabs, Vapi, and Bland are excellent general-purpose voice platforms — they have workflows, branching, and tool-calling. The difference is what you assemble yourself versus what comes built for the work.

General-purpose voice platforms

ElevenLabs, Vapi, Bland

  • Workflows layer on top of a base agent. Composition is a feature you configure, not the unit you build from.
  • Integrations are yours to wire and maintain — the TMS connection, the auth, the retries.
  • Test coverage is on you. There's no per-step test suite that comes with the agent.
Composable sub-agents

Feliciti

  • The sub-agent is the unit. You compose from small, named, reusable pieces — edits are local, downstream effects explicit.
  • In-house iPaaS: the TMS, CRM, and telephony integrations are built and maintained for you, not left as an exercise.
  • One-click test-suite generation. Verify the carrier? It writes that suite. Negotiate a rate? That one too.
Send us your use case

Want this for your calls?

Tell us the call you want to automate — recruiting or otherwise. We'll send back a working prototype within 48 hours, wired to your actual use case. Same composition pattern you just read about.

A founder reads every one. No sales calls unless you ask.