Voice campaigns
Create a campaign, import leads, move it through approval and launch, read the lead roster, and dial a single lead straight from the CRM.
A campaign answers four questions: who gets called, by which agent, from which number, and inside which hours. It is the most configuration-dense screen in the voice surface, and every field on it is a compliance decision wearing a plain label.
Before you start
You need a published agent version and a published product version. Both. Creating and editing campaigns needs the voice edit permission.

Draft
Edit anything
Pending approval
Configuration locks
Approved
Configuration snapshotted
Running
Pause and resume return here
Completed
Terminal, with stopped and archived
Create the campaign
Click New campaign
From CRMVoice AgentsCampaigns. The subtitle sets the expectation: Draft first — approval and launch run compliance preflight server-side.
Fill Campaign name, Purpose and Audience description
Purpose and audience are prose. Write them for the person who has to approve this, including future you.
Choose the Audience classification
The single most consequential field on the form. See below.
Select the Agent and Product
Both pickers offer published versions only.
Select a Caller number
A draft may sit at — none —, but preflight will want a real one.
Tick any Campaign context packs
These are added on top of the agent's own packs.
Set the calling window and the caps
Days, start and end time in the lead's local time, then the five caps.
Leave Test campaign on and save the draft
Test mode restricts live dialing to allowlisted numbers. Turn it off deliberately, not by habit.
Audience classification
| Setting | What it changes | Default |
|---|---|---|
| Internal test | Your own numbers. No extra preflight burden. | Selected |
| Consent backed | Leads with a consent record. Preflight checks each lead for valid, unexpired consent before dialing it. | — |
| B2B counsel approved | Business calling your counsel has reviewed. Raises a warning at approval that you must acknowledge by typing. | — |
| Consumer cold | Cold consumer telemarketing. Denied by default policy with no in-app override. | — |
Consumer cold is default-deny
Selecting it shows an inline red warning immediately, and preflight blocks the
campaign with audience_policy_denied. There is no override in the product. Use
consent-backed leads, internal test numbers, or a counsel-approved B2B
classification instead.
Calling windows, caps and retries
| Setting | What it changes | Default |
|---|---|---|
| Timezone fallback | Used when a lead has no timezone of its own. | America/New_York |
| Calling window (lead-local time) | The days and the start and end time, interpreted in each lead's local time. The end time is exclusive. | Mon–Fri, 09:00 to 17:00 |
| Daily cap | Maximum dials per day across the whole campaign. | 25 |
| Max concurrency | How many calls may be in progress at once. | 1 |
| Max attempts | Attempts per lead before it is exhausted. | 2 |
| Cooldown (min) | Minutes that must elapse between two attempts on the same lead. | 240 |
| Max call (sec) | Per-call duration cap. | 600 |
| Voicemail behavior | Hang up, leave a message, or schedule a retry. | Hang up |
| Test campaign | Restricts live dialing to allowlisted numbers. | On |
Retries are configured for you: a lead is retried on busy, no answer and provider failure. The Cooldown (min) is what stops that becoming harassment.
The calling window is per lead, not per workspace
A 09:00–17:00 window means 09:00–17:00 where the lead is. A campaign spanning four time zones dials for twelve hours of your day. That is intended — but plan your Daily cap around it.
Import leads
Open the campaign and click Import leads
From the campaign detail page.
Paste CSV or choose a file
A phone column plus an optional name. The placeholder shows the shape:
phone,name then +15550100001,Ada Lovelace.
Submit
Suppressed numbers are skipped server-side — they never enter the roster at all.
The lifecycle
A campaign has nine statuses. Which buttons appear depends on where it is.
| Button | What it does |
|---|---|
| Submit for approval | Draft → pending approval. Configuration edits lock until the decision |
| Approve… | Opens the approval dialog. Disabled until a passing preflight exists |
| Schedule… | Sets a future start on an approved campaign |
| Start | Begins dialing. Preflight re-runs server-side; launch is refused if any check fails |
| Pause | In-flight calls finish, no new dials until you resume |
| Resume | Preflight re-runs; resume is refused if any check fails |
| Stop | Cannot be undone. Remaining leads are never dialed by this campaign |
| Edit | Available while draft or paused. Changes require re-approval when the checks demand it |
The statuses are draft, pending approval, approved, scheduled, running, paused, stopped, completed and archived. Stopped, completed and archived are terminal.
Approving
Click Run preflight
Each row shows a code, a severity, a message, remediation text and how many leads it affects.
Resolve every error
Warnings do not block. Errors do.
Click Approve…
Preflight re-runs inside the dialog — a stale pass is not good enough.
Type the acknowledgment if there are warnings
The label reads Type “…” to continue. It is matched exactly.
Click Approve
Approval snapshots the configuration into an immutable version.
The acknowledgment phrase is byte-exact
It is an API contract, not free text. Extra spaces, different capitalisation or a smart quote will all leave Approve disabled with nothing visibly wrong. Copy the phrase from the label.
Arm queue: the shortcut for agent dial queues
A dial queue created from a lead gets a single confirmation instead of the full ladder. Click Arm queue — the dialog runs preflight automatically and reads One confirm approves and starts this agent's dial queue. Read any warnings, then click Arm queue & start calling.
It stays disabled until preflight passes: Preflight must pass before the queue can be armed. Once armed you get Queue armed — dialing proceeds within its calling windows. Ordinary campaigns keep the full submit → approve → schedule → start path.
The lead roster
The Leads table shows every lead with its membership status, attempts made, next attempt, last disposition and — the useful one — Block reason.
Lead statuses are pending, queued, dialing, in call, completed, retry scheduled, exhausted, opted out, suppressed, blocked and canceled.
Dial now dials one lead immediately. Its tooltip is precise: Dial this lead now (skips the schedule; every safety check still runs). It skips the schedule, not the per-dial preflight.
Call a lead from the CRM
You do not have to build a campaign to call one person.
Open the lead and find the Voice section
It is on Leadsthe leadActivity.
Click Assign voice agent
Then pick the Voice agent.
Choose a Call schedule
Call at suggested time shows the suggested lead-local time. Now only appears when it is allowed. Pick a time… lets you choose.
Confirm
The button reads Start call now, Start queue and call or Schedule call depending on what you chose.
Your chosen time may be moved
A time outside the agent's calling windows is snapped forward, with a note: Adjusted to … (lead time) — the picked time falls outside the agent's calling windows. If nothing opens near it you get No calling window opens near that time — pick another. Bulk assignment is always dispatcher-scheduled and shows no schedule chooser.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Approve is greyed out with Run a passing preflight first | No passing preflight result exists yet | Click Run preflight and resolve every error |
| The Approve dialog will not submit and nothing is failing | Warnings are present and need the typed acknowledgment | Type the phrase from the label exactly |
| Leads sit at pending and never get dialed | Outside the calling window, cooldown not elapsed, or the daily cap is reached | Read the Block reason column; widen the window, lower the cooldown, or raise the cap |
| Leads show blocked as suppressed or opted out | The number is in the opt-out registry or marked do-not-contact | Suppressed leads are never dialed — remove them, or restore opt-in from the call detail page |
| Imported rows are missing | Suppressed numbers are skipped server-side | Expected — they never enter the roster |
| The campaign was stopped by mistake | Stop cannot be undone | Create a new campaign; the remaining leads are not dialed by the stopped one |
| Dialing has not started although the campaign is running | The dispatcher works on a tick, inside each lead's local window | Wait for the window; check Block reason if it persists |