# 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.