← All Tutorials

How to Change Campaign Dial Speed in ViciDial

ViciDial Administration Intermediate 13 min read #88

Master dial speed adjustments for ViciDial campaigns to optimize agent productivity, improve call connection rates, and reduce idle time in your production Asterisk environment.

Prerequisites

Before modifying campaign dial speed settings, ensure you have:

Understanding Campaign Dial Speed in ViciDial

Dial speed (also called "dial ratio" or "calls per agent") determines how many calls ViciDial will attempt to place for each available agent in a campaign. This setting is critical for both inbound and outbound calling operations.

What Dial Speed Controls

The dial speed parameter governs:

Common Dial Speed Values

1.0 - 1.2 (Conservative)

1.3 - 1.5 (Moderate)

1.6 - 2.5 (Aggressive)

2.5+ (Power dialing)

Accessing the Admin Panel

Via Web Interface

Launch your browser and navigate to your ViciDial admin URL:

http://your-vicidial-ip/vicidial/admin.php

Log in with your administrator credentials (typically the cron user or administrative account).

Click on Campaigns from the main menu, then select your target campaign from the list.

Locating the Dial Speed Setting

In the Campaign Edit screen, locate the Dial Speed field. In most ViciDial versions, this appears in the main campaign settings section, often labeled:

The field typically accepts decimal values between 0.1 and 5.0.

Method 1: Changing Dial Speed via Web Admin Panel

This is the most user-friendly approach for most administrators.

Step-by-Step Process

  1. Navigate to Campaigns → Select Your Campaign
  2. Scroll to the campaign configuration section
  3. Locate the Dial Speed field
  4. Enter your desired dial speed value (e.g., 1.5)
  5. Click SAVE or UPDATE button
  6. Confirm the change was applied

Example Configuration

Campaign: SALES_OUTBOUND_Q2
Current Dial Speed: 1.2
New Dial Speed: 1.8
Active Agents: 25
Expected simultaneous calls: 45 (25 agents × 1.8)

Immediate Effects

Once saved:

Method 2: Direct Database Modification

For bulk changes or scripted deployments, you can modify the ViciDial database directly.

Identifying the Campaign

First, confirm your campaign ID:

SELECT campaign_id, campaign_name, dial_speed 
FROM vicidial_campaigns 
WHERE campaign_name = 'SALES_OUTBOUND_Q2'\G

Example output:

*************************** 1. row ***************************
campaign_id: 1001
campaign_name: SALES_OUTBOUND_Q2
dial_speed: 1.2

Updating Dial Speed via SQL

Connect to the asterisk database and execute:

UPDATE vicidial_campaigns 
SET dial_speed = 1.8 
WHERE campaign_id = '1001';

Verify the change:

SELECT campaign_id, campaign_name, dial_speed 
FROM vicidial_campaigns 
WHERE campaign_id = '1001'\G

Batch Updates for Multiple Campaigns

To update multiple campaigns at once:

UPDATE vicidial_campaigns 
SET dial_speed = 1.5 
WHERE campaign_id IN ('1001', '1002', '1003', '1004')
AND status = 'ACTIVE';

Reverting a Change

Always preserve the original value:

UPDATE vicidial_campaigns 
SET dial_speed = 1.2 
WHERE campaign_id = '1001';

Method 3: API-Based Modification

For integration with external systems or automated workflows:

ViciDial API Endpoint

ViciDial exposes campaign modification through its API. Example request:

curl -X POST http://your-vicidial-ip/vicidial/non_agent_api.php \
  -d "user=admin_username" \
  -d "pass=admin_password" \
  -d "campaign_id=1001" \
  -d "campaign_name=SALES_OUTBOUND_Q2" \
  -d "dial_speed=1.8" \
  -d "format=json"

Expected Response

{
  "response": "CAMPAIGN UPDATED",
  "campaign_id": "1001",
  "dial_speed": "1.8"
}

Error Handling

#!/bin/bash
RESPONSE=$(curl -s -X POST http://your-vicidial-ip/vicidial/non_agent_api.php \
  -d "user=admin_username" \
  -d "pass=admin_password" \
  -d "campaign_id=1001" \
  -d "dial_speed=1.8" \
  -d "format=json")

