DEV Community

Jason Shouldice
Jason Shouldice

Posted on • Originally published at vicistack.com

Why Your VICIdial Inbound Queue Loses Calls (And How to Fix the 5 Worst Settings)

A potential customer calls your sales line. They navigated your IVR, pressed 2 for Sales, landed in a queue. They hear dead silence for 8 seconds. Then a ring that nobody picks up. Then more silence. After 45 seconds they hang up and you've got another abandoned call in the log. The lead is gone.

This happens because VICIdial's default inbound group ships with no hold music, no queue position announcement, no overflow route, and no after-hours handling. If you pointed a DID at an inbound group and didn't touch the settings, you're running a skeleton setup that actively loses calls.

VICIdial's inbound engine is genuinely powerful -- skill-based routing, weighted ring strategies, queue priority by DID, blended agents, overflow cascades, real-time queue monitoring. But none of it works unless you configure it. And VICIdial gives you roughly 80 settings per inbound group with minimal documentation about what most of them do.

How the Inbound Call Flow Works

Before fixing anything, understand the path a call takes:

  1. DID receives the call. Asterisk matches the dialed number to a DID entry in VICIdial's vicidial_inbound_dids table.
  2. DID routes to an inbound group (or IVR). For direct-to-queue routing, this is an inbound group. For menu-driven routing, it's an IVR that eventually routes to inbound groups.
  3. Inbound group places the call in queue. Hold music plays. Queue position announcements fire. The queue engine evaluates which agents are eligible.
  4. Agent is selected and connected. Based on ring strategy, VICIdial selects an agent, rings their phone, connects the call, and pops the caller's information.

Creating an Inbound Group That Actually Works

Navigate to Admin > Inbound > Add a New In-Group. Here are the settings that matter:

Field Example Purpose
Group ID SALES_QUEUE Unique ID, no spaces, max 20 characters. Make it descriptive -- you'll reference it everywhere.
Group Name Sales Inbound Queue Human-readable label for reports
Next Agent Call longest_wait_time Ring strategy (covered below)
Voicemail vm-salesbox Voicemail box for overflow/after-hours
No Agent No Queue N Critical. Y = disconnect callers when no agents are logged in. Almost never what you want.
After Hours Action MESSAGE What happens outside business hours
Call Time ID 9am-6pm-EST Defines business hours

The Group ID matters. You'll reference it in DID routing, IVR config, closer campaign settings, and SQL queries. Use naming that scales: SALES_QUEUE, SUPPORT_T1, SUPPORT_T2, BILLING_MAIN. Do not use INBOUND1 -- that tells you nothing when troubleshooting at 3 AM.

Problem 1: Dead Silence in the Queue

The default inbound group has no hold music configured. Callers hear nothing and assume the call dropped.

Upload hold music files to /var/lib/asterisk/mohmp3/ in 8kHz 16-bit mono WAV format. For separate music per queue, define a custom MOH class in /etc/asterisk/musiconhold.conf:

[sales_hold]
mode=files
directory=/var/lib/asterisk/moh/sales
sort=random
Enter fullscreen mode Exit fullscreen mode

Reload with asterisk -rx "moh reload" and set the inbound group's On Hold Music field to your class name.

Hold music tips: keep the loop under 90 seconds. Avoid vocals -- they sound garbled over phone codecs. Match your brand (law firm: no pop music). License your music -- using copyrighted music on hold is technically a public performance.

Problem 2: No Queue Position Announcements

Callers want to know where they are and how long they'll wait. Without announcements, they assume nobody's coming.

Set Hold Time Option to ANNOUNCE_POSITION and Hold Time Option Seconds to 30-60. VICIdial tells callers "You are caller number X in the queue" at that interval.

Other options worth knowing:

Option Behavior
NONE Hold music only
ANNOUNCE_POSITION "You are caller number X"
ANNOUNCE_WAIT_TIME "Estimated wait time is X minutes"
ANNOUNCE_POSITION_AND_WAIT Both position and wait time
CALLERID_CALLBACK Offers the caller a callback instead of waiting

