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
- Basics — name, dial mode, pacing, concurrency.
- Contacts and number pool — CSV upload with do-not-call auto-check, number picker with rotation strategy.
- Routing and retry — transfer target, retry configuration, recording toggle, business-hours override.
- 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.
Updated about 3 hours ago