# Outbound Campaigns
> **Bulk dialing for sales, notifications, and callbacks — with compliance, pacing, and recording built in.**
> **TL;DR**
>
> * **What it is —** a bulk outbound dialer that takes a contact list, paces calls at a rate you set, dials through a pool of phone numbers, bridges answered calls to an agent or a department, and automatically respects your do-not-call list.
> * **Who it's for —** admins running lead-qualification, callback, or notification campaigns at scale. The scheduler runs autonomously.
> * **Top outcome —** thousands of calls placed over hours or days at a predictable rate, each one compliant, recorded, and attached to the contact record in the CRM.
## At a glance
| | |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Plan tier** | Included with every Lodgestory Voice plan. |
| **Who can manage** | Account Owners and Admins configure, start, pause, and cancel campaigns. Agents become bridge targets. |
| **Dial modes** | **Customer-first** — dial the customer, bridge an available agent on answer. Lower agent idle time, some abandonment risk. **Agent-first** — dial an agent first, then dial the customer, bridge when the customer picks up. Zero abandonment, higher agent idle. |
| **Pacing** | 1 to 20 calls per second, smoothly rate-limited. |
| **Number rotation** | Three strategies — round-robin across your pool, random, or "same number for the same contact" so callbacks reach the right caller ID. |
| **Retry policy** | 1 to 5 attempts per contact with a configurable backoff. |
| **Compliance** | Every dial checks your per-account do-not-call list. Uploads also flag contacts already on the list. |
| **Business hours** | Campaigns respect a business-hours window — no dialing outside it. |
| **Top limits** | Up to 50 concurrent calls per campaign. Up to 50 phone numbers in a campaign's rotation. Practical ceiling of hundreds of thousands of contacts per campaign. |
| **API** | Partner API available on request. |
## How to find it
**Sidebar:** Settings → Calling → \[your account] → **Outbound Campaigns**.
**Direct URLs:**
* List: `/crm/settings/calling/{accountId}/outbound-campaigns`
* Create wizard: `/crm/settings/calling/{accountId}/outbound-campaigns/new`
* Campaign detail: `/crm/settings/calling/{accountId}/outbound-campaigns/{campaignId}`
📸 `[SCREENSHOT: campaigns-landing.png — campaigns list with status badges, progress bars, and active dial counters]`
## What are Outbound Campaigns?
### The problem it solves
Manual click-to-call tops out at a few dozen calls per agent per day. Anything beyond — lead qualification, win-back, confirmation follow-ups, notification blasts — needs autonomous dialing. But naive auto-dialers break fast:
* Rate limits cause provider-side call failures.
* Compliance violations happen when you accidentally dial an opted-out number.
* Abandonment — customers hanging up angry because no agent was ready — breaks customer trust.
* Messy retry logic calls the same contact three times.
* A crash loses state and contacts fall through the cracks.
Outbound Campaigns handles all of that. Two dial modes let you pick the trade-off that fits your operation. Built-in pacing prevents provider overload. A compliance layer checks your do-not-call list on every single dial. Retries follow a clear policy. And if anything ever stalls, the system automatically cleans up and keeps going.
### What you get
* **Full campaign lifecycle** — Draft, Scheduled, Running, Paused, Completed, Cancelled.
* **Contact list upload** via CSV or API. Phone numbers normalize to international format automatically. Contacts already on the do-not-call list are flagged during upload.
* **Two dial modes**:
* **Customer-first** dials the customer, bridges an agent when they answer. Good for high-volume sales where a small abandonment percentage is acceptable.
* **Agent-first** dials the agent, then dials the customer on a second line, and bridges when the customer answers. Zero abandonment — the agent is always on the line ready to greet. Agent idle time is higher.
* **Number rotation** across a pool. Three strategies:
* **Round-robin** spreads calls evenly across the pool.
* **Random** picks any number from the pool.
* **Sticky by contact** uses the same number for the same contact across retries, so a customer calling back reaches the caller-ID they recognise.
* **Smooth pacing** — 1 to 20 calls per second, rate-limited so bursts don't overwhelm your provider.
* **Retry policy** — up to five attempts per contact with a configurable backoff. Retryable outcomes (no answer, busy) retry; final outcomes (invalid number, rejected) don't.
* **Transfer target** — after the customer answers (customer-first) or the agent answers (agent-first), bridge to a department queue, a specific agent, or a voice menu.
* **Recording** on every call, retrievable from the caller's contact timeline afterwards.
* **Do-not-call enforcement** on every single dial — even if a number was added to the list after the campaign started, it won't be called.
* **Self-healing scheduler** — if a crash leaves a contact in an uncertain state, it's automatically cleaned up within a minute.
* **Live dashboard** — counts per status, current dials in flight, pacing bucket, do-not-call blocks, abandonment rate.
* **Pause and resume** — stops new dials while letting in-flight ones complete; resume picks up exactly where it left off.
* **Cancel** — terminal; no new dials, in-flight completes gracefully.
### How it's different
* **Two dial modes as a first-class choice.** Most auto-dialers force customer-first. Pick the mode that matches your use case — customer-first for high-volume B2C lead-qualification, agent-first for B2B or VIP flows where abandonment is unacceptable.
* **Smooth pacing that adapts to load.** The dialer doesn't queue up "catch-up" calls after a quiet moment — you get the rate you asked for without bursts.
* **Orphan clean-up built in.** A scheduler that can crash and resume without dropping contacts is a non-negotiable at scale; Lodgestory's handles it automatically.
* **Sticky-by-contact number rotation.** Customers returning a missed call reach the same caller ID they saw — essential for continuity and trust.
* **Zero-abandonment agent-first mode.** For campaigns where every answered customer deserves an immediate human, the agent is already on the line before the customer's phone rings.
### Customer scenarios
* **Ten thousand-contact lead-qualification campaign.** Four phone numbers in round-robin, 5 calls per second, 3 retries with a 2-hour backoff, bridge into the Sales department. Business hours 9am–7pm weekdays. Thirty-five thousand do-not-call entries pre-checked. Drains in about four hours.
* **VIP callback campaign using agent-first.** Three hundred high-value contacts, 2 calls per second, up to 5 retries, bridging specifically to the agent who last spoke to the contact. Zero abandonment tolerated.
* **Post-booking confirmation blast.** Five hundred recent bookings, customer-first, bridging to a voice menu that plays *"Press 1 to confirm, 2 to cancel."* No agent involvement — the system records the response and sends it back to the CRM.
### How it fits with Lodgestory Voice
* **Phone Numbers** provide the pool your campaign rotates through.
* **Departments** and **Agents** provide the bridge target.
* **Voice Menus** offer a no-agent destination for confirmation flows.
* **Call recordings** land on every contact's timeline for later review.
* **The Calls workspace** surfaces every campaign call in the unified history.
* **Per-account do-not-call list** is enforced universally — campaigns, manual dials, everything.
## Core concepts
| Term | What it means |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Campaign** | A named dialing run with a contact list, pacing, retry rules, and a bridge target. |
| **Contact** | A single recipient on a campaign. Each one has a phone number, an optional name, and custom fields. |
| **Dial mode** | Customer-first or agent-first — the classic dialer trade-off. |
| **Number pool** | The set of phone numbers a campaign rotates through for outbound caller ID. |
| **Rotation strategy** | How the pool picks the next number — round-robin, random, or sticky by contact. |
| **Pacing** | The max calls per second the campaign will place, smoothly rate-limited. |
| **Concurrency** | The max simultaneous calls in flight for this campaign. |
| **Retry attempts** | How many tries per contact before they're marked Failed. |
| **Backoff** | The wait between retries. |
| **Transfer target** | Where an answered call gets bridged — a department, an agent, or a voice menu. |
| **Do-not-call list** | The per-account list of numbers that should never be dialed. Checked at upload and on every dial. |
| **Abandonment** | In customer-first mode, a customer picks up but no agent was free. The call ends immediately. Aim for under 3% as an industry rule of thumb. |
### Campaign lifecycle
| Status | What it means |
| ------------- | ------------------------------------------- |
| **Draft** | Still being configured — not yet scheduled. |
| **Scheduled** | Will auto-start at a future time. |
| **Running** | Actively dialing. |
| **Paused** | No new dials; in-flight ones complete. |
| **Completed** | All contacts processed. |
| **Cancelled** | Terminal; cannot be resumed. |
### Contact status
| Status | What it means |
| ---------------- | -------------------------------------------------------------------------------- |
| **Pending** | Not yet dialed. |
| **Dialing** | A call is currently being placed. |
| **Ringing** | The phone is ringing. |
| **Answered** | The contact picked up. |
| **Completed** | The call finished successfully. |
| **Failed** | All retry attempts exhausted. |
| **Retry queued** | A retry is scheduled for a future time. |
| **Blocked** | Matched the do-not-call list. |
| **Abandoned** | Customer-first only — the customer picked up but no agent was available in time. |
## Quick Start — run a 500-contact campaign in 20 minutes
### Step 1 — Prepare your list
Download the sample CSV template (columns: phone number, contact name, custom fields). Fill it in with your 500 contacts using international phone format.
📸 `[SCREENSHOT: campaign-qs-1-csv.png — sample CSV in a spreadsheet]`
### Step 2 — Create a campaign
**Settings → Calling → \[your account] → Outbound Campaigns → + New Campaign**. A four-step wizard opens.
### Step 3 — Basics
Name it *"Spring 2026 lead-qual batch 1."* Pick **Customer-first**. Set pacing to **3 per second** and concurrency to **15**.
📸 `[SCREENSHOT: campaign-qs-3-basics.png — basics step with name, mode, pacing, concurrency]`
### Step 4 — Contacts and number pool
Upload your CSV. Any contacts on the do-not-call list are flagged with a warning. Pick four phone numbers for the rotation pool and set rotation to **Round-robin**.
📸 `[SCREENSHOT: campaign-qs-4-contacts.png — CSV uploaded with DNC warning and number pool picker]`
### Step 5 — Routing and retry
Set the transfer target to the **Sales** department. Retries: **3 attempts** with a **30-minute backoff**. Recording: **on**. Business hours: **account default**.
📸 `[SCREENSHOT: campaign-qs-5-routing.png — routing step with department picker and retry configuration]`
### Step 6 — Schedule
Pick a start time (at least 5 minutes in the future). Save as **Scheduled**.
### Step 7 — Start
The campaign auto-starts at the scheduled time — or click **Start** to begin immediately. Status changes to Running; the scheduler begins dialing.
📸 `[SCREENSHOT: campaign-qs-7-running.png — running campaign detail page with live counts]`
### Step 8 — Monitor
The detail page refreshes every few seconds:
* Contacts in each status (Pending, Dialing, Answered, Completed, Failed).
* Current calls in flight versus available agents in the target department.
* Do-not-call blocks counter.
* Abandonment counter (customer-first mode).
### Step 9 — Pause, resume, or cancel
Use the buttons on the detail page. Pause stops new dials but lets in-flight complete. Resume picks up exactly where the scheduler left off. Cancel is terminal.
### What's next
* Review recordings on each contact's timeline.
* Export the call-log CSV for campaign analysis.
* Tune pacing or dial mode for the next campaign based on what you learned.
## How it works
* You upload a contact list, pick a dial mode, set pacing, and schedule the campaign.
* Once running, the scheduler dials the next eligible contact every tick of its internal clock, respecting your pacing and concurrency limits.
* Before every dial, the do-not-call list is checked — blocked numbers are skipped and marked.
* In customer-first mode, the customer is dialed and an available agent is bridged on answer. In agent-first mode, the agent is dialed first and the customer is dialed on a second line once the agent picks up.
* Every call is recorded, logged, and attached to the contact.
* If the call fails for a retryable reason (no answer, busy), it's queued for retry at your configured backoff. Final failures end attempts for that contact.
* If the scheduler or a provider ever stalls a call mid-flight, a self-healing cleanup resets the contact within a minute so nothing is permanently stuck.
* Pause and resume don't reshuffle — the queue picks up exactly where it left off.
You set the rules; the scheduler runs.
## Features in depth
### Campaign list and detail
The list shows every campaign with its status, a progress bar of completed over total contacts, an active-dials indicator, and a start time. Clicking a campaign opens the detail view.
The detail view is a live dashboard:
* Counts per contact status (Pending, Dialing, Ringing, Answered, Completed, Failed).
* Current pacing level versus the configured rate.
* Available agents in the target department.
* Do-not-call blocks counter.
* Abandonment counter (customer-first).
* Recent-events stream of the latest dials.
* Pause, Resume, and Cancel controls.
📸 `[SCREENSHOT: campaign-detail.png — campaign detail dashboard with all live counters]`
### Four-step creation wizard
1. **Basics** — name, dial mode, pacing, concurrency.
2. **Contacts and number pool** — CSV upload with do-not-call auto-check, number picker with rotation strategy.
3. **Routing and retry** — transfer target, retry configuration, recording toggle, business-hours override.
4. **Schedule and review** — start time, review summary, save as Scheduled or Draft.
### CSV upload
Validated at upload:
* Phone numbers normalized to international format.
* Duplicate detection within the CSV.
* Up to around 200,000 rows per single upload; larger lists are handled via the API.
* Custom fields passed through so they're available on the contact record.
### Do-not-call management
A dedicated sub-page lists the do-not-call entries for the account: manual add, bulk upload, search, export. Campaigns check this list at upload time (flagging any matches) and again on every single dial (catching late additions).
Access it at `/crm/settings/calling/{accountId}/dnc`.
📸 `[SCREENSHOT: dnc-list.png — DNC management with manual add and bulk upload buttons]`
### Pacing visualisation
A live bar on the detail dashboard shows how close the dialer is to its configured rate. Ramping campaigns show the bar filling smoothly as dialing spins up.
### Recording playback
Every call's recording is retrievable from the contact's timeline in the Calls workspace — same place as recordings from inbound calls and manual click-to-call dials.
## Roles & permissions
| Action | Account Owner | Admin | User |
| ------------------------------ | :-----------: | :---: | :-------: |
| View campaigns | Yes | Yes | Read-only |
| Create, edit, delete campaigns | Yes | Yes | No |
| Start, pause, cancel | Yes | Yes | No |
| Upload contacts | Yes | Yes | No |
| Manage do-not-call list | Yes | Yes | No |
| Be a bridge target | Yes | Yes | Yes |
## Connections
* **Phone Numbers** — the rotation pool for outbound caller ID.
* **Departments** — the typical bridge target for answered calls.
* **Agents** — agent-first campaigns dial an agent first; customer-first can also target a specific agent.
* **Voice Menus** — a no-agent bridge target for confirmation flows.
* **Calls workspace** — every campaign call appears in the unified history.
* **Contacts** — campaign results attach to contact records automatically.
## Limits a user will run into
| Limit | Value |
| ------------------------------- | ------------------------------------------ |
| Pacing | 1–20 calls per second |
| Concurrency per campaign | 1–50 |
| Retry attempts per contact | 1–5 |
| Contacts per campaign | Practical ceiling of hundreds of thousands |
| Number pool per campaign | 1–50 |
| Do-not-call entries per account | No hard cap |
## Errors & FAQ
**How do I choose between customer-first and agent-first?**
Customer-first keeps agent idle time lower, but some customers will hear silence-then-drop when an agent isn't immediately available. Aim for under 3% abandonment. Use it for high-volume B2C where that's acceptable.
Agent-first puts the agent on the line first, so every answered customer gets an immediate greeting — zero abandonment. Agent idle time is higher since they're connected while the customer is dialed. Use it for B2B, VIP flows, or anywhere abandonment is unacceptable.
**Why does my pacing show 3 per second but I'm seeing 1 dial every few seconds?**
Concurrency is capping you. If max concurrency is 5 and there are already 5 calls in flight, the scheduler waits for one to complete before starting another.
**What happens to contacts when I pause a campaign?**
Nothing — they stay in their current status. Resume continues from the exact point the scheduler left off. The queue isn't reshuffled and no contacts are dropped.
**Can I retry only the failed contacts from a previous campaign?**
Not in place. Export the failed contacts as CSV and start a new campaign with that subset.
**How does pacing interact with my provider's rate limits?**
If you dial faster than your provider allows, you'll see failed calls from the provider side. Reduce pacing or expand the number pool — more numbers often translate into more concurrent-call headroom with the provider.
**Can I change pacing mid-run?**
Yes. Edit and save; the new rate takes effect on the next tick.
**What's the difference between "sticky by contact" number rotation and the sticky-agent feature in departments?**
Sticky by contact keeps the same outbound caller ID on retries, so callbacks from the customer reach the number they recognise. Sticky agent routes a repeat caller back to the agent they last spoke to. Combine both for full continuity.
**Do campaigns respect business hours?**
Yes. Dials outside the business-hours window are simply queued until the next open window.
### Troubleshooting
| Symptom | Likely cause | Fix |
| --------------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------- |
| Campaign won't start | Number pool is empty or no transfer target | Add numbers or fix the target |
| Contact stuck in Dialing for several minutes | A rare scheduler or provider stall | The self-healing cleanup resets it within a minute; admins can also reset manually |
| High abandonment in customer-first | Pacing too high relative to agent availability | Reduce pacing, add agents to the target department, or switch to agent-first |
| Calls never bridge after the customer answers | Target department has no available agents | Fix the target or pause the campaign |
| Do-not-call blocks appear high | Many numbers in the upload match the list | Expected — check the blocks counter; accept or curate the list |
## Changelog
* **Apr 2026** — Verified in production with customer-first and agent-first modes, per-account do-not-call list, and self-healing scheduler.
* **Feb 2026** — Per-tenant do-not-call registry added.
## Related modules
* **Phone Numbers** — the number pool for outbound caller ID.
* **Departments** — the primary bridge target.
* **Agents** — agent-first dialing and per-agent targeting.
* **Voice Menus** — no-agent bridge target for confirmation flows.
* **Contacts** — the source of your campaign lists and the destination for campaign results.
* **Voice product hub** — the overall picture.