The CALLERID_CALLBACK option is powerful for high-volume queues. The caller presses a key to request a callback. Their queue position is maintained. When an agent opens up, VICIdial dials them back. Abandonment rates drop dramatically.

Problem 3: No Agent No Queue = Y

When set to Y, if no agents are logged into the inbound group when a call arrives, the caller gets disconnected. Fast busy. Gone.

Set it to N. Configure an after-hours route or voicemail so callers get captured. Better alternatives:

  • Route to voicemail -- capture the caller's information
  • Route to IVR -- self-service options or message
  • Route to external number -- answering service
  • Play a message with hours info and disconnect

Problem 4: Wrong Ring Strategy for Your Team Size

The Next Agent Call setting determines how VICIdial picks which agent gets the next call. This single setting has more impact than almost anything else.

longest_wait_time -- Routes to the agent idle the longest. Best for general queues with 10+ agents. Even distribution, rewards idle agents. In blended environments, agents who just finished outbound calls have a recent last_call_time, so they receive fewer inbound calls. This is usually correct behavior.

ring_all -- Every available agent's phone rings simultaneously. First to pick up gets the call. Good for small teams under 10 where speed-to-answer is critical. Does not scale -- 50 agents means 50 simultaneous SIP INVITEs per inbound call, which hammers your Asterisk server.

fewest_calls -- Routes to agent with lowest call count this session. Only useful when you need provably equal distribution (union shops, regulated environments). Penalizes efficient agents: a fast agent who handles calls in 3 minutes gets the same count as a slow agent taking 15 minutes per call.

random -- Almost never appropriate. Some agents get 3 calls in a row while others sit idle for 20 minutes.

fewest_calls_campaign -- Same as fewest_calls but counts across the entire campaign. Relevant for blended campaigns.

Operation Type Recommended Strategy
Sales inbound (general) longest_wait_time
Small team (<10) ring_all
Support tier 1 longest_wait_time
Blended inbound + outbound longest_wait_time
Compliance-sensitive fewest_calls

Problem 5: No Overflow Route

Without overflow configuration, a caller who hits a full queue sits there forever or hangs up. Set up multi-stage overflow:

Stage Trigger Action
Queue entry Caller enters queue Welcome message, hold music
30 seconds First announcement "You are caller number X"
60 seconds Second announcement "Estimated wait: X minutes. Press 1 for callback."
120 seconds Overflow stage 1 Route to wider agent pool
180 seconds Overflow stage 2 "Press 1 for callback, press 2 for voicemail"
240 seconds Final overflow Route to voicemail group

Chain multiple inbound groups with different Hold Time Option Seconds values. Each group's Hold Recall Transfer points to the next stage.

Skill-Based Routing

Not all agents are equal. Some speak Spanish. Some are licensed in specific states. VICIdial implements skills through multiple inbound groups and agent assignments.

  1. Create inbound groups per skill: SALES_EN, SALES_ES, SUPPORT_BILLING, SUPPORT_TECHNICAL
  2. In campaign settings, set Closer Campaigns to list which inbound groups agents can receive from
  3. Use agent rank within inbound groups (Admin > Users > Agent > Inbound Group Rank). Rank 9 agents get calls before rank 1 agents.

This enables tiered routing: best closers are rank 9 and get calls first. Newer agents are rank 3 -- only when seniors are busy. Overflow agents from other departments are rank 1 -- last resort.

Blended Agents: The Highest-ROI Configuration

A blended agent handles both inbound and outbound on the same campaign. When no inbound calls are queued, they make outbound calls. When an inbound call arrives, they get pulled off outbound.

Critical settings:

Setting Value Why
Campaign Allow Inbound Y Lets agents take inbound
Closer Campaigns SALES_EN SALES_ES Space-separated inbound group IDs
Closer Default Blended 1 Forces all agents to blend
Inbound Queue Priority 99 Inbound beats outbound -- a waiting caller invested time
Available Only Ratio Tally Y Only count available agents for dial ratio. Without this, VICIdial counts agents on inbound calls and over-dials.

Common blended issues:

Issue Cause Fix
Agents never get outbound Inbound volume too high Add dedicated inbound agents
Outbound drops during inbound spikes Available Only Ratio Tally = N Set to Y
Queue times spike during dial bursts Agents locked in outbound calls Reduce dial level, set queue priority to 99

