Comparison of Vapi, Retell, Bland, ElevenLabs Agents, Telnyx, LiveKit Agents and Pipecat — by what they let you control, not by feature lists. The short version: for a receptionist that takes phone numbers, most of them are structurally incapable of the one thing that matters most.
The Hard Gate: Custom VAD / Turn Detection
NO managed platform lets you upload or host your own VAD or turn-detection model
Not Vapi. Not Retell. Not Bland. Not ElevenLabs. Not Telnyx.
Only LiveKit Agents, Pipecat, or your own pipeline qualify.
Since turn detection is where the perceived-latency battle is fought (voice-agent-latency-budget-2026-07-21), and since even Sierra replaced their S2S model’s built-in turn detection with a custom-tuned VAD, this alone eliminates the managed tier for a serious build.
The onNumberSeconds Gap
Separate endpointing hold time for digit strings exists on only TWO platforms
onNumberSeconds— a distinct, longer silence threshold applied when the caller is speaking a digit string — exists only on Vapi and Telnyx.Retell, Bland and ElevenLabs cannot do it.
For a receptionist this is the single highest-value knob on the board. Callers pause naturally mid-number:
“It’s oh-seven-nine … [pause] … four-double-two …”
Without a digit-aware hold time, the agent commits the turn during that pause and cuts the caller off mid-number. Then it either acts on a truncated phone number or asks them to repeat it, both of which are exactly the interaction failures that make an AI receptionist feel unusable.
This is not a nice-to-have. It’s the difference between “can take a phone number” and “cannot take a phone number.”
Owning the pipeline makes this trivially solvable
With Deepgram Flux,
eot_thresholdandeot_timeout_mscan be swapped per conversational state — raise the hold time the moment the agent asks for a number, drop it back afterwards. Managed platforms expose one global setting (or a single opaque dial); a custom pipeline exposes it per turn.
Control Surface, Platform by Platform
| Platform | Turn-taking surface | Verdict |
|---|---|---|
| Vapi | onNumberSeconds + waitFunction — a user-supplied math expression mapping end-of-utterance probability → wait ms, default "200 + 8000 * x". The most powerful knob on any managed platform. | Best managed surface; still no custom VAD |
| Telnyx | onNumberSeconds | Has the key knob |
| Retell | Opaque 0–1 dials only: responsiveness, interruption_sensitivity. No millisecond visibility. | See below |
| Bland | The entire turn-taking surface is three fields | Structurally inadequate |
| ElevenLabs Agents | A 3-value enum plus a timeout | Structurally inadequate |
| LiveKit Agents | Full — custom VAD supported | Qualifies, but see bugs below |
| Pipecat | Full — custom VAD supported | Qualifies, but see cold start below |
Vapi's
waitFunctionis genuinely good design
"200 + 8000 * x"wherexis end-of-utterance probability: at high confidence you commit in 200ms; at low confidence you wait up to 8.2s. That’s the right shape for the problem and it’s user-editable. If a managed platform were viable at all, Vapi’s turn-taking surface would be the reason.
Retell's opaque dials explain its most-cited criticism
Exposing
responsivenessas a 0–1 float with no millisecond visibility means you cannot reason about, measure, or debug your own latency. That is the same root cause as Retell’s most-cited criticism: weak observability. You can’t observe what the API refuses to name in real units.
Reliability Findings
Vapi — platform instability
~19+ hours of call-affecting degradation in a 10-week window
Per Vapi’s own status page, including a 4h07m critical outage from database connection exhaustion (2026-05-21).
They ship a weekly release channel — which mechanically explains the recurring community complaint that “working agents break when the platform updates.” You are on their release train whether or not you changed anything.
For a multi-tenant receptionist where downtime means every tenant’s phone goes unanswered, ~19 hours per 10 weeks is not an acceptable baseline.
LiveKit Agents — interruption bugs
The GitHub issue tracker is almost entirely interruption bugs
Two that matter:
- #3702 — tool-call results lost on interruption → duplicate order creation in production. A correctness bug with real-world side effects, triggered by the most common event in a phone call.
- #3685 — “Latency doubles in telephony contexts.” Telephony is a second-class path.
LiveKit passes the custom-VAD gate but the interruption handling is where a receptionist lives.
Pipecat — cold start and a fixed 1s tax
Two structural latency costs
- 3–8s cold start from sequential service initialization. On inbound calls, the caller is already on the line during this.
aggregation_timeout=1.0adds an unavoidable 1 second delay to every response. Not p95 — every response.The 1s aggregation timeout is a large fraction of the entire latency budget, spent by default, on every turn.
This is also where the 480ms orchestration residual was measured — Pipecat + Twilio. The framework that produced the residual also carries a 1s fixed tax and a multi-second cold start.
Cost
Per-minute pricing for the managed tier, against a $0.0326/min DIY baseline — full breakdown in voice-agent-cost-model-2026-07-21.
| Platform | $/min | vs DIY |
|---|---|---|
| DIY (this build) | $0.0326 | — |
| Pipecat Cloud | ~$0.040 – 0.058 | +23% to +78% |
| LiveKit Cloud | ~$0.045 | +38% |
| Retell | $0.073 – 0.088 | +124% to +170% |
| Vapi | $0.085 | +161% |
| ElevenLabs Agents | $0.10 – 0.13 | +207% to +299% |
| Bland | $0.11 – 0.14 | +237% to +329% |
Verdict
The managed tier fails on capability before it fails on price
Even at equal cost, no managed platform can host a custom VAD, and three of five cannot handle a caller reading out a phone number. The +161% Vapi premium buys less control, not more.
Build the pipeline. Of the frameworks that pass the custom-VAD gate, LiveKit and Pipecat both carry structural telephony problems (interruption correctness bugs; 1s fixed aggregation delay + 3–8s cold start) — which pushes toward a own Rust runtime.
Sources
- Vapi docs —
onNumberSeconds,waitFunctiondefault"200 + 8000 * x"[vendor] - Vapi status page — outage history incl. 2026-05-21 4h07m DB connection exhaustion [vendor, self-reported]
- Retell API docs —
responsiveness,interruption_sensitivity[vendor] - Bland, ElevenLabs Agents, Telnyx agent docs — turn-taking config surfaces [vendor]
- LiveKit Agents GitHub issues #3702, #3685 [public issue tracker]
- Pipecat docs —
aggregation_timeoutdefault, service initialization [vendor] - Platform pricing pages [vendor]