vicigeeksimple guides
Browse
All guides

VICIdial & agents · Connection rate optimization

Optimize VICIdial dial ratios and AMD for better connection rates

Choose explicit before/after windows, calculate defined status shares and monitor a bounded pacing change separately from the historical comparison. Use labeled audio to investigate AMD accuracy.

Reader setup

Before you start

  1. Read-only VICIdial database access, using the mysql --defaults-extra-file=/etc/vicidial-readonly.cnf pattern used throughout this article — see Create a read-only database account for safe VICIdial queries if you do not have one yet.
  2. A campaign already dialing through RATIO or an adaptive dial_method, as covered in VICIdial dialing modes and pacing: manual, ratio and adaptive.
  3. AMD already enabled and reachable on that campaign, as covered in Tune AMD without burning good leads.
Expected result
You can calculate selected status shares, compare them across equivalent periods and identify when labeled audio or further route investigation is needed.
Before making changes
Change auto_dial_level and any AMD setting one at a time, in separate measurement windows, or you will not know which one moved your numbers.

01 / 09

Fast answer

Choose one campaign and compare the same date range before and after one change. Record attempts, answered calls and the exact definition of an answer; do not attribute a change to one cause without supporting evidence.

Dial level and AMD can both affect call outcomes, but a falling status share has other possible causes. Compare consistent windows and use labeled, authorized test calls to assess whether AMD classified a human or machine correctly.

This is the measurement layer on top of two other guides. What a dial method is and how MANUAL, RATIO, and adaptive pacing actually work is covered in VICIdial dialing modes and pacing: manual, ratio and adaptive. What AMD is and how to test a candidate threshold against a labeled sample is covered in Tune AMD without burning good leads. This guide assumes both and focuses on one question: once pacing and AMD are both live, how do you tell which one is costing you connected calls, and what do you change first.

Dial level controls pacing; AMD classifies answered audio; DROP and other statuses record outcomes according to the installed configuration. Their counts are useful indicators, not direct proof of the caller’s experience.

Trace path · read left to right
01Dial level ahead of agent capacity turns some connects into DROP02AMD misclassifying a human greeting as AA routes it away before any agent sees it03Both failures show up as the same falling connect rate in a daily report
Reference screenshots 3 images

Reference capture

Reference screens from the demo

Captured on an isolated VICIdial demo: Administration screens on September 24, 2026, and the idle Agent screen on August 11, 2026. Each caption states its own capture time, and every sanitized image helps you recognize a related screen; none proves that this article's call, command, or result occurred.
Step 1 · Find the campaign

Start from Campaign Listings

Open to enlarge
Sanitized VICIdial Campaign Listings page showing only the fixture campaign row
Captured September 24, 2026 at 21:39:47 UTC on the authorized isolated demo.
Capture detailsOnly the fixture campaign row is shown; other campaigns are removed. Its columns do not prove dialing activity, performance, or a completed call.
Step 2 · Read campaign controls

Open the campaign detail page

Open to enlarge
Sanitized VICIdial campaign detail page showing dialing, hopper, script, and call-launch settings
Captured August 11, 2026 at 16:20:58 UTC on the authorized isolated demo.
Capture detailsIdentifiers were redacted. Visible settings belong to an isolated configuration page and do not prove that calls were launched or completed.
Step 3 · Check dialing statuses

Review statuses allowed for dialing

Open to enlarge
Sanitized VICIdial Custom Campaign Statuses listing for the fixture campaign, with no other campaigns shown
Captured September 24, 2026 at 21:47:33 UTC on the authorized isolated demo.
Capture detailsThis is the custom campaign-statuses listing for one fixture campaign, not the full dial-status selection area; it does not show call outcomes or report results.

02 / 09

Connect rate, answer rate, and drop rate are three different numbers

Define each metric before calculating it. The human_answered flag is a status configuration flag, not a direct observation that a human reached an agent. DROP share here means DROP-labeled rows divided by selected log rows; a carrier answer timestamp is a separate signal.

Do not average these across dates or campaigns that used different auto_dial_level or AMD settings. Averaging hides exactly the thing you are trying to find: which lever moved the number, and when.

If this campaign defines its own status overrides in vicidial_campaign_statuses, its human_answered value takes priority over the system default in vicidial_statuses for the same status code; check both tables rather than assuming the system default applies everywhere.