After-Hours Routing

Every inbound group needs an after-hours plan. Set up business hours under Admin > Call Times, associate with your inbound group, then configure:

Setting Value
After Hours Action MESSAGE
After Hours Message Filename after-hours-sales
After Hours Voicemail vm-salesbox

Plan holiday routing at the beginning of each year. Nothing is more embarrassing than phones ringing into a dead queue on Christmas because nobody updated the holiday list.

The often-missed step: configure someone to actually check and return voicemails. VICIdial stores the voicemail, but without a process to review and call back, voicemails are just a polite way to lose leads. Morning task for first shift: pull all after-hours voicemails and schedule callbacks.

Monitoring: The Numbers to Watch

The real-time report at Reports > Real-Time Report is your inbound command center.

  • Calls Waiting > Agents Available: You're understaffed right now. Pull outbound agents or activate overflow.
  • Longest Wait > 120 seconds: Queue is backing up. Act immediately.
  • Abandoned % > 5%: Callers are giving up. Hold experience needs work.

ViciStack configures inbound groups tuned to your specific call volume, agent count, and routing requirements from day one. The inbound engine in VICIdial is powerful -- it just doesn't do anything useful out of the box.

Get a free audit of your inbound setup -- we respond within 5 minutes.

Skill-Based Routing in Detail

VICIdial doesn't have a dedicated "skills" database. Instead, skill-based routing works through multiple inbound groups, agent group assignments, and closer campaign selection.

The Model

  1. Create inbound groups per skill. SALES_EN, SALES_ES, SUPPORT_BILLING, SUPPORT_TECHNICAL.
  2. Assign agents to inbound groups. Each agent selects (or is assigned via campaign) which groups they handle.
  3. Route calls to the correct group. Your IVR routes based on caller selection, DID, or caller ID.

Configuration Steps

Step 1: Create skill-specific inbound groups at Admin > Inbound > Add a New In-Group.

Step 2: In campaign settings, set Campaign Allow Inbound = Y and Closer Campaigns = space-separated list of inbound group IDs this campaign's agents can receive.

Step 3: Agent-level selection. Two approaches:

  • Manager-controlled: Set Closer Default Blended = 1. All agents on the campaign take calls from all listed groups. No opt-out.
  • Agent-controlled: Set Closer Default Blended = 0. Agents check which groups they want during login. Risk: agents deselect busy queues to avoid work.

Recommended: Manager-controlled for core skills, supervisor overrides for temporary adjustments.

Agent Rank Within Groups

Navigate to Admin > Users > [Agent] > Inbound Group Rank. Rank 0-9 per group. Higher rank = preferred for that group. When Inbound Group Rank = Y in the inbound group settings, all rank-9 agents are evaluated before rank-8, and so on.

This enables tiered routing without separate groups:

  • Best closers: rank 9, get calls first
  • Newer agents: rank 3, only when seniors are busy
  • Overflow from other departments: rank 1, last resort

DID to Inbound Group Mapping

Every inbound operation starts with mapping phone numbers to queues. Navigate to Admin > Inbound > DIDs > Add a New DID:

Field Example Purpose
DID Extension 8005551000 Phone number, no dashes
DID Description Main Sales Line Human-readable label
DID Route IN_GROUP Where to send the call
In-Group ID SALES_EN Which queue receives the call
DID Active Y Whether this DID routes calls

Route options: IN_GROUP (direct to queue), IVR (menu-driven routing), PHONE (direct to extension), VOICEMAIL, EXTEN (custom Asterisk extension).

For most operations, DIDs route to either an IVR for menu-driven routing or directly to an inbound group for dedicated lines.

Priority Routing: Not All Calls Are Equal

A returning customer on your premium support line should not wait behind 15 calls from a general inquiry DID.

Priority by DID

Different DIDs can route to the same inbound group with different priority levels:

DID: 800-555-1000 (General Sales)     > SALES_EN, Priority 0
DID: 800-555-2000 (Premium Sales)     > SALES_EN, Priority 50
DID: 800-555-3000 (VIP Line)          > SALES_EN, Priority 99
Enter fullscreen mode Exit fullscreen mode