echo "$RESPONSE" | grep -q "CAMPAIGN UPDATED"
if [ $? -eq 0 ]; then
  echo "Success: Dial speed updated"
else
  echo "Error: Update failed"
  echo "$RESPONSE"
fi

Monitoring Impact of Dial Speed Changes

Real-Time Call Monitoring

Monitor the immediate effects using Asterisk CLI:

asterisk -rx "core show channels"

Sample output:

Channel              State   Application Data
SIP/1234-00000abc    Up      AppDial
SIP/1235-00000abd    Up      AppDial
SIP/1236-00000abe    Up      VoiceMail
--- 47 active channels
--- 3 active calls

ViciDial Log Analysis

Check the vicidial_log table for real-time statistics:

SELECT 
  campaign_id,
  campaign_name,
  COUNT(*) as total_calls,
  SUM(CASE WHEN status = 'ANSWER' THEN 1 ELSE 0 END) as answered_calls,
  ROUND(100.0 * SUM(CASE WHEN status = 'ANSWER' THEN 1 ELSE 0 END) / COUNT(*), 2) as answer_rate,
  AVG(LENGTH) as avg_call_length,
  SUM(LENGTH) as total_talk_time
FROM vicidial_log 
WHERE campaign_id = '1001'
AND call_date > DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY campaign_id, campaign_name\G

System Resource Monitoring

Monitor CPU, memory, and disk I/O during and after changes:

top -b -n 1 | head -20

Check Asterisk process specifically:

ps aux | grep -i asterisk | grep -v grep

Monitor database connections:

mysql -u root -p -e "SHOW PROCESSLIST;" | grep -i vicidial

Agent Idle Time Tracking

Query for agent idle statistics:

SELECT 
  user,
  COUNT(*) as total_logins,
  AVG(UNIX_TIMESTAMP(logout_time) - UNIX_TIMESTAMP(login_time)) as avg_session_length,
  SUM(CASE WHEN status = 'IDLE' THEN idle_sec ELSE 0 END) as total_idle_seconds
FROM vicidial_agent_log 
WHERE login_time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY user
ORDER BY total_idle_seconds DESC
LIMIT 15;

Performance Tuning Considerations

Database Connection Limits

Verify your MySQL max connections setting:

mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"

For high dial speeds (>2.0), ensure adequate connections:

mysql -u root -p -e "SET GLOBAL max_connections = 500;"

Make permanent in /etc/mysql/my.cnf:

[mysqld]
max_connections = 500
max_allowed_packet = 64M

Asterisk Channel Limits

Check current SIP channel limits in /etc/asterisk/sip.conf:

[general]
maxcallbitrate = 384000
dtmfmode = rfc2833
rtptimeout = 60
rtpholdtimeout = 300
sipdebug = no

For high-volume campaigns, modify /etc/asterisk/extensions-vicidial.conf:

[from-vicidial]
exten => _X.,1,NoOp(Vicidial outbound call - ${CALLERID(num)})
exten => _X.,n,Set(CHANNEL_LIMIT=50)
exten => _X.,n,Dial(SIP/${EXTEN}@carrier,180,L(${CHANNEL_LIMIT}):10000)
exten => _X.,n,Hangup()

Asterisk Configuration Reload

After modifying Asterisk configs, reload without dropping calls:

asterisk -rx "module reload chan_sip.so"

Or completely reload dialplan:

asterisk -rx "dialplan reload"

Advanced: Campaign Dial Speed Scheduling

Time-Based Dial Speed Adjustment

Create a scheduled script to adjust dial speed based on time of day:

#!/bin/bash
# /usr/local/bin/adjust_dial_speed.sh

DB_USER="cron"
DB_PASS="yourpassword"
DB_NAME="asterisk"
CAMPAIGN_ID="1001"

HOUR=$(date +%H)

# Morning (9-12): Conservative
if [ $HOUR -ge 9 ] && [ $HOUR -lt 12 ]; then
  DIAL_SPEED="1.2"
fi

# Afternoon (12-17): Moderate
if [ $HOUR -ge 12 ] && [ $HOUR -lt 17 ]; then
  DIAL_SPEED="1.5"
fi

# Evening (17-21): Aggressive
if [ $HOUR -ge 17 ] && [ $HOUR -lt 21 ]; then
  DIAL_SPEED="1.8"
