How it works
How an AI call campaign works, from trigger to booked meeting
A campaign is a published workflow. Something happens to a contact, the engine decides what to do and when, the AI appointment setter calls and books through real calendar tools, and the outcome decides what happens next. Here is each part, in order.
Tag added
new-lead
Wait
5 minutes
Calendly: check meeting
Strategy call · upcoming
bookednot booked- Live
AI call
Riley · books via Calendly
Loop counter
up to 3 attempts
The five parts of a campaign
- 01
Trigger
The event that starts a run for one contact: a new contact, a tag, a list change, a Calendly booking or cancellation, a webhook, a CSV import or a manual run.
- 02
Workflow
The canvas of nodes the run walks through: waits, if/else, loop counters, calendar checks, outreach and tags. Published as an immutable version.
- 03
Agent
The voice agent you configured: model, voice, transcriber, first message, script, voicemail behaviour and the tools it may call.
- 04
Tools
Functions the agent calls mid-conversation: get free slots, book, search or cancel meetings, read contact history, get the current time.
- 05
Channels
SMS through Twilio and email through Gmail, SendGrid or Resend, each with merge fields and its own quiet hours.
Step by step
What happens on every run
Six things happen between the trigger and the booked meeting. Each one is something you configured once, then never had to think about again.
- 1
Something happens to a contact
Every run starts with one contact and one event. A form creates the contact through the API, your closer adds a tag, Calendly fires a booking or cancellation, another system posts to a signed webhook URL, or a CSV import applies a tag to a thousand rows at once. The engine finds every published workflow whose trigger matches and starts a run for each.
On the canvas
- Contact created
- Tag added
- Calendly invitee.created
- Webhook
- CSV import
What you configure
- Which trigger starts the campaign
- Optional filters: a specific tag, list or Calendly event type
- Whether imports should run automations
- 2
The workflow decides what to do, and when
The run walks the canvas one node at a time. A wait node parks the run for a duration. An if/else branches on tags or list membership. A calendar check asks Calendly or iClosed whether a meeting already exists. A loop counter runs a section a fixed number of times. Before any outreach node fires, the engine checks the contact's opt-outs and your quiet hours for that channel.
On the canvas
- Wait 5 min
- If / else
- Check meeting
- Loop ×3
What you configure
- Waits, branches and loops
- Quiet hours per channel in your timezone
- Retry cadence for no-answers
- 3
The agent places the call
The AI call node reserves a slot under your concurrent-call limit, builds the assistant from your agent configuration, resolves merge fields like the contact's first name, and places the call through Vapi on one of your Twilio numbers. The worker is freed immediately; the run parks until the call ends. If every slot is busy, the run waits its turn instead of dropping the lead.
On the canvas
- Claude Sonnet 4.6
- ElevenLabs voice
- Deepgram Nova 2
- Voicemail: on
What you configure
- Model, voice and transcriber
- First message and script
- Voicemail detection and message
- Concurrent-call limit
- 4
The agent uses tools while the lead is on the line
When the conversation needs facts, the agent calls a tool. It can check the current time in the lead's timezone, read the contact's history so a callback picks up where the last call ended, fetch free slots from Calendly, Google Calendar or iClosed, book the meeting, search existing bookings or cancel one. Each tool call is signed and scoped to your organization.
On the canvas
- get_current_time
- get_contact_history
- calendly_get_slots
- calendly_book_meeting
What you configure
- Which tools the agent may call
- Which calendar, event type or closer to book into
- Workday hours and slot length for Google Calendar
- 5
The outcome routes what happens next
When the call ends, Vapi reports back and the run resumes. The engine classifies the outcome: connected, busy, no answer, voicemail or failed. The agent's structured output records whether the lead asked not to be contacted, which sets do-not-call automatically, and whether they asked for a callback and when, which parks the run until that time. Branches, tags, texts and emails follow from there.
On the canvas
- Connected
- Voicemail
- Callback 4:00 PM
- Do not contact
What you configure
- Callback limits: how many times, how far ahead
- Tags for booked, nurture, unreachable
- Confirmation text and email
- 6
You see every step
Each run has a timeline of steps with status, attempts and errors. Every call, text and email appears on the org-wide logs page with its outcome, and on the contact's own activity feed with the transcript. Failed steps retry with exponential backoff; idempotency keys make sure a retry never sends twice.
On the canvas
- Run timeline
- Logs
- Contact activity
- Transcripts
What you configure
- Nothing. This is on by default.
Example
A run, minute by minute
A speed-to-lead campaign for one contact, as it appears on the run timeline.
| Time | Node | Event |
|---|---|---|
| 14:02:10 | Trigger | Contact created from form. Run started. |
| 14:02:11 | Send SMS | Text delivered via Twilio: “Riley here, calling you in a moment.” |
| 14:02:11 | Wait | Parked for 60 seconds. |
| 14:03:11 | AI call | Slot reserved. Call placed via Vapi. Run parked awaiting end-of-call report. |
| 14:04:52 | AI call | Outcome: connected. Tools called: get_current_time, calendly_get_slots, calendly_book_meeting. |
| 14:04:53 | Check meeting | Calendly: upcoming meeting found. Branch: booked. |
| 14:04:53 | Add tag | Tag applied: booked. Run completed. |
Engine
Under the hood
The parts you never see, so the parts you do see behave.
- Run execution
- One worker claims a run atomically. A run is single-threaded cluster-wide, so steps never race.
- Retries
- Per-node policy with exponential backoff and jitter. Email and SMS up to 5 attempts, AI calls up to 4, contact updates 3.
- Idempotency
- Every step attempt has a unique key, and provider calls carry it, so a redelivery cannot double-send.
- Call pacing
- A global concurrent-call limit backed by an atomic reservation. Runs queue for a slot and time out cleanly if they never get one.
- Quiet hours
- Per channel, per organization, in your timezone. Blocked sends park until the window opens.
- Provider resilience
- A fallback transcriber is injected into every call. Retryable provider errors are retried; permanent ones fail the step with the reason.
- Credentials
- Provider keys are encrypted at rest and scoped to your organization. Team roles gate who can change them.
- Versioning
- Publishing snapshots the canvas into an immutable version. Runs always execute the version that was live when they started.
FAQ
Questions about how campaigns run
Do I need to write code to build a campaign?
No. Campaigns are drawn on a canvas and every node is configured with forms. You only touch the API if you want to push contacts in from your own form or CRM, or trigger campaigns from another system with a webhook.
How long does the first campaign take to set up?
Most teams connect Vapi, Twilio and a calendar, configure an agent, and publish a five-node campaign in an afternoon. The demo-call form on this site is exactly that campaign.
Can I test a campaign before it goes live?
Yes. A workflow can be run manually for a single contact from the API before or after publishing, and the run timeline shows every step and outcome. Use your own number as the contact.
How are calls paced so I don't overwhelm my numbers or my team?
A concurrent-call limit applies across the organization. Runs reserve a slot before dialling and queue behind the limit when it is full. Combined with wait nodes and quiet hours, a large list is worked through steadily.
What happens if a provider is down mid-campaign?
Transient errors such as timeouts and rate limits are retried with backoff. Every call carries a fallback transcriber. If a step fails permanently, the run records the reason on its timeline and the contact is not silently dropped.
What information does the agent have about the lead?
Merge fields from the contact record such as first name, company and city, plus anything the agent fetches with tools: the contact's activity history, the current time in their timezone, and live calendar availability.
Can several campaigns run for the same contact?
Yes. Each matching published workflow starts its own run. Use tags and list membership in your triggers and if/else nodes to keep campaigns from overlapping where that matters.
Hear it before you believe it.
Drop your number and our agent will call you in about 30 seconds. Or create a free account and publish your first workflow today.