03 / 09

Step 1 — Measure your baseline from vicidial_log and vicidial_carrier_log

Freeze an explicit baseline before changing anything. Choose server-time start/end boundaries, record the timezone and keep the upper bound exclusive. Match staffing, list mix, route and status definitions; a longer baseline may describe variation but is not the live stop monitor.

The example dates and DNCLAB campaign below are placeholders for an approved test record. Run it in the authorized root context from the read-only-account lesson or use sudo mysql; do not make its root0600 option file readable to ordinary users.

Before you use it
In an approved read-only SQL session, replace all three placeholders; save the chosen boundaries and configured status meanings with the result. Use equal windows and ensure there is one status-definition row per join key. Open the approved client with sudo mysql --defaults-file=/etc/vicidial-readonly.cnf and confirm SELECT CURRENT_USER(), DATABASE() before entering this scoped SQL. Do not widen the credential-file permissions.
Count a frozen baseline or one post-change window
SELECT vl.campaign_id, COUNT(*) AS selected_log_rows, SUM(COALESCE(cs.human_answered,ss.human_answered)='Y') AS human_answered_flag_rows, SUM(vl.status='DROP') AS drop_status_rows, SUM(vl.status IN ('AA','AM','AL')) AS machine_status_rows, ROUND(100.0*SUM(COALESCE(cs.human_answered,ss.human_answered)='Y')/NULLIF(COUNT(*),0),2) AS human_answered_flag_share_percent, ROUND(100.0*SUM(vl.status='DROP')/NULLIF(COUNT(*),0),2) AS drop_status_share_percentFROM vicidial_log vlLEFT JOIN vicidial_statuses ss ON ss.status=vl.statusLEFT JOIN vicidial_campaign_statuses cs ON cs.campaign_id=vl.campaign_id AND cs.status=vl.statusWHERE vl.campaign_id='<CAMPAIGN_ID>' AND vl.call_date >= '<START_SERVER_TIME>' AND vl.call_date < '<END_SERVER_TIME>'GROUP BY vl.campaign_id;
Reader-run example · not executed for this guide

This example has no recorded result here. Follow its preparation, expected result and stop conditions before using it.

Success looks like
One row gives defined status counts/shares for only that frozen interval. This is neither verified human connection nor a legal abandonment denominator.
Stop if
No rows means no selected calls or a scope/time mismatch. Duplicate status rows or a configuration change inside the interval invalidate the comparison.
  • Save a baseline window that ends before the effective change.
  • Record the clock/timezone, staffing, route/list population and status definitions.
  • Use labeled call evidence for AMD accuracy; status shares alone cannot supply it.

04 / 09

How dial level and AMD interact to create or destroy connected calls

Dial level and AMD can affect different parts of the call path. Raising auto_dial_level may place more calls relative to available agents; a DROP status is a configured outcome and needs additional evidence before it can be described as a human abandonment.

AMD can classify an answered greeting as a machine and send it according to the campaign’s configured action. A misclassification is possible, but a machine status alone does not prove that a human answered; use labeled test audio to evaluate it.

A rise in DROP or machine-labeled statuses can identify where to investigate. Neither a status nor an answer timestamp alone proves a human was misclassified; compare authorized audio or labeled test calls.

05 / 09

Step 2 — Raise dial level in evidenced steps with a stop threshold

Approve the operator and numeric stop rule before a pacing change. Define the live counter, denominator and window separately from the historical query. The operator watches fresh events; a week of earlier calls must not dilute a new failure.

Use a bounded test and one setting change. Full-shift observations may support a later comparison only after the immediate safety gates remain satisfied; they never require waiting through a breached stop threshold.

Before you use it
Complete these decisions with the responsible operations/compliance owners; the example supplies no universal safe threshold.
A bounded change and its two measurement tracks
1. Freeze the baseline and original setting.2. Name the live counter/window/denominator,operator and numeric stop rule.3. Record the effective change time; start a fresh post-change interval.4. Stop immediately at the rule or an unexpected call; restore and verify.5. Compare matched frozen intervals only after the test is complete.
Not executed · worksheet or reference text

This sample is a template or reading aid, not a terminal command. There is no output to show.

