Vapicon 2026 is coming
Register Now →
Today we're launching a new version of Vapi Campaigns, batch outbound calling rebuilt from the ground up. Give a campaign a contact list of up to 10,000 contacts, an assistant or squad, and a phone number, and Vapi dials through the whole list. Each call is tailored to its contact, dialing stays inside the window you set, and anyone who already converted gets skipped at dial time.
Behind that simple description is a full rearchitecture, built to make outbound dependable at scale. Here's why we did it, and why it makes outbound a use case you can bet on.
Placing one outbound call is an API request. Placing ten thousand takes a distributed system: something has to track which contacts have been dialed, keep the right number of calls in flight, respect calling hours, apply per-contact context, and recover cleanly when a call fails or a process restarts. Get any of that wrong at scale and the consequences are concrete. A campaign stalls with no record of who's left. The same customer gets dialed twice, or gets a call outside the hours you promised.
Most teams solve this with a dialer script, and dialer scripts tend to break in exactly these ways. The first version of Campaigns had the same limits. It stored contacts as a single blob on the campaign record, created every call upfront in one batch, and tracked progress with counters that could drift. It worked, but at real volume and during peak hours, it became less reliable.
So we rebuilt it. The enterprises coming to us for appointment reminders, collections, lead qualification, and candidate outreach don't just want outbound that works. They want outbound they can run their business on.
Campaigns now run on a standalone, durable workflow engine rebuilt separately from our call queue. We made every design decision to keep campaigns running more reliably at scale.
Additionally, your campaign can't be lost. A campaign's state persists outside any single process, so a deploy, a restart, or an infrastructure hiccup doesn't lose your progress. Your campaign picks up exactly where it left off.
On top of that, we also updated how it handles concurrency as a sliding window, not a batch. The campaign's dispatcher keeps as many calls in flight as your concurrency limit allows. The moment one call ends, the next contact is dialed.
In addition, every state change appends an immutable event: started, dispatched, completed, failed, ended. Progress is derived from that record of what actually happened, so it can't drift from reality, and every contact carries a full audit trail.
And it scales past the list you'd think to test. The architecture was designed for scale from day one, handling 10,000 contact campaigns without breaking a sweat.
The architecture handles the running. The decisions stay with you. Contact fields flow into the assistant's prompt as variables, so the same campaign produces a different conversation for every caller: their own name, their balance, their appointment time. Dialing runs only inside the window you set. Schedule a campaign for tomorrow at 9 am, and it waits. And before each call is placed, the pre-dial webhook checks the contact against your systems, so anyone who already converted gets skipped, and a webhook error skips the contact rather than risking a bad call.
That same event ledger powers what you see while it runs: live statuses and counters showing where every contact stands. If you need to stop, stopping halts new dials and lets active calls finish gracefully, so no one gets cut off mid-sentence.
The point of the rearchitecture isn't the architecture. It's that outbound on Vapi now carries the same production guarantees as everything else on the platform, and that changes the use cases you can build.
Appointment reminders. A healthcare operations team uploads next week's appointment list every Thursday. Campaign dials every patient during business hours, greets each one by name with their appointment time, and skips anyone who already confirmed online.
Payment reminders. A lending team runs a reminder campaign for customers with overdue payments, with the pre-dial webhook pointed at its billing system. A customer pays an hour into the campaign, the webhook returns a skip, and that call never gets placed.
Lead qualification. A sales team uploads 8,000 leads from a webinar. The assistant qualifies each one against their criteria, and event webhooks push outcomes into the CRM as calls complete. Reps see qualified leads the same day.
Candidate outreach. A staffing platform loads screening lists overnight and dials during daytime windows, tracking pickups, voicemails, and completions in the campaign dashboard.
Campaigns is live in your dashboard. Upload a short list, set a low concurrency, and watch the ledger fill in as calls complete. The docs cover setup, CSV formatting, and dynamic variables.
Launch outbound at scale with confidence.
