vicigeeksimple guides
Browse
Operations

VICIdial & agents · Production checklist

Find why a VICIdial agent is not dialing

Follow the first failed check from dialing mode to agent session, eligible work and hopper. Finish with either one verified correction or a precise, sanitized handoff for the next owner.

Start the guide

1. Decide whether automatic dialing should happen

  1. In the affected Agent session, note the campaign ID and time, including time zone. In Campaigns → Show Campaigns, open that same ID’s Modify screen. Read the saved Dial Method, Auto Dial Level and Active values before touching a control.
  2. Compare those values with the type of work expected: agent-initiated manual call, automatic outbound work or inbound call delivery. Use the matching row below; do not troubleshoot the outbound hopper for an inbound-only symptom.
  3. If the intended mode is unknown, leave the campaign unchanged and record that missing decision in the handoff. If a live incident requires a change, use the campaign owner’s approved values rather than copying this lab’s controls.
Choose the branch from saved values and intended workScroll sideways to compare columns
Observed / intendedInterpretationContinue here
MANUAL; an automatic call was expectedCampaign mode does not match the expectationConfirm the intended workflow. For an approved manual test, use the first-call guide; do not raise Auto Dial Level.
Automatic outbound mode; Active NCampaign is not enabled for outbound workFind why it was disabled. If an isolated test is approved, record N, set Active Y, SUBMIT and reopen; activation can start work, so confirm agent and destination readiness first.
RATIO; Auto Dial Level 0No positive pacing level is configured for ratio dialingUse only the approved pacing value in a drained test window, then SUBMIT and reopen. There is no universal diagnostic level.
Automatic outbound mode; activation and pacing match planMode gate passed; other gates can still block workContinue to agent/session, then eligibility.
Inbound call not deliveredOutbound pacing/hopper is a different pathUse the inbound DID → in-group routing guide.
Unknown campaign or intended modeThere is not enough evidence to change settingsObtain the campaign ID and intended workflow from the incident owner; retain current values.

Saved lab campaign: inactive

Open to enlarge
Actual saved LAB01 Active control is N.
Native saved-field capture, November 6, 2026. LAB01 has Active N; no control was changed. This is an observed stop state, not an active test fixture.

Saved lab campaign: manual mode

Open to enlarge
Actual saved LAB01 Dial Method control is MANUAL.
Native saved-field capture, November 6, 2026. MANUAL is the saved method. This campaign should not be expected to autodial.

Saved lab campaign: zero automatic dial level

Open to enlarge
Actual saved LAB01 Auto Dial Level is 0.
Native saved-field capture, November 6, 2026. Auto Dial Level is 0. No setting, agent state or live call was changed to obtain this image.

You should seeYou have selected the correct branch. MANUAL with no automatic attempts is expected behavior; Active N is a deliberate stop until an activation is approved.

Follow the approved manual call workflow

Trace inbound DID routing

2. Verify the affected agent is available on the same campaign

  1. On the Agent screen, compare the logged-in user and campaign with the incident record. Read the current state: PAUSED, waiting/available, in a call, or waiting for disposition. Use Admin’s real-time report for the same user as a second observation if you have access.
  2. If PAUSED is intentional, record it as the stop state. Only when the agent is actually ready for the approved work, select RESUME and check that the screen changes to its available/waiting state. Complete any pending disposition through the normal Agent workflow before expecting another call.
  3. If the station connection or session audio is absent, stop this branch and follow the phone-login or station setup guide. Reaching an Agent page is not proof of a connected phone leg.
  4. If the Agent screen and live report disagree after their normal refresh, record both states and the same timestamp. Preserve the session for the supervisor to inspect; do not delete live-agent rows or reset campaigns.

Idle Agent screen with call controls and blank lead details.

Open to enlarge
Idle Agent screen with call controls and blank lead details.
Actual historical idle Agent screen, August 11, 2026.
Capture detailsIt illustrates the workspace only; it is not the current affected user, a READY-state proof, a registered station or a completed call.

You should seeMatch: the same user/campaign is available with the expected station session. Different: a pause, pending work or station failure explains the next action. Unknown: send the paired observations to the session owner.