Success looks like
A current incident can trigger the stop independently of the retrospective comparison. Each result belongs to one configuration version.
Stop if
If no live observer/counter is available or the configuration effective time is unknown, do not start the test.
  • Watch only the named fresh-event window for the immediate stop.
  • Record each configuration effective time; do not mix increments.
  • Restore the original setting promptly if the threshold is crossed.

06 / 09

How AMD misclassification burns good leads

Campaign settings including am_message_exten, amd_send_to_vmx, cpd_amd_action and amd_type affect the configured handling of machine classifications. Inspect the installed version and campaign, then use authorized labeled audio to assess possible misclassification.

A and AA are different recorded classifications. An agent-selected machine status and an AMD-selected machine status are both observations that can be wrong; verify classification accuracy against labeled audio.

Compare the AA trend with setting changes, but do not infer accuracy from the trend alone. Check eligible dial statuses to understand whether a lead can be retried, and validate actual behavior in a controlled test.

Before you use it
Use a read-only account and one authorized synthetic campaign or approved aggregate. Compare the machine-status share with documented changes over the same period; status labels alone do not establish classification accuracy. Open the approved client with sudo mysql --defaults-file=/etc/vicidial-readonly.cnf and confirm SELECT CURRENT_USER(), DATABASE() before entering this scoped SQL. Do not widen the credential-file permissions.
Daily AA share trend for one campaign
SELECT DATE(call_date) AS call_day, COUNT(*) AS total_calls, SUM(status = 'AA') AS dialer_machine_status_rows, SUM(status = 'A') AS agent_machine_status_rows, ROUND(100 * SUM(status = 'AA') / COUNT(*), 2) AS machine_status_share_percentFROM vicidial_logWHERE campaign_id = '<CAMPAIGN_ID>'  AND call_date >= CURDATE() - INTERVAL 14 DAYGROUP BY call_dayORDER BY call_day;
Reader-run example · not executed for this guide

This example has no recorded result here. Follow its preparation, expected result and stop conditions before using it.

Success looks like
Daily rows show counts and the share labeled AA, not confirmed machine classifications. Validate a sample with authorized labeled audio.
Stop if
If no rows appear, check the campaign and date window; an empty result does not establish a flat trend. Investigate unexpected shifts without assuming a cause.
  • Confirm the exact date of any AMD threshold or amd_type change before reading this trend
  • Treat AA as AMD's classification, not confirmed proof of a machine

07 / 09

Step 3 — What to change first when connect rate is low

Use the same frozen-window query for two comparable intervals: for example two completed shifts with equal boundaries, matching staffing and one unchanged configuration per interval. Keep the baseline output; changing the query’s end date later does not replace it.

For a calendar-week comparison use two completed seven-day windows. The example below ends at midnight today and excludes today’s partial day; replace it with explicit timestamps for a shift test. Pacing versus AMD is decided from the status trend plus staffing, route and labeled-audio evidence, not from a single percentage.

Before you use it
Replace campaign ID and use the approved sudo/root path. Two completed weeks are a retrospective example, not an immediate per-increment stop measure. Before the scoped query, use the approved client to run SELECT CURRENT_USER(), DATABASE();stop if the identity or selected schema differs. Keep the option file root-owned0600.
Compare two completed calendar weeks
sudo mysql --defaults-file=/etc/vicidial-readonly.cnf -e "SELECT IF(call_date < CURDATE()-INTERVAL 7 DAY,'earlier_7_days','later_7_days') AS period, COUNT(*) AS selected_log_rows, SUM(status='DROP') AS drop_status_rows, SUM(status='AA') AS amd_machine_status_rows, ROUND(100.0*SUM(status='DROP')/NULLIF(COUNT(*),0),2) AS drop_status_share_percent FROM vicidial_log WHERE campaign_id='<CAMPAIGN_ID>' AND call_date>=CURDATE()-INTERVAL 14 DAY AND call_date<CURDATE() GROUP BY period;"
Reader-run example · not executed for this guide

This example has no recorded result here. Follow its preparation, expected result and stop conditions before using it.

Success looks like
The two intervals each cover seven completed server-calendar days; inspect counts and population differences alongside shares.
Stop if
Zero rows or missing periods require checking scope/history. A setting or population change within a period invalidates a simple before/after claim.
  • Separate completed-period analysis from live stop monitoring.
  • Check effective setting time, staffing and route/list mix for each period.
  • Use the actual descriptive aliases; do not relabel a status-flag share as measured human connection.

