Master the complete setup of ViciDial agent call scripts including database configuration, script creation, script-to-campaign linking, and agent-level script assignments for production call centers.
Prerequisites
Before configuring ViciDial agent call scripts, ensure you have:
- A running ViciDial installation (version 2.9+ recommended)
- Root or sudo access to the ViciDial server
- MySQL/MariaDB access with credentials to the
asteriskdatabase - Understanding of ViciDial user roles (Admin, Manager, Agent)
- A text editor (nano, vim, or IDE)
- Access to the ViciDial web administration interface at
/vicidial/admin.php - At least one active campaign already created in the system
- Basic knowledge of HTML/plain text formatting
Understanding ViciDial Script Architecture
What Are Call Scripts?
Call scripts in ViciDial are configurable templates that agents see during active calls. They serve multiple purposes:
- Visual guidance during customer interactions
- Dynamic variable substitution pulling from lead records
- Call flow logic with conditional branching
- Integration with disposition codes and call outcomes
- Customizable HTML/plain text rendering in the agent screen
Script Processing Flow
When an agent receives a call, ViciDial:
- Retrieves the assigned script from the database
- Parses special syntax tokens (e.g.,
[FIRSTNAME],[PHONE]) - Substitutes lead-specific variables from
vicidial_listtable - Renders the script in the agent's browser in real-time
- Logs script interactions if configured
Database Structure for Scripts
Core Script Tables
ViciDial stores scripts in the asterisk database across several key tables:
-- View existing script table structure
DESCRIBE vicidial_scripts;
Key columns in vicidial_scripts:
| Column | Type | Purpose |
|---|---|---|
| script_id | INT (Primary Key) | Unique identifier |
| script_name | VARCHAR(255) | Display name for admin panel |
| script_text | LONGTEXT | Script content with variables |
| script_lang | VARCHAR(10) | Language code (default: en) |
| active | ENUM('Y','N') | Enable/disable script |
| user_group | VARCHAR(20) | Restrict to specific user groups |
| date_added | TIMESTAMP | Creation timestamp |
| date_modified | TIMESTAMP | Last modification timestamp |
Script-Campaign Linking Table
The vicidial_campaigns table contains:
-- Relevant columns for script assignment
SELECT campaign_id, campaign_name, script_id, script_screen
FROM vicidial_campaigns
WHERE campaign_id = 'TESTCAMP';
script_id— Links tovicidial_scripts.script_idscript_screen— Controls when script displays ('CALL_TIME', 'DIALER_PREVIEW', 'BOTH', 'NONE')
Creating Your First Agent Call Script
Step 1: Connect to the ViciDial Database
mysql -u cron -p asterisk
When prompted, enter your ViciDial database password (typically found in /etc/astguiclient.conf):
grep 'ASTERISK_PASSWD' /etc/astguiclient.conf
Step 2: Insert a Basic Script
Create a simple inbound support script:
INSERT INTO vicidial_scripts
(script_name, script_text, script_lang, active, user_group, date_added)
VALUES (
'Inbound Support - Basic',
'Hello [FIRSTNAME], thank you for calling. What can I help you with today?
Account Info:
Customer: [FIRSTNAME] [LASTNAME]
Account: [ACCOUNTID]
Phone: [PHONE]
Email: [EMAIL]
[NOTES]
Type your notes above this line.',
'en',
'Y',
'AGENTS'
);
Verify insertion:
SELECT script_id, script_name FROM vicidial_scripts
WHERE script_name = 'Inbound Support - Basic';
Step 3: Create an Advanced Script with HTML Formatting
For more sophisticated formatting in the agent screen, use HTML:
INSERT INTO vicidial_scripts
(script_name, script_text, script_lang, active, user_group)
VALUES (
'Outbound Sales - Advanced',
'<div style="background-color: #f0f0f0; padding: 10px; font-family: Arial;">
<h3>Sales Call Script</h3>
<fieldset>
<legend>Customer Information</legend>
<p><strong>Name:</strong> [FIRSTNAME] [LASTNAME]</p>
<p><strong>Phone:</strong> [PHONE]</p>
<p><strong>Last Contact:</strong> [LASTCALLDATE]</p>
</fieldset>
<fieldset>
<legend>Opening Statement</legend>
<p>Hi [FIRSTNAME], this is [AGENTNAME] from TechCorp Solutions.
I''m calling because we have a special offer for valued customers like you.</p>
</fieldset>
<fieldset>
<legend>Discovery Questions</legend>
<ol>
<li>Are you currently using a solution for [LEADTYPE]?</li>
<li>What is your biggest pain point?</li>
<li>When would be a good time to discuss options?</li>
</ol>
</fieldset>
<fieldset style="background-color: #fff3cd; border: 1px solid #ffc107;">
<legend>Agent Notes</legend>
<textarea style="width: 100%; height: 80px;">
[NOTES]
</textarea>
</fieldset>
</div>',
'en',
'Y',
'AGENTS'
);
ViciDial Script Variables Reference
Available Token Variables
These tokens are automatically replaced with lead data during call display:
| Token | Source | Example |
|---|---|---|
[FIRSTNAME] |
vicidial_list.first_name | "John" |
[LASTNAME] |
vicidial_list.last_name | "Smith" |
[PHONE] |
vicidial_list.phone_number | "555-123-4567" |
[EMAIL] |
vicidial_list.email | "[email protected]" |
[NOTES] |
vicidial_list.notes | User-editable field |
[LEADTYPE] |
vicidial_list.lead_source | "Web Form" |
[ACCOUNTID] |
vicidial_list.record_id | "ACC-12345" |
[AGENTNAME] |
vicidial_users.full_name | "Sarah Johnson" |
[LASTCALLDATE] |
vicidial_log.call_date | "2024-01-15 14:32" |
[LASTDISPO] |
vicidial_closer_log.status | "CALLBACK" |
[CUSTOM1] through [CUSTOM10] |
vicidial_list.alt_phone, field1-field10 | Custom lead data |
Conditional Variables (Advanced)
For conditional display based on lead data, use PHP-style logic in custom integrations. Standard ViciDial scripts use simple token replacement.
Linking Scripts to Campaigns
Via MySQL
-- Assign script to campaign
UPDATE vicidial_campaigns
SET script_id = (SELECT script_id FROM vicidial_scripts
WHERE script_name = 'Outbound Sales - Advanced'),
script_screen = 'CALL_TIME'
WHERE campaign_id = 'TESTCAMP';
-- Verify assignment
SELECT campaign_id, campaign_name, script_id
FROM vicidial_campaigns
WHERE campaign_id = 'TESTCAMP';
Via Web Admin Interface
- Log into
/vicidial/admin.phpas admin user - Navigate: Campaigns → Click campaign name
- Scroll to Script section
- Select script from dropdown: Outbound Sales - Advanced
- Set Script Screen option:
CALL_TIME— Show during active call onlyDIALER_PREVIEW— Show in preview mode before dialingBOTH— Show in both modesNONE— Disable script display
- Click SUBMIT
Agent-Level Script Overrides
Override Script Per User
Some ViciDial configurations allow per-user script overrides. Store these in the vicidial_users table:
-- Check if user table has script_id column
SHOW COLUMNS FROM vicidial_users LIKE 'script%';
-- If column exists, assign script to specific user
UPDATE vicidial_users
SET script_override = (SELECT script_id FROM vicidial_scripts
WHERE script_name = 'Inbound Support - Basic')
WHERE user = 'agent1';
If the column doesn't exist, this functionality may not be enabled in your version. Typically, scripts are assigned at the campaign level.
Script Management Operations
Backup Scripts
Export all scripts before modifications:
mysqldump -u cron -p asterisk vicidial_scripts > /backup/vicidial_scripts_$(date +%Y%m%d).sql
Restore if needed:
mysql -u cron -p asterisk < /backup/vicidial_scripts_20240115.sql
List All Active Scripts
SELECT script_id, script_name, active, user_group, date_modified
FROM vicidial_scripts
WHERE active = 'Y'
ORDER BY script_name;
Bulk Update Scripts
-- Deactivate all old scripts
UPDATE vicidial_scripts
SET active = 'N'
WHERE date_modified < DATE_SUB(NOW(), INTERVAL 90 DAY)
AND script_name LIKE '%OLD%';
-- Check impact before committing
SELECT COUNT(*) FROM vicidial_scripts
WHERE date_modified < DATE_SUB(NOW(), INTERVAL 90 DAY)
AND script_name LIKE '%OLD%';
Clone/Duplicate a Script
-- Create new version of existing script
INSERT INTO vicidial_scripts (script_name, script_text, script_lang, active, user_group)
SELECT
CONCAT(script_name, ' - v2'),
script_text,
script_lang,
'Y',
user_group
FROM vicidial_scripts
WHERE script_id = 5;
Script Display Settings in Asterisk Configuration
Extension Configuration
ViciDial's Asterisk dial plan reads script display settings from extensions configuration:
; /etc/asterisk/extensions-vicidial.conf excerpt
; Script display controlled by campaign configuration,
; but can be overridden in dial plan logic
exten => _9X.,1,AGI(agi://127.0.0.1:4573/?stagePROVIDED|${EXTEN})
exten => _9X.,n,Hangup()
The AGI handler communicates script assignments to the web interface via WebSocket or AJAX polling.
Testing Scripts in Production
View Script as Agent Would See It
- Log into
/agc/vicidial.phpas test agent - Place a test call to campaign with script assigned
- Script should display in right panel during call
- Verify variable substitution (names, phone numbers appear correctly)
Check Script Logs
tail -f /var/log/asterisk/messages | grep -i script
Test Variable Substitution
Create a test lead record:
INSERT INTO vicidial_list
(campaign_id, phone_number, first_name, last_name, email, notes, status, date_added)
VALUES (
'TESTCAMP',
'5551234567',
'TestAgent',
'Script',
'[email protected]',
'This is a test lead for script validation',
'NEW',
NOW()
);
Call the number and verify all tokens show correctly in the script.
Performance Considerations
Script Size Optimization
Large scripts (>50 KB) may slow browser rendering. Optimize:
-- Check script sizes
SELECT script_id, script_name, LENGTH(script_text) as size_bytes
FROM vicidial_scripts
ORDER BY size_bytes DESC;
If scripts exceed 50 KB:
- Move verbose instructions to external documentation
- Use collapsed HTML sections with toggle buttons
- Limit CSS inline styling (use class references instead)
Database Query Efficiency
ViciDial caches script data. To force refresh:
# Restart ViciDial daemon to clear cache
systemctl restart vicidial
Or clear specific cache entries:
# If Redis is enabled
redis-cli FLUSHDB # WARNING: Clears all cache
Integration with Disposition Codes
Scripts often reference disposition codes used after calls. Link them logically:
-- View available dispositions
SELECT disposition_id, disposition, active
FROM vicidial_statuses
WHERE campaign_id = 'TESTCAMP'
AND active = 'Y';
Create script sections matching dispositions:
INSERT INTO vicidial_scripts
(script_name, script_text, script_lang, active, user_group)
VALUES (
'Inbound Routing',
'<h2>Call Disposition Guide</h2>
<p><strong>SALE:</strong> Customer agreed to purchase</p>
<p><strong>CALLBACK:</strong> Customer wants follow-up call</p>
<p><strong>NOTINTERESTED:</strong> Customer declined offer</p>
<p><strong>DONOTCALL:</strong> Customer requested removal from list</p>
<p><em>Select appropriate disposition after call ends.</em></p>',
'en',
'Y',
'AGENTS'
);
Multi-Language Script Support
Create Scripts in Multiple Languages
-- English version
INSERT INTO vicidial_scripts (script_name, script_text, script_lang, active)
VALUES ('Welcome Script', 'Hello [FIRSTNAME], welcome!', 'en', 'Y');
-- Spanish version
INSERT INTO vicidial_scripts (script_name, script_text, script_lang, active)
VALUES ('Welcome Script', '¡Hola [FIRSTNAME], bienvenido!', 'es', 'Y');
-- French version
INSERT INTO vicidial_scripts (script_name, script_text, script_lang, active)
VALUES ('Welcome Script', 'Bonjour [FIRSTNAME], bienvenue!', 'fr', 'Y');
The campaign or user language setting determines which version displays.
Advanced: Custom Script Variables via AGI
For variables beyond standard tokens, modify the ViciDial AGI script:
# Locate AGI handler
find /usr -name 'agi*.agi' 2>/dev/null
Edit /var/lib/asterisk/agi-bin/vicidial_custom.agi (or similar):
#!/usr/bin/perl
# Custom variable handler
# Standard input from Asterisk
while (<STDIN>) {
chomp;
last unless length($_);
if (/^agi_request:\s+(.*)/) {
$ENV{request} = $1;
}
}
# Add custom variable processing
$lead_id = $ENV{agi_arg_1};
# Query additional data
my $query = "SELECT custom_field FROM vicidial_list WHERE list_id = $lead_id";
my $result = $dbh->selectrow_array($query);
# Send back to Asterisk
print "SET VARIABLE CUSTOMVAR $result\n";
Troubleshooting
Script Not Displaying During Calls
Symptom: Agent calls connect but script panel shows blank or error.
Diagnosis Steps:
- Verify script_id is correctly assigned:
SELECT campaign_id, script_id FROM vicidial_campaigns
WHERE campaign_id = 'TESTCAMP';
- Confirm script exists and is active:
SELECT script_id, script_name, active FROM vicidial_scripts
WHERE script_id = (SELECT script_id FROM vicidial_campaigns
WHERE campaign_id = 'TESTCAMP');
- Check Asterisk logs for AGI errors:
grep -i "agi\|script" /var/log/asterisk/messages | tail -20
Solution:
- Ensure
script_idforeign key references valid script - Set script
active = 'Y' - Verify campaign has
script_screen != 'NONE' - Restart ViciDial service:
systemctl restart vicidial
Variables Not Substituting
Symptom: Script shows literal tokens like [FIRSTNAME] instead of actual names.
Diagnosis:
-- Check if lead has data in those columns
SELECT first_name, last_name, email FROM vicidial_list
WHERE phone_number = '5551234567' LIMIT 1;
Solution:
- Populate missing columns in
vicidial_listbefore call - Use valid token names from the reference table above
- Check for typos in token names (case-sensitive in some versions)
- Verify lead_id is correctly passed to script parser
Script Rendering Issues (HTML Scripts)
Symptom: HTML script displays as raw markup or styling is broken.
Diagnosis:
- Test script in a text editor for syntax errors:
# Escape single quotes in SQL when testing locally
mysql -u cron -p asterisk -e "SELECT script_text FROM vicidial_scripts WHERE script_id = 5\G"
- Check browser console for JavaScript errors: Press F12 in agent screen
Solution:
- Close all HTML tags properly
- Escape single quotes in SQL as
''(double apostrophe) - Avoid inline event handlers (onclick, onload) — use CSS/JS in agent interface
- Test with simple HTML first, then add complexity
Performance Degradation with Large Scripts
Symptom: Agent screen becomes slow when script loads.
Diagnosis:
# Monitor browser performance
# In agent screen, press F12 → Network tab → refresh
# Look for script load times > 2 seconds
Solution:
- Compress script text (remove extra whitespace)
- Limit script size to <30 KB
- Use lazy-loading for sections with JavaScript
- Cache scripts on agent machine with
Cache-Controlheaders
Scripts Reverting After Restart
Symptom: Script changes work temporarily but disappear after reboot.
Diagnosis:
# Check if changes were committed to database
mysql -u cron -p asterisk -e "SELECT script_id, date_modified FROM vicidial_scripts WHERE script_name = 'Test Script';"
# Check if backup/restore is running
ps aux | grep -i backup
Solution:
- Ensure MySQL is configured to persist data (not running in-memory)
- Verify
/var/lib/mysqlis on persistent storage - Disable auto-restore scripts if they exist in cron jobs
- Manually flush/commit database after changes:
mysql -u cron -p asterisk -e "FLUSH TABLES WITH READ LOCK; UNLOCK TABLES;"
Agent Sees Wrong Script
Symptom: Agent on campaign A sees script from campaign B.
Diagnosis:
-- Check what script is assigned to agent's current campaign
SELECT c.campaign_id, c.script_id, s.script_name
FROM vicidial_users u
JOIN vicidial_user_campaigns uc ON u.user_id = uc.user_id
JOIN vicidial_campaigns c ON uc.campaign_id = c.campaign_id
JOIN vicidial_scripts s ON c.script_id = s.script_id
WHERE u.user = 'agent1';
Solution:
- Verify campaign assignment in admin panel
- Clear browser cache:
Ctrl+Shift+Delete - Reload agent screen:
Ctrl+F5 - Check for conflicting user-level script overrides:
SELECT user, script_override FROM vicidial_users WHERE user = 'agent1';
Summary
Configuring ViciDial agent call scripts involves:
- Database Design — Understanding the
vicidial_scriptsand campaign linking tables - Script Creation — Writing scripts with token variables and HTML formatting
- Campaign Assignment — Linking scripts via MySQL or web admin interface
- Variable Substitution — Using tokens like
[FIRSTNAME],[PHONE]to inject lead data - Testing — Validating script display and variable substitution in live calls
- Optimization — Managing script size and performance for production environments
- Troubleshooting — Diagnosing common issues with display, variables, and persistence
Production best practices:
- Always backup scripts before bulk updates using mysqldump
- Version control by including version numbers in script names
- Keep scripts under 30 KB for optimal browser performance
- Test in staging before deploying to live campaigns
- Monitor logs (
/var/log/asterisk/messages) for AGI-related errors - Document token usage for your team to avoid confusion
- Use HTML formatting sparingly — prioritize readability over aesthetics
- Schedule reviews quarterly to archive outdated scripts and improve active ones
With scripts properly configured, your agents will have consistent, data-driven guidance during every customer interaction, improving call quality and compliance across your contact center operations.