Resolve a rejected station login

Check the phone or WebRTC station

3. Match one intended lead to the campaign’s eligibility gates

  1. In Lists → Show Lists, open the list containing the authorized test lead or affected work. Compare its saved Campaign and Active controls with the campaign from step 1. Record the values before any correction.
  2. In the campaign Modify screen, read Dial Statuses, Local Call Time and any lead filter or recycle rule in use. Through the authorized lead-search screen, inspect one intended lead’s status and list ID without copying its phone number or personal fields into a ticket.
  3. Compare the lead’s status with an allowed Dial Status, its list with the selected campaign, and the current time with the applicable lead-local calling window. A NEW lead is eligible by status only when NEW is among the campaign’s dial statuses; a list’s total count is not its eligible count.
  4. If a list association or Active flag is wrong on an approved isolated test, record the old value, change only that field, SUBMIT and reopen the record. If the block is a calling window, consent rule, filter or retry limit, honor that rule or have its owner correct the underlying test data; do not disable it to force a call.
  5. If everything visible matches but eligibility is still unknown, record the specific filter/recycle rule for the campaign owner. Do not reset called statuses or the entire hopper as a first diagnostic.
List
Your actual list ID → same campaign IDReopen after an approved save; an unsaved dropdown is not evidence.
Lead status
A status present in the campaign’s Dial StatusesUse an authorized record; report only the status and a safe internal reference.
Time / filters
Within the applicable window and included by the configured rulesCheck the relevant time zone; server time and lead-local time can differ.

Where to compare the list’s campaign and active flag

Open to enlarge
Native list controls with campaign LAB01 and Active Y in an unsaved example.
Actual browser capture, November 4, 2026; VICIdial 2.14-969a build 261102-0125.
Capture detailsThese are unsaved entries on example list 90001, not proof of its saved state, lead counts or eligibility. Inspect your own existing list.

You should seeYou can name either a failed eligibility rule or one specific intended lead whose visible gates match. That is enough to proceed to staging; it is not proof a call was attempted.

4. Check whether eligible work is staged for this campaign

  1. If you have only Admin access, use the campaign’s hopper view/count available in your build and record its timestamp. If that view is unavailable, give the read-only database owner the aggregate query below; do not create a broader login during an incident.
  2. For a local SQL check, first complete Create a read-only database account for safe VICIdial queries. Open the client with sudo mysql --defaults-file=/etc/vicidial-readonly.cnf and verify SELECT CURRENT_USER(), DATABASE(); before entering this query.
  3. Replace REPLACE_WITH_CAMPAIGN_ID with the exact campaign ID from step 1. Keep the surrounding single quotes. For an ID containing a quote, have the database owner supply a correctly quoted value instead of editing SQL by trial and error.
  4. Run the query, record the status counts and time, then type quit to leave the client. After an approved eligibility correction, allow the site’s normal hopper refresh and check once more; do not interpret a single instant as a permanent state.
Before you use it
Enter this in the verified read-only MariaDB client, not the Linux shell. Replace the campaign placeholder first.
Count only the chosen campaign’s staged rows
SELECT status, COUNT(*) AS queued_leadsFROM vicidial_hopperWHERE campaign_id = 'REPLACE_WITH_CAMPAIGN_ID'GROUP BY status;
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
Rows contain status totals for that campaign, or the client reports an empty set. Save only these aggregate observations and their time.
Stop if
Access denied: have the database owner review this one table’s authorized access. Unknown table/database: verify the selected schema. No rows is a diagnostic result, not a SQL error.
Interpret the hopper result with the previous gatesScroll sideways to compare columns
ResultWhat it establishesNext action
No rows; an earlier gate failedNo work is staged and a blocking condition is already knownCorrect that specific approved gate or retain its intentional stop; do not reset the hopper.
No rows; visible gates match after normal refreshStaging needs investigationEscalate with campaign, status/filter/window observations and timestamp so the server owner can inspect hopper processes and logs.
Rows exist; agent is unavailableStaged work exists but the agent/session gate is not passedReturn to the affected agent’s state and station check.
Rows exist; automatic mode and agent gates matchThe next distinction is whether an attempt startsObserve one approved test and follow dialplan/carrier diagnosis if an attempt starts then fails.
No database/report accessHopper state remains unknownAsk the authorized owner for this aggregate count; continue recording the already-observed gates.