08 / 09

Weekly metrics to watch

Recheck consistently defined status shares against the same campaign and comparable periods. A change in a status flag share is an investigation signal, not proof of connection rate or cause.

  • human_answered_flag_share_percent for matched windows: a configured status proxy.
  • drop_status_share_percent among the selected outbound log rows; not a legal abandonment-rate definition.
  • AA/AM/AL shares, plus A separately, checked against the actual AMD change date.
  • Provider answer/duration and labeled test evidence only after column semantics/units are validated.
  • Exact configuration effective timestamps, including changes not reflected by campaign_changedate.

09 / 09

Troubleshoot, rollback, and know when to stop

Rerun the baseline with the same scope and status definitions. Compare changes with staffing, carrier conditions and the timing of pacing or AMD changes; correlation alone does not prove cause.

If an authorized test must be rolled back, restore the documented previous campaign or AMD setting through the appropriate administration workflow, then verify the stored value and monitor the same status measures. A return to an earlier trend is not guaranteed.

Stop at the threshold agreed before the test or when unexpected results require investigation. Record the result and any rollback as completed only after verification.

Before you use it
Run this immediately after reverting either auto_dial_level or an AMD setting, while the incident is still fresh.
Confirm the rollback took effect
SELECT campaign_id, dial_method, auto_dial_level, amd_type, cpd_amd_action, campaign_changedateFROM vicidial_campaignsWHERE campaign_id = '<CAMPAIGN_ID>';
Evidence · ViciBox 12 demo capture · demo values substituted

Captured demo response · 2026-09-24 22:25 UTC. Any filtering, hidden values or test-only data are identified in the capture label. Select Replay transcript to read the recorded output.

Command output line: SELECT campaign_id, dial_method, auto_dial_level, amd_type, cpd_amd_action, campaign_changedate FROM vicidial_campaigns WHERE campaign_id = 'KPISYN1';
+-------------+-------------+-----------------+----------+----------------+---------------------+
| campaign_id | dial_method | auto_dial_level | amd_type | cpd_amd_action | campaign_changedate |
+-------------+-------------+-----------------+----------+----------------+---------------------+
| KPISYN1 | MANUAL | 0 | AMD | DISABLED | NULL |
+-------------+-------------+-----------------+----------+----------------+---------------------+
Success looks like
The values shown match the last evidenced configuration, and campaign_changedate shows a timestamp at or after the moment you saved the rollback in Admin. On our ViciBox 12 lab the fixture campaign has never been saved through Admin at all, so campaign_changedate reads NULL here — this idle fixture's baseline, not a completed rollback.
Stop if
If values do not match the intended prior settings, reopen the campaign and inspect the save result. A timestamp alone does not prove whether every setting was restored.

Checks and sources

What was checked

  • dial_method, auto_dial_level, and available_only_ratio_tally are verified vicidial_campaigns configuration columns; the retained fixture capture is MANUAL and does not demonstrate a working RATIO campaign.
  • human_answered and answering_machine are verified columns on vicidial_statuses and vicidial_campaign_statuses, the same flags VICIdial itself uses to classify a completed call.
  • DROP, A, AA, AM, and AL are official VICIdial statuses recorded on the call log, including agent-selected A and automated AA/AM/AL; each can be wrong. XDROP is inbound-only and never appears in this article's all-outbound queries.
  • vicidial_carrier_log records dial_time and answered_time per call, the verified columns behind any carrier-side answer-speed comparison.
  • am_message_exten, amd_send_to_vmx, and cpd_amd_action are verified vicidial_campaigns columns that decide where an AMD-flagged call goes before any agent hears it.
  • The revised explicit-window and completed-week examples are not executed. Historical media remain point-in-time fixture observations and do not demonstrate a pacing improvement or the new query.

Primary references

Sources

  1. VICIdial statuses reference (DROP, AM, AA, and related codes)VICIdial · accessed August 5, 2026
  2. VICIdial Wiki documentationVICIdial Wiki · accessed August 5, 2026

Follow without guesswork

Get the next article

RSS is live now. Email delivery below is an explicit local preview and sends nothing.Open the RSS feed
Email preview only. The address stays in this browser and is never transmitted.