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:
-
DID receives the call. Asterisk matches the dialed number to a DID entry in VICIdial's
vicidial_inbound_didstable. - 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.
- Inbound group places the call in queue. Hold music plays. Queue position announcements fire. The queue engine evaluates which agents are eligible.
- 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
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.
- Create inbound groups per skill: SALES_EN, SALES_ES, SUPPORT_BILLING, SUPPORT_TECHNICAL
- In campaign settings, set Closer Campaigns to list which inbound groups agents can receive from
- 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
- Create inbound groups per skill. SALES_EN, SALES_ES, SUPPORT_BILLING, SUPPORT_TECHNICAL.
- Assign agents to inbound groups. Each agent selects (or is assigned via campaign) which groups they handle.
- 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
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
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
- IVR offers language selection: "For English, press 1. Para Espanol, oprima 2."
- Each option routes to a language-specific inbound group: SALES_EN, SALES_ES
- Staff each with appropriately skilled agents
- 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)
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
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;
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;
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)