You should seeThe aggregate distinguishes no staged rows from staged work at that moment. It does not identify a dialplan failure or prove a dial attempt.

Set up and verify the read-only client

Trace a call attempt through the dialplan

5. Verify one correction or hand off the first unresolved gate

  1. For an approved change, reopen the exact record and confirm the saved value. Keep its original value in your change record and wait for the normal report/hopper refresh before comparing again.
  2. If testing is authorized, use one approved test destination in the intended workflow. Observe the Agent state and supervisor report together: did an attempt start, did it reach the intended destination, and did the final disposition save? Record these as separate results.
  3. If the same symptom remains, return the changed field to its recorded value when that rollback is appropriate for the approved change, SUBMIT and reopen. Do not compound the uncertainty with unrelated dial-level, status-reset or carrier changes.
  4. Complete the handoff below with observed values and the earliest unknown or failing gate. Omit passwords, phone numbers, lead names and raw database rows. A diagnosis with a precise owner/check is a completed diagnostic outcome even when no call was authorized.
Before you use it
Use internal IDs and aggregate counts only. This is a blank worksheet, not an observed result.
Copy a concise diagnostic handoff
Observed at / time zone:Campaign ID / intended work:Saved Dial Method / Active / Auto Dial Level:Agent user / campaign / state / station observation:List ID / saved campaign / Active:Lead status / allowed status / calling-window result:Hopper status counts / observed at (or UNKNOWN):First failed or unknown gate:One approved change / original value / saved value:Retest: no test | no attempt | attempt failed | destination reachedDisposition saved / rollback confirmed:Next owner / exact next check:
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
Another operator can reproduce the first unresolved check without guessing the campaign, time or change history.
Stop if
If a field is unavailable, write UNKNOWN and name the owner who can supply it; do not turn an assumption into a pass.

You should seeDone means either the original symptom was reproduced and the approved correction was verified, or the next owner has the exact failing/unknown gate and evidence needed to continue. A screenshot or a positive hopper count is not a completed call.

Recorded lab terminal checks

Recorded lab checks were run against the synthetic demo on November 4, 2026. These read-only observations supplement the configuration steps above; they do not establish that a call, route, recording or report workflow succeeded.

Recorded lab observation: At capture LAB01 was inactive and MANUAL; this is a configuration observation, not proof of dial readiness.

Recorded lab observation: List 90001 was active and associated with LAB01; active list does not override inactive campaign.

Recorded lab observation: Three synthetic lab leads were NEW. Status counts do not prove eligibility, successful dialing or lead handling.

Recorded lab observation: No matching hopper rows at capture; this alone does not diagnose a fault or justify a reset.

Before you use it
These historical commands were captured in a root shell using database vicidb and /etc/vicidial-readonly.cnf. The private client file in Create a read-only database account for safe VICIdial queries is root-owned with mode 0600: use the approved root context from that guide, or invoke mysql through sudo as it describes. A regular user cannot read that file. On your own server use your authorized connection and test campaign/list IDs; changed commands are not this exact capture. Do not print the credential file.
Read-only demo checks
mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT campaign_id, active, dial_method FROM vicidial_campaigns WHERE campaign_id='LAB01';"mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT list_id, campaign_id, active FROM vicidial_lists WHERE list_id=90001 AND campaign_id='LAB01';"mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT status, COUNT(*) AS lead_count FROM vicidial_list WHERE list_id=90001 GROUP BY status ORDER BY status;"mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT COUNT(*) AS hopper_count FROM vicidial_hopper WHERE campaign_id='LAB01' AND list_id=90001;"
Evidence · Actual read-only SSH captures · synthetic demo records · ViciBox 12 / SVN 4037