Same agent pool. VIP callers jump the queue.

Priority by Caller ID

Route based on the caller's phone number. Give priority to known customers, route area codes to regional teams, block known spam:

CID Pattern Action Destination Priority
212XXXXXXX ROUTE SALES_NY 10
310XXXXXXX ROUTE SALES_LA 10
DEFAULT ROUTE SALES_EN 0

Priority Stacking

Priorities from DID, IVR selection, and CID matching stack. A known customer calling your premium line who selects "urgent" in the IVR accumulates combined priority, putting them well ahead of any other caller.

Voicemail Setup

Voicemail is your safety net. When queues overflow, after-hours calls come in, or no agents are available, voicemail captures the lead.

Configure voicemail in Asterisk's voicemail.conf:

8300 => 1234,Sales Voicemail,sales@company.com,,tz=eastern|attach=yes|saycid=yes
Enter fullscreen mode Exit fullscreen mode

Reload: asterisk -rx "voicemail reload". Link to the inbound group by setting the Voicemail field and After Hours Voicemail field.

The missed step everyone skips: Configure someone to actually check and return the voicemails. Create a morning task for first shift -- pull all overnight voicemails, schedule callbacks for each one. Without this process, voicemails are just a slightly polite way to lose leads.

Advanced Configuration Patterns

Multi-Language Routing

  1. IVR offers language selection: "For English, press 1. Para Espanol, oprima 2."
  2. Each option routes to a language-specific inbound group: SALES_EN, SALES_ES
  3. Staff each with appropriately skilled agents
  4. Configure overflow from SALES_ES to SALES_EN with longer wait (bilingual customers may accept English if Spanish wait is too long)

Geographic Routing

Route callers to regional teams:

DIDs: 212-xxx > SALES_NORTHEAST
DIDs: 310-xxx > SALES_WEST
DIDs: 800-xxx > SALES_NATIONAL (overflow from all regions)
Enter fullscreen mode Exit fullscreen mode

Regional agents have local market knowledge. National group handles overflow and after-hours.

Tiered Support Escalation

Tier Group Overflow
Tier 1 SUP_T1 (general support) After 180s > SUP_T2
Tier 2 SUP_T2 (senior support) After 300s > SUP_T3
Tier 3 SUP_T3 (engineering) After 600s > Voicemail with page

Most calls resolve at Tier 1. Complex issues escalate. Each tier has its own hold music, announcements, and SLA thresholds.

Time-of-Day Routing

Route calls differently based on shift without changing DID config. Create call time definitions for each shift (morning, afternoon, evening), use filter routing or AGI to evaluate current time and select the appropriate inbound group. Staff each group with the agents working that shift.

Useful for operations splitting between in-house and remote agents, or domestic and offshore teams.

Queue Alerts

VICIdial can alert managers when queue conditions exceed thresholds. In the inbound group settings:

Setting Value Purpose
Queue Calls Count Alert 10 Alert when 10+ calls waiting
Queue Seconds Alert 120 Alert when any call waited 120+ seconds
Alert Email manager@example.com Where to send alerts

These alerts depend on VICIdial's reporting refresh cycle -- they're not instantaneous. For operations where conditions change rapidly, designate a supervisor to monitor the real-time report continuously.

Voicemail Groups

Configure voicemail in Asterisk's voicemail.conf:

8300 => 1234,Sales Voicemail,sales@company.com,,tz=eastern|attach=yes|saycid=yes
8301 => 1234,Support Voicemail,support@company.com,,tz=eastern|attach=yes|saycid=yes
Enter fullscreen mode Exit fullscreen mode

Reload: asterisk -rx "voicemail reload". Link to inbound groups via the Voicemail and After Hours Voicemail fields.

The attach=yes option emails the recording as a WAV attachment -- make sure your Asterisk server has a working MTA (sendmail/postfix).

For CRM integration, monitor the voicemail spool directory (/var/spool/asterisk/voicemail/default/XXXX/INBOX/) with a script that creates leads or tasks when new messages arrive.

After-Hours Routing Detail

