DEV Community

Jason Shouldice
Jason Shouldice

Posted on • Originally published at vicistack.com

Why Most VICIdial Outbound Campaigns Underperform (And the Fixes That Actually Work)

I've watched a lot of 50-seat VICIdial floors where agents spend 40% of their shift staring at screens. The dialer is running. The trunks are lit. But the revenue isn't there, and nobody can explain why.

The gap between "we installed VICIdial and started dialing" and "we're running a profitable outbound operation at scale" is filled with campaign configuration decisions, list management practices, and operational frameworks that most teams learn the hard way — through wasted money and burned leads.

This covers the problems I see most often and the specific fixes for each one.

Problem 1: Everything Runs Through One Campaign

When you have 10 agents, a single campaign works. When you have 30, it's a disaster. Fresh web leads that should be called within 5 minutes sit in the same hopper as aged recycled numbers from last month. Your best closers waste time on garbage leads while hot prospects ring to voicemail because nobody's dedicated to speed-to-lead.

Different lead types perform differently. Fresh web leads convert at 3-5x the rate of aged purchased lists. Callback leads that requested a specific time need different handling than cold prospects. Hot transfers from IVR pre-qualification need a closer, not a qualifier. Running all of these through one campaign with one dial method and one script means you're optimizing for nothing because you're trying to optimize for everything.

The multi-campaign architecture that works:

Campaign Purpose Dial Method Agents Priority
SPEED-TO-LEAD Fresh inbound web leads (< 30 min old) RATIO at 1.0 Dedicated top closers Highest
PRIMARY-OUTBOUND Main prospecting campaign ADAPT_TAPERED Core agent pool High
CALLBACK Scheduled callbacks from all campaigns RATIO at 1.0 Original agent or senior agents High
RECYCLE No-answer/busy recycling (2nd-6th attempts) ADAPT_AVERAGE_BALANCE Core agent pool Medium
AGED-LEADS Leads 30-90 days old, re-approach RATIO at 1.5-2.0 Junior agents or training pool Lower
WINBACK Previously not-interested, 60+ days cold RATIO at 2.0 Experienced agents, different pitch Lowest

Create each as a separate campaign in Admin > Campaigns. Use list mix or manual agent assignment to control which agents work which campaigns. For operations with enough agents, dedicate specific people to high-priority campaigns (SPEED-TO-LEAD, CALLBACK) and let the core pool handle PRIMARY-OUTBOUND and RECYCLE.

Problem 2: The Dialer Is Barely Dialing

Default VICIdial ships with auto_dial_level at 1.0 and the dial method set to RATIO. That's one line per agent — basically manual dialing with extra steps. The adaptive algorithm never even kicks in.

Switch to ADAPT_TAPERED. It starts conservative early in the shift and tightens as the shift progresses. Set your starting dial level to 1.5 and your adaptive maximum to 3.5. Set adaptive_dropped_percentage to 2.0 for a safety buffer under the 3% TCPA ceiling.

The algorithm (AST_VDadapt.pl) recalculates every 15 seconds based on drop rates, agent availability, connection rates, and talk time. It will find the right dial level within the first 10 minutes.

When to use each method:

Method When to Use
RATIO Speed-to-lead, callbacks, very small teams (<5 agents), compliance-critical 1:1 dialing
ADAPT_TAPERED Most production campaigns — conservative start, tightens over the shift
ADAPT_AVERAGE_BALANCE 15+ agents, known stable list quality, maximum utilization priority
ADAPT_HARD_LIMIT 30+ agents, very high list volume, low contact rates (<5%)

Starting configuration for a general outbound sales campaign:

Campaign Type: Outbound
Dial Method: ADAPT_TAPERED
Auto Dial Level: 1.5 (starting)
Adaptive Maximum Dial Level: 3.5
Adaptive Dropped Percentage: 2.0
Dial Timeout: 26 seconds
Drop Percentage Maximum: 3.0
Safe Harbor Message: Y
Hopper Level: 300
DNC Checking: CAMPAIGN AND SYSTEM
Time Zone Checking: ENABLED
Enter fullscreen mode Exit fullscreen mode

One thing people miss: available_only_ratio_tally. When set to N (the default), VICIdial counts agents who are mid-call as "available" for dial level calculations. That works at 25+ agents where statistics smooth out, but at 5-10 agents it causes massive over-dialing. Use the threshold approach — set the threshold to 10 so behavior switches automatically based on current agent count.

Problem 3: AMD Is Off

Answering Machine Detection is disabled by default. On a typical B2C list, 40-60% of connected calls reach voicemail. Without AMD, your agents sit through every "Hi, you've reached the Johnson family..." greeting. On a 50-agent floor, that's the equivalent of 12-20 phantom agents you're paying for but getting zero production from.