Captured demo response · 2026-11-04T22:37:45.695257Z. 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: mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT campaign_id, active, dial_method FROM vicidial_campaigns WHERE campaign_id='LAB01';"
campaign_id active dial_method
LAB01 N MANUAL
Command output line: mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT list_id, campaign_id, active FROM vicidial_lists WHERE list_id=90001 AND campaign_id='LAB01';"
list_id campaign_id active
90001 LAB01 Y
Command output line: mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT status, COUNT(*) AS lead_count FROM vicidial_list WHERE list_id=90001 GROUP BY status ORDER BY status;"
status lead_count
NEW 3
Command output line: mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --batch vicidb -e "SELECT COUNT(*) AS hopper_count FROM vicidial_hopper WHERE campaign_id='LAB01' AND list_id=90001;"
hopper_count
0
Success looks like
Compare the returned rows with the specific task and capture time. An empty result or zero count is an observation to explain, not a complete diagnosis or evidence of a working call.
Stop if
For a connection, permission, schema or missing-test-ID error, check the approved client configuration and installed version first. Do not broaden permissions or change production data to match this demonstration.

Inspect LAB01, list 90001 and the hopper

Duration 0:33
Rendered actual SSH capture
Steps and result4 steps

See scoped read-only queries against the synthetic lab campaign and list.

Observed read-only resultLAB01 was inactive and MANUAL; list 90001 was active with three NEW leads and zero matching hopper rows. This does not prove dialing or diagnose the hopper.

Read the captured terminal transcript

Read the chapter notes
  1. LAB01 campaign was inactive and set to MANUAL.

    Read-only captured command and output; rendered for this replay.

  2. List 90001 belonged to LAB01 and was active.

    Read-only captured command and output; rendered for this replay.

  3. The synthetic list contained three leads with status NEW.

    Read-only captured command and output; rendered for this replay.

  4. The scoped hopper count was zero. This alone is not a diagnosis.

    Read-only captured command and output; rendered for this replay.

November 4, 2026 · ViciBox 12 · SVN 4037. LAB01 was inactive. Counts alone do not demonstrate dialing or diagnose the hopper. Rendered actual SSH capture using xterm.js; paced still frames, not a live terminal recording. SSH client warning omitted from captured output. Use fullscreen to read the terminal output.

View still screenshots

Recorded lab terminal: lab campaign

Open to enlarge
Rendered actual SSH command and output for lab campaign
Rendered actual SSH transcript captured 2026-11-04T22:37:45.695257Z, ViciBox 12 / SVN 4037.
Capture detailsRead-only observation, not a completed call or routing test. Display trims blank space; enlargement opens the complete original. SSH client post-quantum warning on stderr omitted; SQL stdout preserved. Aggregate counts or schema only; no customer rows.

Recorded lab terminal: lab list

Open to enlarge
Rendered actual SSH command and output for lab list
Rendered actual SSH transcript captured 2026-11-04T22:37:48.369112Z, ViciBox 12 / SVN 4037.
Capture detailsRead-only observation, not a completed call or routing test. Display trims blank space; enlargement opens the complete original. SSH client post-quantum warning on stderr omitted; SQL stdout preserved. Aggregate counts or schema only; no customer rows.

You should seeThe recorded lab command and output show exactly what the demo returned. Use the original workflow’s separate end-to-end acceptance checks before declaring success.

Checks and sources

What was checked

  • Instructions are based on the linked project documentation and sanitized interface captures. The captures do not prove registration, a completed call, a transfer, callback or audio quality.
  • The lab runs VICIdial SVN 4037, database schema 1748 and Asterisk 18.26.4-vici. Labels, enabled features and provider requirements can differ on another installation.
  • The saved training campaign is an inactive MANUAL campaign with Auto Dial Level 0. Historical forms and idle screens show where to inspect controls; they do not demonstrate an active automatic campaign or completed call. The reader follows their own campaign’s saved values.
  • Reviewed read-only SSH observations were added from the ViciBox 12 / SVN 4037 demo on November 4, 2026. Captures show point-in-time state, not successful calling, routing, audio, API writes or recovery.

Primary references

Sources

  1. VICIdial Agent API referenceVICIdial Group · accessed November 4, 2026
  2. VICIdial status definitionsVICIdial Group · accessed November 4, 2026
  3. VICIdial Non-Agent API referenceVICIdial Group · accessed November 4, 2026