fi

# Late night (21+): Conservative
if [ $HOUR -ge 21 ] || [ $HOUR -lt 9 ]; then
  DIAL_SPEED="1.0"
fi

mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
  "UPDATE vicidial_campaigns SET dial_speed = $DIAL_SPEED WHERE campaign_id = '$CAMPAIGN_ID';"

echo "$(date): Campaign $CAMPAIGN_ID dial speed set to $DIAL_SPEED" >> /var/log/vicidial_dial_speed.log

Add to crontab for automatic execution:

crontab -e

Add the line:

0 9,12,17,21 * * * /usr/local/bin/adjust_dial_speed.sh

Agent Count-Based Dynamic Adjustment

Adjust dial speed based on currently logged-in agents:

#!/bin/bash
# /usr/local/bin/dynamic_dial_speed.sh

DB_USER="cron"
DB_PASS="yourpassword"
DB_NAME="asterisk"
CAMPAIGN_ID="1001"

# Get active agent count
AGENT_COUNT=$(mysql -u $DB_USER -p$DB_PASS $DB_NAME -sN -e \
  "SELECT COUNT(*) FROM vicidial_users WHERE active = '1' AND user_level > 1;")

# Adjust dial speed based on agent availability
if [ $AGENT_COUNT -lt 10 ]; then
  DIAL_SPEED="1.0"
elif [ $AGENT_COUNT -lt 20 ]; then
  DIAL_SPEED="1.3"
elif [ $AGENT_COUNT -lt 50 ]; then
  DIAL_SPEED="1.5"
else
  DIAL_SPEED="1.8"
fi

mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
  "UPDATE vicidial_campaigns SET dial_speed = $DIAL_SPEED WHERE campaign_id = '$CAMPAIGN_ID';"

echo "$(date): Agents: $AGENT_COUNT, Dial Speed: $DIAL_SPEED" >> /var/log/vicidial_dynamic.log

Troubleshooting

Issue: Dial Speed Change Not Taking Effect

Symptoms: Campaign shows updated dial speed in admin panel, but calling behavior unchanged.

Solution:

  1. Verify the change was saved to the database:
SELECT campaign_id, campaign_name, dial_speed 
FROM vicidial_campaigns 
WHERE campaign_id = '1001'\G
  1. Check if campaign is paused:
SELECT campaign_id, campaign_name, active, dial_speed 
FROM vicidial_campaigns 
WHERE campaign_id = '1001'\G

If active = '0', enable the campaign:

UPDATE vicidial_campaigns SET active = '1' WHERE campaign_id = '1001';
  1. Restart the vicidial_agent_api service:
systemctl restart vicidial_agent_api

Or if using older init:

/etc/init.d/vicidial_agent_api restart
  1. Wait 2-3 minutes for the change to propagate through the system.

Issue: Calls Connecting Too Slowly Despite High Dial Speed

Symptoms: Dial speed set to 2.0 or higher, but agents still idle frequently.

Diagnosis:

  1. Check for failed/abandoned calls:
SELECT 
  status,
  COUNT(*) as count
FROM vicidial_log 
WHERE campaign_id = '1001'
AND call_date > DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY status;

High counts of 'CANCEL', 'NO ANSWER', or 'BUSY' indicate connection issues, not dial speed problems.

  1. Verify carrier/trunk capacity:
asterisk -rx "sip show peers"

Look for registration status and call count per carrier.

  1. Check for dialplan errors:
tail -f /var/log/asterisk/messages | grep -i error

Solutions:

Issue: High System Load After Increasing Dial Speed

Symptoms: CPU usage spikes to 100%, increased latency, database slowness.

Diagnosis:

top -b -n 1 | head -30

Check database query performance:

mysql -u root -p -e "SHOW FULL PROCESSLIST\G" | grep -i Query_time

Check Asterisk CPU usage:

asterisk -rx "core show calls"

Solutions:

  1. Reduce dial speed:
UPDATE vicidial_campaigns SET dial_speed = 1.2 WHERE campaign_id = '1001';
  1. Optimize database:
mysql -u root -p asterisk -e "OPTIMIZE TABLE vicidial_log;"
mysql -u root -p asterisk -e "OPTIMIZE TABLE vicidial_agent_log;"
  1. Increase server resources (CPU, RAM, disk I/O)

  2. Distribute load across multiple Asterisk boxes

  3. Enable connection pooling in my.cnf:

[mysqld]
innodb_buffer_pool_size = 4G
thread_cache_size = 128
query_cache_size = 512M
query_cache_type = 1

Issue: Abandonment Rate Increased After Speed Change

Symptoms: Dial speed increased, but customer abandonment rate (calls hung up before agent pickup) jumped.

Analysis:

SELECT 
  campaign_id,
  COUNT(*) as total_calls,
  SUM(CASE WHEN status = 'ABANDON' THEN 1 ELSE 0 END) as abandoned,
  ROUND(100.0 * SUM(CASE WHEN status = 'ABANDON' THEN 1 ELSE 0 END) / COUNT(*), 2) as abandon_rate
FROM vicidial_log 
WHERE campaign_id = '1001'
AND call_date > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY campaign_id;

Solutions:

Issue: Cannot Connect to Database to Update Dial Speed

Error: ERROR 1045 (28000): Access denied for user 'cron'@'localhost'

Solution:

Verify database credentials in /etc/astguiclient/astguiclient.conf:

grep -i password /etc/astguiclient/astguiclient.conf

If using wrong credentials, update:

vi /etc/astguiclient/astguiclient.conf

Or test connection directly:

mysql -h localhost -u cron -p asterisk -e "SELECT 1;"

If cron user doesn't exist, create it:

mysql -u root -p mysql -e \
  "GRANT ALL ON asterisk.* TO 'cron'@'localhost' IDENTIFIED BY 'newpassword';"

Best Practices

Monitoring and Documentation

Always document dial speed changes:

# /var/log/vicidial_changes.log
2024-01-15 10:30:00 - Campaign SALES_Q1: dial_speed 1.2 → 1.5 (reason: 20 new agents)
2024-01-15 14:00:00 - Campaign SALES_Q1: dial_speed 1.5 → 1.3 (reason: high abandonment)

Incremental Changes

Never jump from 1.2 to 2.0. Increase in small steps:

-- Day 1
UPDATE vicidial_campaigns SET dial_speed = 1.3 WHERE campaign_id = '1001';

-- Day 2 (after monitoring)
UPDATE vicidial_campaigns SET dial_speed = 1.5 WHERE campaign_id = '1001';

-- Day 3
UPDATE vicidial_campaigns SET dial_speed = 1.7 WHERE campaign_id = '1001';

Regular Performance Reviews

Schedule weekly reviews:

-- Weekly dial speed effectiveness report
SELECT 
  DATE(call_date) as date,
  campaign_id,
  campaign_name,
  COUNT(*) as total_calls,
  SUM(CASE WHEN status = 'ANSWER' THEN 1 ELSE 0 END) as answered,
  ROUND(100.0 * SUM(CASE WHEN status = 'ANSWER' THEN 1 ELSE 0 END) / COUNT(*), 2) as answer_rate,
  AVG(LENGTH) as avg_duration,
  SUM(CASE WHEN status = 'ABANDON' THEN 1 ELSE 0 END) as abandoned
FROM vicidial_log 
WHERE campaign_id = '1001'
AND call_date > DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY DATE(call_date)
ORDER BY call_date DESC;

Compliance Considerations

Check FCC/TCPA regulations for your campaign type. Some call types have maximum abandonment limits. Document dial speed choices to demonstrate compliance efforts.

Summary

Changing campaign dial speed in ViciDial is a straightforward process with three primary methods:

  1. Web Admin Panel - Best for manual, single-campaign changes
  2. Direct Database Updates - Fastest for bulk changes or scripted deployments
  3. API-Based Modifications - Ideal for system integration and automation

The key to successful dial speed optimization is:

A well-tuned dial speed balances agent productivity with call quality and customer satisfaction. Start conservative (1.2-1.3) and gradually increase based on your specific operational metrics and constraints. Your optimal dial speed depends on your agents' experience, your calling list quality, your system resources, and your business goals.

Stuck on something specific?

Book a free 30-minute call. I run ViciDial centers across 3 countries and can usually unblock your setup in one session — or build it for you.

Book a Free Consultation