The math: if your agents cost $15/hour loaded and you have 50 of them, recovering 30% of machine time saves roughly $45,000/month in effective agent cost. AMD tuning isn't an optimization — it's a major P&L lever.

Recommended AMD settings:

initialSilence: 2500
greeting: 2000
afterGreetingSilence: 1100
totalAnalysisTime: 5000
minimumWordLength: 120
betweenWordsSilence: 50
maximumNumberOfWords: 4
silenceThreshold: 256
Enter fullscreen mode Exit fullscreen mode

afterGreetingSilence at 1100ms is the most sensitive parameter. Too low (< 900ms) and you misclassify slow-to-respond humans as machines. Too high (> 1400ms) and you misclassify short voicemail greetings as humans. maximumNumberOfWords at 4 catches most voicemail greetings (12+ words) while passing typical human answers ("Hello?" = 1 word, "Hello, who's this?" = 3 words).

Cell phones have more latency variance than landlines, which degrades AMD accuracy. If your lists are 80%+ cell phones (most consumer lists in 2026), expect 75-85% accuracy instead of 85-95%.

Monitor weekly:

  1. False HUMAN rate — What percentage of AMD-classified-HUMAN calls did agents immediately dispo as AM/MACH? Target: under 10%.
  2. False MACHINE rate — Listen to a sample of MACHINE-classified calls. How many were live humans? Target: under 5%.

Problem 4: Lists Are a Mess

Nobody talks about list management because it's boring. It's also the single biggest reason outbound operations underperform.

Lead Loading Gates

Every lead entering VICIdial should pass through:

  1. Format validation — Phone numbers cleaned to 10-digit. Required fields populated. State/time zone mapped.
  2. DNC scrubbing — National DNC, internal DNC, state-specific DNC. Pre-scrub before loading.
  3. Deduplication — Use DUPCAMP at minimum to prevent the same number across multiple lists in one campaign. For multi-campaign operations, dedup at the lead loading layer.
  4. Segmentation — Tag leads with source, age, geographic market, quality tier. Load into custom fields.

Lead Prioritization

Priority Lead Type Strategy
1 (Immediate) Fresh web/inbound leads Dedicated speed-to-lead campaign, < 5 min
2 (Same day) Scheduled callbacks Callback campaign, at scheduled time
3 (High) Fresh purchased leads (0-48 hours) Primary campaign, high hopper priority
4 (Standard) Active leads, 1st-3rd attempt Primary campaign, standard priority
5 (Standard) Active leads, 4th-6th attempt Recycle campaign
6 (Low) Aged leads 30-90 days As capacity allows

Control priority through hopper_priority on the API (1-99, 99 is highest), list ordering within campaigns, and dedicated campaigns for priority tiers.

Lead Recycling Strategy

First-pass contact rates run 5-15%. That means 85-95% of your leads need another attempt. The critical principle is time-of-day variance: if someone didn't answer at 10 AM, try them at 5 PM. If they didn't answer on Tuesday afternoon, try Thursday morning.

Disposition Recycle After Max Attempts Notes
NA (No Answer) 2 hours min 6 Vary by 4+ hours each attempt
B (Busy) 30 minutes 4 Same time window is fine
AM (Answering Machine) 4 hours 4 Shift to evening if daytime AM
DC (Disconnected) Never 1 Remove from all lists
NI (Not Interested) 30-60 days 2 Different agent, different angle
DNC Never 0 Add to internal DNC immediately

Kill Criteria

Every list has a point of diminishing returns. When contact rate drops below 2% on the current pass, cost per contact exceeds 3x your benchmark, you're on the 5th+ attempt for the majority of remaining leads, or the disposition mix is 80%+ NA/AM — stop dialing. Move remaining viable leads to aged-leads campaign and archive the rest.

Problem 5: DID Management Is Nonexistent

Local presence matters — the data is consistent across verticals:

  • Local area code caller ID: 8-14% answer rate
  • Toll-free (800/888): 4-7% answer rate
  • Out-of-area or unknown: 2-5% answer rate

Local presence doubles your effective contact rate compared to toll-free. On a 100,000-lead list, that's the difference between 10,000 contacts and 4,000 contacts with the same agents and the same script.

DID pool sizing:

  • 5-10 DIDs per target area code for moderate volume (< 500 calls/day to that area code)
  • 10-20 DIDs per target area code for high volume (500-2,000 calls/day)
  • Per-DID daily cap of 75-100 outbound calls to avoid carrier analytics flags
  • 20-30% quarterly replacement rate — DIDs get flagged and need rotation