Set up business hours at Admin > Call Times. Leave Saturday/Sunday blank for closed. Add holiday exceptions -- Christmas, Thanksgiving, etc.

Associate the call time with your inbound group, then configure after-hours behavior:

Setting Value
After Hours Action MESSAGE
After Hours Message Filename after-hours-sales
After Hours Voicemail vm-salesbox

Plan your holiday schedule at the start of each year. Nothing is more embarrassing than phones ringing into a dead queue on Christmas Day because nobody updated the holiday list.

Custom Real-Time Monitoring

For dashboards or external monitoring integration, query the live tables directly:

SELECT campaign_id as inbound_group,
       COUNT(*) as calls_waiting,
       MAX(TIMESTAMPDIFF(SECOND, call_time, NOW())) as longest_wait
FROM vicidial_auto_calls
WHERE call_type = 'IN' AND status = 'LIVE'
GROUP BY campaign_id;
Enter fullscreen mode Exit fullscreen mode

For SLA tracking -- percentage of calls answered within 30 seconds:

SELECT campaign_id,
       COUNT(*) as total_calls,
       SUM(CASE WHEN queue_seconds <= 30 THEN 1 ELSE 0 END) as within_sla,
       ROUND(SUM(CASE WHEN queue_seconds <= 30 THEN 1 ELSE 0 END) / COUNT(*) * 100, 1) as sla_pct
FROM vicidial_closer_log
WHERE call_date >= CURDATE()
GROUP BY campaign_id;
Enter fullscreen mode Exit fullscreen mode

Key Database Tables for Debugging

When inbound routing isn't working and you need to figure out why:

Table Purpose
vicidial_inbound_dids Maps phone numbers to routing destinations
vicidial_inbound_groups Inbound group configuration -- ring strategy, hold music, overflow
vicidial_closer_log Every inbound call with timestamps, queue time, handle time, disposition
vicidial_auto_calls Active calls currently in queue or being handled
vicidial_live_inbound_agents Agents currently logged into inbound groups

If calls aren't reaching agents, check vicidial_auto_calls for calls stuck in LIVE status. If agents aren't receiving calls, check vicidial_live_inbound_agents to confirm they're registered in the correct groups with the right status.

Holiday Routing

VICIdial supports holiday-specific routing through the Call Time system. Add holiday dates with custom start/stop times (or 0000/0000 for closed all day). The after-hours routing automatically kicks in on holidays.

Plan holidays at the beginning of each year. Create a calendar of dates and enter them all at once. Review in November and add any you missed. Some operations also close for company events, training days, or weather emergencies -- use the same mechanism for ad-hoc closures.

For operations that run reduced hours on holidays (Christmas Eve: 8 AM - 1 PM), set the holiday's start and stop times accordingly. The rest of the day uses after-hours routing automatically.

Common Inbound Mistakes

Blended campaigns with Available Only Ratio Tally = N. Without this setting, VICIdial counts agents currently on inbound calls when calculating how many outbound calls to place. This leads to over-dialing and dropped calls. When an inbound spike pulls agents away, the dialer has already placed too many outbound calls with nobody to answer them. Always set to Y for blended campaigns.

Setting Inbound Queue Priority to 0. This means outbound and inbound compete equally. A caller actively waiting in queue loses to an outbound lead who doesn't know you're about to call them. Set to 99. Inbound callers have already invested time and attention.

Not testing with real call volume. A queue that works perfectly with 2 test calls falls apart with 15 simultaneous real calls. The ring strategy behaves differently under load, hold music timing changes when multiple streams are playing, and queue announcements overlap if intervals are too short.

Ignoring queue time metrics. If your average queue time is 45 seconds but you're not tracking it, you won't notice when it creeps to 90 seconds over a few weeks as agent count drops or inbound volume grows. Set up SLA tracking from day one and review weekly.

Putting It Together

The inbound engine in VICIdial is genuinely powerful. It just doesn't do anything useful out of the box. Configure it properly and it handles everything from simple sales queues to multi-language, multi-tier support operations with priority routing and automatic overflow.

Originally published at https://vicistack.com/blog/vicidial-inbound-setup/

Top comments (0)