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

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

  1. Go to Campaigns in the sidebar → click New campaign.
  2. Give it a Name (e.g. "Q1 outreach").
  3. 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.
  4. 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.
  5. Optionally set the calling window, answering‑machine detection, and retry policy (all explained below).
  6. 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 .csv or .xlsx/.xls file. 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.

FieldWhat it does
Call from / Call untilLocal wall‑clock HH:MM bounds. Set both or neither — a one‑sided window is rejected.
TimezoneAn 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:0006: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:

SettingBehavior
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 machineStay on the line; the agent plays its voicemail message (configured on the agent's Channels step) then hangs up.
Hang up on a machineDrop 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.

SettingDefaultRangeWhat it does
Max attempts31–10Total dial attempts per target, including the first. Once exhausted the target is finalized as failed.
Backoff (minutes)51–60Base wait before a retry. The worker grows it exponentially: base × 2^(attempt − 1), capped at 1 hour.
Redial no‑answer / busyOnon/offOn: 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:

StatusMeaning
draftCreated, not yet dialing. Upload targets here.
runningThe dialer is working through targets within the window and concurrency cap.
pausedDialing temporarily stopped; resume with Start.
completedNo pending or dialing targets remain — set automatically.
cancelledStopped permanently; any still‑pending targets are skipped.
  • Start — moves draft or pausedrunning.
  • Pause — moves runningpaused. 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):

StatusMeaning
pendingQueued, waiting to be dialed (or waiting for the window/backoff).
dialingCurrently being dialed.
completedThe call connected and ended normally.
failedOut of attempts (hard failure, or no‑answer/busy when retries are exhausted/disabled).
skippedNot 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 (or phone).

API

Campaigns are fully scriptable — create, upload targets, schedule, start/pause/cancel, read the target list, retry failures, and export. See the Campaigns API.