VICIdial's campaign detail screen has over 170 configurable fields. Most admins change three of them, leave the rest at defaults, and wonder why agents sit idle 40% of the shift.
Default VICIdial is tuned conservatively — designed not to break, not to perform. On a 50-agent campaign running defaults, expect about 28-32 minutes of agent talk time per hour. At $15/hour loaded cost, that's $300/hour in wasted capacity across the floor — $12,000 per week.
The fix isn't one magic setting. It's 15 changes that interact with each other in non-obvious ways. VICIdial's predictive algorithm runs as a Perl script (AST_VDadapt.pl) that recalculates the dial level for each campaign every 15 seconds based on drop rates, agent availability, connection rates, and average talk time. The settings on this list are the inputs to that calculation.
They break into four groups: core dial level controls, hopper and queue configuration, AMD and call handling, and agent performance settings.
Group 1: Core Dial Level Controls
Setting #1: adaptive_dl_level (Adaptive Maximum Dial Level)
Admin path: Admin > Campaigns > Detail > Adaptive Maximum Dial Level
This sets the ceiling — the maximum number of lines the adaptive algorithm is allowed to dial per agent. It does not set the actual dial level. That distinction trips up more admins than any other setting.
When you set it to 3.0 (default), you're telling the algorithm: "Dial up to 3 lines per agent, but figure out the right number based on current conditions." The algorithm ramps up and down within that ceiling every 15 seconds.
The problem with 3.0: For campaigns under 15 agents, a ceiling of 3.0 is too low. The algorithm needs headroom to compensate for statistical volatility — a single long call can create a temporary surplus of available agents, and the algorithm needs room to dial ahead.
Recommended values:
| Team Size | adaptive_dl_level | Why |
|---|---|---|
| 5-10 | 4.0-5.0 | Small teams need higher ceilings for variance |
| 11-25 | 3.0-4.0 | Medium teams start stabilizing |
| 26-50 | 2.5-3.5 | Large teams produce predictable patterns |
| 51-100 | 2.0-3.0 | Very large teams need tighter control |
| 100+ | 1.5-2.5 | Small changes produce large volume swings |
Think of it as a safety valve, not a performance dial. High enough for the algorithm to do its job during volatile periods, low enough that a contact rate spike doesn't blow through your abandon rate target.
Setting #2: adaptive_dropped_percentage (Drop Percentage Limit)
Admin path: Admin > Campaigns > Detail > Drop Percentage Limit
The TCPA/FTC ceiling is 3% on a 30-day rolling basis. Don't set this to 3.0 — the algorithm will oscillate around it and regularly spike above in short windows.
| Compliance Requirement | Recommended | Buffer |
|---|---|---|
| FTC/TCPA 3% rule | 1.5-2.0 | 50-33% safety margin |
| State-level 1% rules | 0.5-0.8 | 50-20% margin |
| Zero-tolerance (B2B, financial) | 0.5 | Minimal drops |
Setting to 1.5 is the sweet spot for most US-based outbound campaigns. The algorithm checks drop rates across five time windows (since midnight, past hour, past 30 min, past 5 min, past 1 min) and uses the most conservative value.
Monitor live:
SELECT campaign_id, drops_today, calls_today,
ROUND((drops_today / calls_today) * 100, 2) AS drop_pct
FROM vicidial_campaign_stats
WHERE campaign_id = 'YOUR_CAMPAIGN';
Setting #3: auto_dial_level + Dial Method
Critical distinction: If your dial method is RATIO, the auto_dial_level is the only dial level — fixed, no adaptation. If it's ADAPT_TAPERED, ADAPT_HARD_LIMIT, or ADAPT_AVERAGE, it's just the starting point.
Stop using RATIO for production campaigns. Switch to ADAPT_TAPERED for 90% of campaigns. It starts conservative early in the shift (when you have time to recover averages) and tightens as the shift progresses.
| Method | Best For |
|---|---|
| RATIO | Testing, very small teams (<5), strict 1:1 compliance |
| ADAPT_HARD_LIMIT | Strict compliance environments |
| ADAPT_TAPERED | Most production campaigns |
| ADAPT_AVERAGE | High-volume campaigns with large teams |
Starting auto_dial_level values:
| Scenario | Value |
|---|---|
| New campaign, unknown contact rate | 1.0 |
| Established, 30-40% contact rate | 1.5-2.0 |
| Clean list, 50%+ contact rate | 1.0-1.5 |
| Aged list, <20% contact rate | 2.5-3.0 |
| Callback/hot lead campaign | 1.0 |
Set ADAPT_TAPERED, starting auto_dial_level at 1.5, adaptive_dl_level at 3.5, and adaptive_dropped_percentage at 1.5. The algorithm finds the right level within 10-15 minutes.
Group 2: Hopper and Queue Configuration
Setting #4: hopper_level
The hopper is VICIdial's lead staging queue. If it empties, agents sit idle no matter how perfect everything else is.
Auto-hopper formula:
hopper_level = agents * dial_level * (60 / dial_timeout) * multiplier
Default multiplier of 1 gives exactly one cycle of leads. Set auto_hopper_multiplier to 2 for 25+ agent campaigns. This doubles the buffer. For manual control, set hopper_level to at least 4x agents times dial level.
Setting #5: dial_timeout
Default 26 seconds means 5-6 full ring cycles on numbers that never answer. With a 60% no-answer rate, you burn 15.6 seconds of trunk time per unanswered call. Cut to 18 seconds: 10.8 seconds wasted — 30% reduction.
| Scenario | dial_timeout |
|---|---|
| General outbound (US) | 18-22 seconds |
| B2B daytime | 20-24 seconds |
| Mobile-heavy lists | 16-20 seconds |
| Callback campaigns | 22-26 seconds |
| High-velocity cold calling | 15-18 seconds |
The 23-second trick: Most carrier voicemail picks up after 24-25 seconds. Setting timeout to 23 hangs up just before voicemail answers — useful when AMD is off.
Setting #6: available_only_ratio_tally
When N (default), VICIdial counts mid-call agents as "available." With 50 agents, statistics smooth this out. With 5 agents: the dialer places 10 calls because all 5 are non-paused, 4 are in conversations, 4 calls connect to live people, only 1 agent is free, 3 get abandoned.
Use the threshold approach: available_only_tally_threshold set to 10. Below 10 agents, dial only for actually-available agents. Above 10, use predictive model.
Setting #7: dial_level_difference_target
Tells the algorithm whether to target agents waiting (negative) or calls waiting (positive). Default 0 targets equilibrium.
| Priority | Value |
|---|---|
| Compliance-first | -1 to -2 |
| Balanced (recommended) | 0 |
| Throughput-first | 1 |
Leave at 0 for most campaigns.
Group 3: AMD and Call Handling
Setting #8-9: AMD Type and Configuration
Enable AMD by routing through extension 8369 (AMD enabled). Then tune /etc/asterisk/amd.conf:
| Parameter | Default | Recommended | What It Does |
|---|---|---|---|
| initial_silence | 2500 | 2000 | ms of silence before classifying as machine |
| greeting | 1500 | 1200 | ms of continuous speech indicating greeting |
| after_greeting_silence | 800 | 300 | ms of silence after greeting to confirm machine |
| total_analysis_time | 5000 | 3500 | Max ms to analyze before deciding |
| maximum_number_of_words | 3 | 3 | Words before classifying as machine |
; /etc/asterisk/amd.conf
[general]
initial_silence=2000
greeting=1200
after_greeting_silence=300
total_analysis_time=3500
min_word_length=120
between_words_silence=50
maximum_number_of_words=3
silence_threshold=256
After changes, reload Asterisk:
asterisk -rx "module reload res_speech.so"
asterisk -rx "core reload"
Reducing total_analysis_time from 5000ms to 3500ms gets live calls to agents faster. The 5-second default means live humans hear dead air and hang up.
Warning: AMD tuning is carrier-dependent. Test with known voicemail boxes and live answers before rolling to production.
Setting #10: AMD Send to Action (amd_send_to_vmx)
When AMD detects a machine:
- N: Call dropped, dispositioned as answering machine
- Y: Pre-recorded voicemail message played
Voicemail drops generate 2-8% callback rates. For campaigns wanting every touchpoint, enable this. Upload audio through Admin > Audio Store (WAV: PCM Mono, 16-bit, 8kHz or GSM: 8-bit, 8kHz).
Setting #11: Wait For Silence
Campaign-level AMD override. Format: milliseconds,iterations.
| Campaign Type | Value |
|---|---|
| B2C mobile-heavy | 2000,2 |
| B2C landline-heavy | 2500,2 |
| B2B | 1500,2 |
| Mixed (general-purpose) | 2000,2 |
Second parameter (iterations) should almost always be 2. Setting 1 produces too many false positives; 3 lets too many machines through.
Group 4: Agent Performance Settings
Setting #12: next_agent_call
Which agent gets the next connected call:
| Method | Best For |
|---|---|
| random | Simple, default |
| longest_wait_time | Most outbound campaigns — fairest distribution |
| campaign_rank | Skills-based routing for closer campaigns |
Use longest_wait_time for most outbound. Agent who's been idle longest gets the next call — even utilization, fewer complaints. For skills-based routing, assign campaign ranks (9 = top, 1 = trainee) and use campaign_rank.
Setting #13: wrapup_seconds
Default 0 means the next call fires immediately after disposition. Agents skip notes, mis-disposition, and burn out.
| Campaign Type | Value |
|---|---|
| Simple disposition | 5-10 seconds |
| CRM note entry required | 15-25 seconds |
| Complex data entry | 30-45 seconds |
Set to 10 and combine with forced pause codes. If agents need more time, they pause with a specific code.
Setting #14: agent_pause_codes_active
Set to FORCE. Always. Without it, you have zero visibility into why agents aren't taking calls.
SELECT sub_status, COUNT(*) AS pause_count,
SUM(pause_sec) AS total_seconds,
ROUND(AVG(pause_sec), 1) AS avg_seconds
FROM vicidial_agent_log
WHERE campaign_id = 'YOUR_CAMPAIGN'
AND event_time >= CURDATE()
GROUP BY sub_status
ORDER BY total_seconds DESC;
Standard codes for every campaign: BREAK, LUNCH, BIO (restroom), TRAIN, TECH, ADMIN, MEET.
Setting #15: calls_per_second (server level)
Controls how fast VICIdial fires outbound calls at the server level. At 500 agents across multiple telephony servers, this prevents any single server from overwhelming your SIP trunks. Set based on your trunk provider's capacity and distribute load across servers in your cluster.
The Tuning Workflow
Don't change all 15 at once. Follow this process:
- Make one change
- Monitor for 2-4 hours
- Compare key metrics (talk time per hour, drop rate, agent utilization)
- Roll back if performance drops
- Move to the next setting
The algorithm recalculates every 15 seconds — give it time to stabilize before declaring something isn't working.
For the complete deep-dive including the math behind the adaptive algorithm, per-setting configuration guides, and carrier-specific AMD profiles, see ViciStack's predictive dialer settings guide.
Originally published at https://vicistack.com/blog/vicidial-predictive-dialer-settings/
Top comments (0)