Your agent worked beautifully in the demo. Then the client's Monday-morning rush hit — 40 calls in an hour, a dozen at once — and half of them heard dead air, got a "please hold" that never ended, or dropped into voicemail. You didn't build a bad agent. You built one nobody load-tested. Here's how to find the ceiling before your client does.
What actually breaks under load
A single call feeling snappy tells you nothing about what happens at 20 concurrent. The things that fall over, roughly in order:
- Concurrency caps. Every platform has one. Vapi, Bland, Retell, and Synthflow all limit simultaneous calls per account, and the default is often lower than you think (single digits to low double digits unless you've raised it). Call 21 when your cap is 20 and caller 21 gets nothing — no error the client sees, just a phone that doesn't answer.
- Telephony provider limits. Your Twilio/Telnyx number and messaging service have their own throughput limits. A shared number can bottleneck before the voice platform does.
- Downstream vendor rate limits. Your LLM, your STT/TTS, and — the one everyone forgets — your CRM webhook and any API the agent calls mid-conversation. Twenty agents all hitting a GoHighLevel endpoint or a booking API at once will start getting 429s, and a rate-limited tool call becomes a hallucinated answer or a stalled turn.
- Latency drift. Turn-taking that's 700ms at one call quietly creeps past a second under load. The caller starts talking over the agent, barge-in fights the response, and the call feels broken even though nothing errored.
Build a realistic load profile first
Don't test "100 calls." Test this client's worst hour. Pull their actual call logs and find the peak: calls per hour, peak concurrency (not total — how many overlap), average handle time, and the mix of intents. A dental office's Monday 8–9am is a wall; an HVAC line's load is spiky and after-hours. Size the test to the real spike plus ~30% headroom, not to a round number.
How to actually generate the load
You have three options, cheapest to most realistic:
- Platform concurrency settings + a burst script. The fastest signal: raise (or confirm) your concurrency cap, then fire a batch of outbound test calls to a number you control. Crude, but it surfaces the cap and the 429s immediately.
- A synthetic-caller harness. Script an outbound campaign that dials your agent with pre-recorded caller audio (or a second agent playing the customer). Ramp from 1 → peak concurrency in steps and watch where latency and failures start. This is what catches drift.
- A load-testing service. Some platforms and third-party tools (Cekura, Hamming, and similar voice-QA vendors) will simulate concurrent calls with scored transcripts. Worth it before a high-stakes enterprise go-live; overkill for a $1,500/mo local account.
Ramp in steps — 25%, 50%, 100%, 130% of expected peak — and hold each step long enough (a few minutes) to see sustained behavior, not just the first spike.
The four numbers to watch
- Answer rate under peak — what fraction of concurrent calls actually connect. This is the one that maps directly to lost revenue.
- P95 turn latency — not the average. The average hides the calls that felt broken. If P95 blows past ~1.2s under load, callers are talking over the agent.
- Tool/webhook error rate — 429s and timeouts on your CRM and booking calls. These are silent killers because the call "completes" but nothing got written.
- Failed/abandoned calls — dead air, stuck holds, early hangups.
Turn the results into a config, not a vibe
The point of the test is a number you can act on and defend. When you find the ceiling, you either raise the cap (request more concurrency from the platform), add a queue/overflow message so caller 21 hears something, or size the client's plan honestly. Then bake the safe concurrency into the client's onboarding doc so nobody's surprised at renewal.
Re-run the test after any major prompt or integration change, and once before every launch you'd be embarrassed to have fail. Load testing isn't a one-time gate — it's the difference between "the agent broke" and "we sized it for your Monday and it held."