Outbound campaigns
Outbound campaigns
A campaign dials a list of contacts with one of your agents, at a concurrency you choose and within an optional calling window. Use campaigns for reminders, surveys, follow‑ups, debt collection, lead qualification, and any other bulk outbound work.

The Campaigns page — create a campaign, upload contacts (CSV/Excel), pick the agent, calling window and retry policy, then watch progress live.
Everything below can be done end‑to‑end from the dashboard, or scripted through the Campaigns API.
Creating a campaign
- Go to Campaigns in the sidebar → click New campaign.
- Give it a Name (e.g. "Q1 outreach").
- Pick the Agent that will run the calls. Only agents in your organization appear here, and if the agent uses context variables the dialog reminds you which ones to supply per contact.
- Set Concurrency — how many calls run in parallel. Default 5, range 1–50 (values are clamped to this range). Keep it within your telephony provider's per‑account rate limit.
- Optionally set the calling window, answering‑machine detection, and retry policy (all explained below).
- Click Create. The campaign starts in draft so you can upload targets and review settings before any dialing happens.
Creating, editing, uploading, starting, pausing and retrying all require the owner, admin, or developer role. Cancel and Retry failed require owner or admin. Viewers can see campaigns but not change them.
Uploading targets
On the campaign detail page, use the Add targets card.
- Upload a file — drop or choose a
.csvor.xlsx/.xlsfile. Excel files are parsed right in your browser, so you get true spreadsheet support. - Map columns — Telenow auto‑detects a phone column (it looks for headers like
phone_number,phone,mobile,number,msisdn) and auto‑maps any column whose header matches one of the agent's variables. You can override every mapping with the dropdowns. The phone column is required; any agent variable marked required must also be mapped before you can import. - Preview — the first five rows are shown so you can confirm the mapping looks right.
- Add one manually — for a single contact, type the phone number and fill in the variable fields directly.
Each contact's mapped values become its context variables, substituted into the agent's prompt and opener when that contact is dialed (e.g. {first_name}, {appointment_time}).
Unmapped columns are kept too. Any extra column that you don't explicitly map to a variable is still preserved as a per‑target variable under its own header name — so a account_id column you forgot to map is still available to the agent (and tools) at dial time. Nothing in your file is silently dropped.
Phone number format
Numbers are canonicalized on upload: a leading + is kept and every other non‑digit (spaces, dashes, parentheses) is stripped. A row with no digits at all is skipped. E.164 (e.g. +14155550123) is strongly recommended so the carrier dials the right country.
Do‑Not‑Call is enforced at upload time
When you import targets, any number already on your organization's Do‑Not‑Call list is not added to the campaign — it's skipped and counted as suppressed. The dashboard reports this (e.g. "Added 480 targets · 20 skipped (Do‑Not‑Call)"). Suppression is also re‑checked at dial time, so even if you add a number to the DNC list after uploading, any still‑pending call to it will be skipped rather than dialed. See Do‑Not‑Call for the full timing rules.
Scheduling & compliance
Open Edit in the Campaign settings card to configure when and how the campaign dials. You can also set all of these at creation time.
Calling window
Restrict dialing to allowed local hours so you stay within TCPA‑style quiet‑hours rules.
| Field | What it does |
|---|---|
| Call from / Call until | Local wall‑clock HH:MM bounds. Set both or neither — a one‑sided window is rejected. |
| Timezone | An IANA timezone (e.g. America/New_York) the window is interpreted in. Defaults to UTC. |
- Calls outside the window are never dropped — they simply wait, staying pending, and resume automatically when the window reopens. No skip/requeue churn.
- Overnight windows are allowed. A start later than the end (e.g.
20:00–06:00) wraps midnight as you'd expect. - Leave both times blank to dial any hour (no restriction).
- The two bounds must differ; equal bounds would mean "always closed".
Answering‑machine detection (AMD)
Decide what happens when a machine (voicemail) answers instead of a person:
| Setting | Behavior |
|---|---|
| Off (default) | Fall back to the agent's own setting (below). With nothing set there, a machine is treated like a live answer and the agent talks immediately. |
| Leave a voicemail on a machine | Stay on the line; the agent plays its voicemail message (configured on the agent's Channels step) then hangs up. |
| Hang up on a machine | Drop the call immediately when a machine is detected. |
The agent can turn detection on by itself. A voicemail message, Call Screen Handling, or IVR Hangup configured on the agent each arm answering-machine detection for every outbound dial, whatever this campaign field says — otherwise those settings could never fire. Precedence on a machine answer is IVR Hangup → Call Screen → voicemail message. Note that detection is a per-call carrier charge on Plivo and Twilio.
Backstop: the agent also listens for the greeting. Carrier detection isn't perfect — Exotel and SIP trunks have no per-call detection at all, and some carriers report the verdict a few seconds in, before the beep. So if the first thing the agent hears on an outbound call is clearly a machine ("your call has been forwarded to voicemail… at the tone, please record your message"), it treats that as a machine answer too, instead of holding a conversation with the recording. This only applies to outbound calls, only in the first couple of turns, and only to wording a person answering their own phone wouldn't use.
Retry policy
Three independent settings control re‑attempts. They default to the historical 3‑attempt behavior, so you can ignore them if it suits you.
| Setting | Default | Range | What it does |
|---|---|---|---|
| Max attempts | 3 | 1–10 | Total dial attempts per target, including the first. Once exhausted the target is finalized as failed. |
| Backoff (minutes) | 5 | 1–60 | Base wait before a retry. The worker grows it exponentially: base × 2^(attempt − 1), capped at 1 hour. |
| Redial no‑answer / busy | On | on/off | On: an unanswered or busy call is retried (up to max attempts). Off: only hard dial failures retry; a no‑answer or busy is treated as final. |
Hard dial failures (the carrier rejected the API call, a circuit breaker tripped, etc.) always retry until max attempts runs out, regardless of the "Redial no‑answer / busy" toggle — that toggle only governs unanswered/busy outcomes.
Running it
Use the Start / Pause / Cancel buttons at the top of the campaign detail page to move it through its lifecycle:
| Status | Meaning |
|---|---|
| draft | Created, not yet dialing. Upload targets here. |
| running | The dialer is working through targets within the window and concurrency cap. |
| paused | Dialing temporarily stopped; resume with Start. |
| completed | No pending or dialing targets remain — set automatically. |
| cancelled | Stopped permanently; any still‑pending targets are skipped. |
- Start — moves draft or paused → running.
- Pause — moves running → paused. In‑flight calls finish; no new ones are placed.
- Cancel — stops the campaign for good and skips any pending targets. (Cancel is owner/admin only and can't be undone — create a new campaign to redial.)
- A campaign auto‑completes the moment its last actionable call finishes.
The detail page shows live tiles (Targets, Completed, Progress, Concurrency) and a paginated target list with each contact's status, attempt count, last error, and a link to the call's recording and transcript. It refreshes every few seconds while the campaign is active.
Per‑target status
Each target moves through these states (shown as filter chips with counts):
| Status | Meaning |
|---|---|
| pending | Queued, waiting to be dialed (or waiting for the window/backoff). |
| dialing | Currently being dialed. |
| completed | The call connected and ended normally. |
| failed | Out of attempts (hard failure, or no‑answer/busy when retries are exhausted/disabled). |
| skipped | Not dialed — suppressed by Do‑Not‑Call, or skipped because the campaign was cancelled. |
Retrying failures
When a campaign has failed targets, a Retry failed button appears above the target list (owner/admin). It re‑queues every finalized‑failed target for a fresh round of attempts: the attempt counter resets, the prior error/session is cleared, and the campaign's failed counter rolls back. A completed campaign reopens to running so the dialer picks the rows up; a paused campaign keeps its state (the retried rows wait until you resume). A cancelled campaign is terminal — create a new campaign instead.
Exporting
Click Export CSV above the target list to download the target list (honoring the active status filter) as a CSV — one row per target with status, attempt, last error, timestamps, the linked session id, and a variables column (the per‑target variables as JSON), so you can pivot in a spreadsheet or re‑import elsewhere.
Do‑Not‑Call (DNC)
Maintain a suppression list so opted‑out and complaint numbers are never dialed. Manage it under Do‑Not‑Call in the sidebar — add numbers one at a time, import a list, search, bulk‑remove, and export. See the Do‑Not‑Call product page for the workflow and the Do‑Not‑Call API to automate it. For the TCPA rules behind calling windows and suppression when dialing US numbers, see US calling compliance.
Tips
- Test your agent with a single web or phone call before launching a large campaign — the campaign uses the exact same agent pipeline.
- Keep concurrency comfortably under your carrier's limit; the engine never exceeds the per‑campaign cap you set, but other dialing in your org competes for the same trunk.
- Map an
account_id(or similar) column even if the agent doesn't "use" it — it's preserved as a variable and is handy in post‑call analysis and webhooks. - Use post‑call webhooks to push outcomes straight into your CRM instead of polling.
Troubleshooting
- "start_time_local and end_time_local must be set together" — you set only one side of the calling window. Set both, or clear both.
- Targets stuck at pending and nothing dials — check the campaign is running, the current local time is inside the calling window, and concurrency is at least 1.
- A number you uploaded never gets called — it's probably on the Do‑Not‑Call list; look for it under the skipped chip (suppressed) and in the import toast count.
- CSV upload rejected — the file needs a phone column. The browser importer looks for one automatically, and the raw‑CSV API endpoint requires a header literally named
phone_number(orphone).
API
Campaigns are fully scriptable — create, upload targets, schedule, start/pause/cancel, read the target list, retry failures, and export. See the Campaigns API.