For a 50-agent operation calling nationally across 30 area codes, plan for 150-300 DIDs. DID management at scale is a real operational function, not a set-and-forget configuration.

Every DID needs A-level STIR/SHAKEN attestation from your SIP provider. Test by calling yourself on AT&T, Verizon, and T-Mobile handsets. If you see "Spam Likely," something is broken. Pull per-DID answer rates weekly — a sudden drop means the DID is flagged. Pull it immediately and rest for 30-60 days.

Problem 6: Agents Disposition Wrong

Your entire downstream operation — recycling rules, KPI calculations, list management, callback scheduling — depends on accurate disposition codes.

Standard outbound sales disposition set:

Code Meaning Action
SALE Closed sale / set appointment Push to CRM, commission trigger
CB Callback requested Schedule in callback campaign
NI Not interested Recycle in 30-60 days
NQ Not qualified Remove from campaign
DNC Do not call Add to internal DNC immediately
NA No answer Auto-recycle per rules
AM Answering machine Auto-recycle per rules
B Busy Auto-recycle per rules
HANGUP Prospect hung up Recycle in 7+ days
WRONG Wrong number/person Remove from campaign
DC Disconnected Remove from all lists
XFER Transferred to closer Track transfer outcome

Common mistakes:

  1. Dispositioning as NI when the prospect didn't actually answer — poisons your NI recycle pool
  2. Using NA for everything that isn't a sale — if NA exceeds 60% of dispositions, agents are lazy with codes
  3. Not dispositioning DNC requests correctly — this is a compliance failure, not optional

Audit disposition accuracy weekly. Pull 20-30 random call recordings per agent and compare actual outcomes to disposition codes. Agents under 90% accuracy need retraining. Set agent_pause_codes_active to FORCE so you also know where break time is going.

The KPI Framework

Daily (Check Every Day)

KPI Target What It Tells You
Contact Rate 8-15% List + DID quality
Conversion Rate 8-25% (vertical-dependent) Agent + script quality
Agent Utilization 35-55% Dialer efficiency
Abandon Rate < 2.5% Compliance health
Dials Per Agent Hour 30-80 Overall throughput
Cost Per Lead Vertical-dependent Bottom-line efficiency

Weekly

KPI Target What It Tells You
Conversion by Agent Per-agent comparison Coaching and staffing decisions
List Penetration Track over time List lifecycle management
AMD Accuracy > 85% Agent time optimization
DID Answer Rate > 6% average DID health
Callback Conversion > 60% contact, > 15% convert Callback effectiveness

If your agent utilization is under 35%, your dialer configuration is the problem. If your contact rate is under 6%, your lists or DIDs are the problem. If your conversion rate is below vertical benchmarks, it's agents or scripts.

Scaling: The Inflection Points

10-25 agents: Single server, 1-2 campaigns, manual management. Build disposition discipline and KPI tracking from day one — both are 10x harder to fix later.

25-75 agents: Multi-campaign architecture becomes necessary. Dedicated QA function. List management needs a defined process. One supervisor per 10-15 agents. DID pool grows to 50-150 numbers.

75-200 agents: VICIdial cluster is mandatory beyond ~100 agents. Typical: 1 web/database server + 2-4 telephony servers. Database optimization becomes important. SIP trunk diversity — split across 2-3 providers. Compliance becomes a formal program.

200-500 agents: Dedicated IT team for VICIdial infrastructure. Formal workforce management. Multi-site or remote agent deployment with WebRTC. Database replication for reporting. Dedicated recording storage (500 agents generate 50-100GB of recordings per day). Agent attrition management becomes strategic — at 500 agents with 60-100% annual turnover, you're hiring 25-40 new people per month.

Compliance: The Non-Negotiables

Drop Percentage Maximum: 3.0
Adaptive Dropped Percentage: 2.5
Safe Harbor Message: Y
DNC Checking: CAMPAIGN AND SYSTEM
Time Zone Checking: ENABLED
Recording: ALL
Agent DNC button: ENABLED
Enter fullscreen mode Exit fullscreen mode

State-specific gotchas: Florida limits 3 calls per 24 hours (8 AM-8 PM), California requires written consent for automated cell calls, Texas requires state registration at $10,000/violation. Check every target state.

These problems — single-campaign architecture, conservative dial settings, AMD disabled, messy lists, ignored DIDs, sloppy dispositions — account for about 80% of the performance gap between VICIdial floors that print money and ones that struggle to break even. All fixable without new hardware or a platform switch.

For the full playbook including agent onboarding workflows, script frameworks, advanced optimization tactics, and scaling infrastructure details, see ViciStack's outbound sales guide.


Originally published at https://vicistack.com/blog/vicidial-outbound-sales/

Top comments (0)