vicigeeksimple guides
Browse
Dialing

VICIdial & agents · Dialing · Hopper explained

VICIdial hopper explained: functions, settings and examples

Follow a lead from its list through AST_VDhopper.pl to manual or automatic dialing. Understand eligibility, hopper sizing, states, callbacks and recycling, with screenshots and a real 108,288-lead empty-hopper example.

Start the guide

What the hopper actually does

The hopper is a staging queue of leads that can be presented for dialing. The full lead database can contain hundreds of thousands of records; the hopper holds a smaller working set selected under campaign rules. AST_VDhopper.pl prepares that working set. A separate dialing process consumes it and requests the call.

Hopper Level therefore describes a refill threshold, not the number of calls currently ringing and not a strict maximum row count. A campaign can have a large active list and an empty hopper when none of its leads pass the selection gates. Conversely, an old READY row can remain after the underlying lead or campaign changes.

The objects a lead passes throughScroll sideways to compare columns
ObjectPurposeWhat to inspect
vicidial_listIndividual lead records, current result status and call/reset counters.Does this lead match the campaign's dial statuses and reset rules?
vicidial_listsThe list's campaign, active flag, expiry and list-level call-time choice.Is its parent list eligible?
vicidial_hopperThe staged lead reference, queue state, source and priority.Is the row READY, reserved, held or already consumed?
vicidial_manager / vicidial_auto_callsOutgoing call request and live call-tracking state.Did the dialing consumer create a request after taking the row?

You should seeRead the lead pool, the staged queue and live calls as three different measurements.

How the loader starts

The reviewed script reads /etc/astguiclient.conf for its database connection and paths, then loads server and system settings. It is a scheduled job, so not seeing a persistent AST_VDhopper.pl process between runs does not prove it is stopped.

This demo has one active root-cron entry running the hopper every two minutes. The commented entry above it would run every minute. The script header recommends one scheduled loader for the dialing system, running every minute during operating hours. The two-minute cadence below is an observation, not a configuration to copy blindly.

ADMIN_keepalive_ALL.pl has its own once-per-minute schedule. Its role includes maintaining long-running dialer and manager processes. The automatic dialer, fill helper, manager sender and manager listener were running during this inspection; keepalive is not a substitute for the hopper's cron entry.

Before you use it
Run on the identified dialer server with permission to read its current crontab. This command reads the schedule and does not execute the script.
Inspect the installed hopper schedule
crontab -l | grep -E '^([^#].*AST_VDhopper\.pl|#.*AST_VDhopper\.pl)'
Evidence · Author-provided captured transcript

Captured demo response · Capture date is documented with the article evidence.. 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: crontab -l | grep -E '^([^#].*AST_VDhopper\.pl|#.*AST_VDhopper\.pl)'
#* * * * * /usr/share/astguiclient/AST_VDhopper.pl -q
*/2 * * * * /usr/share/astguiclient/AST_VDhopper.pl -q
Success looks like
Find one intended active entry and distinguish it from commented examples. Here */2 means every two minutes.
Stop if
If the schedule is absent or duplicated, reconcile ownership and the scheduler first. Do not start a second loader to compensate.

Recorded crontab excerpt showing a commented one-minute hopper job and an active two-minute job

Open to enlarge
Recorded crontab excerpt showing a commented one-minute hopper job and an active two-minute job
November 9, 2026 · Rendered transcript of actual read-only SSH output.
Capture detailsOnly the relevant crontab lines are selected by the displayed command. This establishes the configured schedule, not that a call completed.

You should seeConfirm both the schedule and fresh run evidence. The demo's recent hopper runs were visible at 12:06, 12:08 and 12:10 server time.

The lead-selection gates

The standard loading loop selects active campaigns. Within each campaign, it builds a candidate set from list membership, allowed call times, status and additional configured restrictions. The checks work together: passing one check does not override another.

For standard source-S loading in this build, called_since_last_reset must equal N. This is separate from the lead's result status. A lead can still say NEW while its called flag is Y, and that combination is not a standard uncalled candidate. Callback, recycling, API and alternate-number paths have their own rules.

Standard hopper selection, in practical inspection orderScroll sideways to compare columns
GateWhat must be trueTypical reason for zero candidates
CampaignActive and using the standard hopper path.Inactive campaign or No Hopper Dialing enabled.
ListAssigned to the campaign, active and not expired.Wrong campaign, inactive list or expired date.
Dial statusThe lead's current status is among the configured Dial Statuses.List contains PU, PM or other results the campaign does not dial.
Called/reset stateStandard loading requires called_since_last_reset = N.Matching leads were already attempted since the last reset.
Calling windowCampaign/list time rules and the lead's GMT/state conditions permit calling now.The lead's local window is closed even though the server's clock looks acceptable.
Optional restrictionsLead filter, attempt limits, drop lockout, quotas and applicable DNC checks pass.A configured restriction excludes the remaining candidates.
Existing workThe lead is not already staged; enabled duplicate checks also pass.The candidate already has a hopper row or an excluded vendor code.

Native VICIdial list controls locating campaign assignment, Active and reset choices

Open to enlarge
Native VICIdial list controls locating campaign assignment, Active and reset choices
November 4, 2026 · Native VICIdial browser screenshot of unsaved example values.
Capture detailsIt locates the list's campaign, Active and reset controls. No values were submitted; this is not evidence of a saved list reset or today's campaign state.

You should seeIdentify the first failing gate before considering a change.

Example: 108,288 leads, but zero standard candidates

The SOLAR demo campaign was active, used RATIO dialing, had Hopper Level 5,000 and had two active, unexpired lists. Its allowed dial statuses were N, NA, A, AA and NEW. Its hopper contained no READY rows.

The list total alone looked reassuring. The narrower query explains the result: only 17 leads matched those statuses, and none of those 17 had called_since_last_reset = N. The matching leads were 14 NA and three NEW records, all with a called flag of Y. Most other leads had statuses outside the configured dialing set.

Before you use it
This exact capture uses the existing SELECT-only client configuration and SOLAR's reviewed status set. For another campaign, use its actual statuses and approved connection configuration. The file path is specific to this demo, not a standard VICIdial credential file.
Count the demo's list, status and reset gates
mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --table -e "SELECT COUNT(*) AS total_leads, SUM(v.status IN ('N','NA','A','AA','NEW')) AS matching_status, SUM(v.status IN ('N','NA','A','AA','NEW') AND v.called_since_last_reset='N') AS matching_status_uncalled FROM vicidial_list v JOIN vicidial_lists l ON l.list_id=v.list_id WHERE l.campaign_id='SOLAR' AND l.active='Y' AND l.expiration_date>=CURDATE();"
Evidence · Author-provided captured transcript

Captured demo response · Capture date is documented with the article evidence.. 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 --table -e "SELECT COUNT(*) AS total_leads, SUM(v.status IN ('N','NA','A','AA','NEW')) AS matching_status, SUM(v.status IN ('N','NA','A','AA','NEW') AND v.called_since_last_reset='N') AS matching_status_uncalled FROM vicidial_list v JOIN vicidial_lists l ON l.list_id=v.list_id WHERE l.campaign_id='SOLAR' AND l.active='Y' AND l.expiration_date>=CURDATE();"
+-------------+-----------------+--------------------------+
| total_leads | matching_status | matching_status_uncalled |
+-------------+-----------------+--------------------------+
| 108288 | 17 | 0 |
+-------------+-----------------+--------------------------+
Success looks like
Read the three counts from left to right: 108288 total, 17 matching statuses, zero matching statuses still uncalled. Zero here already explains standard-loader exhaustion before later gates.
Stop if
If candidates remain, continue with call times, filters, limits and DNC rules. Do not assume this query evaluates every gate or change statuses simply to make its final count positive.
Why increasing Hopper Level would not solve this caseScroll sideways to compare columns
MeasurementObserved valueMeaning
Active-list leads108,288Records exist.
Configured-status matches17Most records are outside this campaign's dialing set.
Matching and uncalled since reset0No standard candidates remain at this gate.
Configured hopper level5,000A larger target cannot create eligible leads.

Recorded SQL aggregate showing 108288 leads, 17 matching dial statuses and zero matching uncalled leads

Open to enlarge
Recorded SQL aggregate showing 108288 leads, 17 matching dial statuses and zero matching uncalled leads
November 9, 2026 · Rendered transcript of an actual SELECT-only query.
Capture detailsAggregates contain no phone numbers or individual lead records. This proves the observed status/reset funnel for the demo campaign, not future eligibility after a reset.

You should seeThe next decision is a reviewed lead-status and retry/reset policy. Restarting the loader or raising its target does not address the observed cause.

Campaign settings and their functions

Open Campaigns → the intended campaign and locate its dialing and hopper settings. Field placement varies by build and detail view. The native screenshot below is a control-location illustration; inspect the current saved values on your own system before planning a change.

Settings that influence standard hopper loadingScroll sideways to compare columns
SettingFunctionWhat it does not establish
Hopper Level / Minimum Hopper LevelThe refill threshold, and the floor when automatic sizing is enabled.It is not a count of simultaneous calls or a strict queue ceiling.
Automatic Hopper LevelCalculates demand from recent agent activity, dial level, timeout and multiplier.It cannot make an excluded lead eligible.
Automatic Hopper MultiplierScales the calculated demand.It is not an independent dial-speed control.
Auto Trim HopperIn this build, checks standard/new-source staged counts against twice the target and can delete excess source-S entries.It does not rebuild every row from the lead's latest status.
Lead Order / Secondary Order / List MixChooses and orders the candidates entering a batch.It does not override DNC, time or status gates.
Dial Statuses / Lead Filter / Call Count LimitNarrows the eligible pool.An active list does not guarantee its records pass these checks.
No Hopper DialingSelects a different manual-dialing path; the normal campaign-loading branch is bypassed.It is not a general repair switch for automatic dialing.

Native VICIdial campaign controls for hopper minimum, automatic level, multiplier, trim and reset

Open to enlarge
Native VICIdial campaign controls for hopper minimum, automatic level, multiplier, trim and reset
November 4, 2026 · Native VICIdial browser screenshot showing unsaved example controls.
Capture detailsValues were entered in browser state only and never submitted. The visible Force Reset choice is a field-location reference, not an instruction to use it.

You should seeTreat sizing, selection and dialing pace as related but separate controls.

Example: calculate an automatic hopper target

In the reviewed build, calculated demand is rounded up from multiplier × qualifying agents × auto-dial level × (60 ÷ dial timeout). The effective loading target is the larger of that result and the configured minimum. Qualifying agents include fresh READY, QUEUE, INCALL and CLOSER sessions plus the recently paused sessions accepted by the script's timing checks.

The worksheet uses fictional inputs. Six qualifying agents, dial level 2, a 30-second timeout and multiplier 1 produce 24. With a minimum of 10, the effective target is 24. With a minimum of 100, the same calculation still has an effective target of 100. The stored calculated auto_hopper_level can therefore differ from the minimum actually used for loading.

Before you use it
Use this to understand the arithmetic. These are fictional inputs, not recommended production settings or a live performance test.
Fictional automatic-sizing worksheet
Qualifying agents:       6Auto-dial level:         2Dial timeout:           30 secondsHopper multiplier:       1Configured minimum:     10 Calculated demand = ceil(1 × 6 × 2 × (60 ÷ 30)) = 24Effective target  = max(10, 24) = 24
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
Changing the minimum to 100 gives max(100, 24) = 100. Changing the multiplier changes demand, not lead eligibility.
Stop if
If observed behavior differs, first compare the installed build, agent freshness, dial timeout and saved campaign values. Do not tune pacing from this worksheet alone.

You should seeExplain both the calculated demand and the minimum floor when reviewing an automatic hopper.

The queue lifecycle: READY → QUEUE → INCALL

For automatic dialing, AST_VDauto_dial.pl claims READY rows in descending priority and then hopper_id order, assigning a server-specific owner while changing them to QUEUE. It reads a claimed lead and marks its hopper row INCALL. The call preparation updates reset/attempt counters and removes the consumed hopper row before creating the manager Originate request and the SENT live-call tracking row.

AST_manager_send.pl forwards queued manager actions to Asterisk. The eventual call and disposition workflow updates the lead's result. A row disappearing from vicidial_hopper therefore proves consumption of queue work, not that a person answered or that an agent received usable audio.

Queue states in the installed hopper schemaScroll sideways to compare columns
StateInterpretationInspection point
READYAvailable for the appropriate dialing consumer to claim.Check current lead/list/campaign state as well as this queue label.
QUEUEClaimed or reserved by a consumer.Inspect its owner and corresponding consumer activity.
INCALLSelected during call preparation in the reviewed automatic path.Correlate with live-call and manager state; do not treat it as an answered-call result.
DONEA finished queue state the loader can remove for processed campaigns.Deletion is queue maintenance, not a lead deletion.
HOLDHeld queue work handled by its feature-specific path.Determine the feature and owner before releasing it.
DNCDNC-marked hopper work, including applicable alternate-dial handling.Review the relevant DNC/alternate rules; never force it to READY.
RHOLD / RQUEUEReserved hold/queue variants used by the hold-inserts workflow.This build includes them in its hopper target count; they are not equivalent to immediately available READY rows.

You should seeTrace a call beyond the hopper through its manager request, live-call record and final result when you need proof of dialing or completion.

Example: a READY row can outlive its original eligibility

The demo contained three READY rows at the snapshot below. KPISYN1 had one NEW lead staged and met its minimum of one. LAB01 was inactive but retained one NEW row. SIPPQA1 had a READY row whose lead now said SVYEXT even though that campaign's configured dial status was NEW.

Normal runs process active campaigns; they do not automatically discard all rows belonging to an inactive campaign. The usual maintenance also does not rebuild every existing row against the lead's latest result status. SIPPQA1's retained READY row counted toward its minimum even though the current standard candidate count was zero.

Before you use it
Use the approved SELECT-only configuration. This aggregate joins queue rows to their current lead and campaign without exposing individual lead IDs or phone numbers.
Compare hopper state with current lead and campaign state
mysql --defaults-extra-file=/etc/vicidial-readonly.cnf --table -e "SELECT h.campaign_id, c.active, h.status AS hopper_status, v.status AS lead_status, COUNT(*) AS queued FROM vicidial_hopper h JOIN vicidial_campaigns c ON c.campaign_id=h.campaign_id JOIN vicidial_list v ON v.lead_id=h.lead_id GROUP BY h.campaign_id,c.active,h.status,v.status ORDER BY h.campaign_id;"
Evidence · Author-provided captured transcript

Captured demo response · Capture date is documented with the article evidence.. 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 --table -e "SELECT h.campaign_id, c.active, h.status AS hopper_status, v.status AS lead_status, COUNT(*) AS queued FROM vicidial_hopper h JOIN vicidial_campaigns c ON c.campaign_id=h.campaign_id JOIN vicidial_list v ON v.lead_id=h.lead_id GROUP BY h.campaign_id,c.active,h.status,v.status ORDER BY h.campaign_id;"
+-------------+--------+---------------+-------------+--------+
| campaign_id | active | hopper_status | lead_status | queued |
+-------------+--------+---------------+-------------+--------+
| KPISYN1 | Y | READY | NEW | 1 |
| LAB01 | N | READY | NEW | 1 |
| SIPPQA1 | Y | READY | SVYEXT | 1 |
+-------------+--------+---------------+-------------+--------+
Success looks like
Compare active, hopper_status and lead_status together. Here LAB01 is inactive and SIPPQA1's queued lead is SVYEXT; a READY-only count would miss those distinctions.
Stop if
If a row looks stale, record its scope and review the relevant feature and operating plan before clearing or changing it. This inner-join example is not an orphan-row audit.

Recorded aggregate showing three READY rows, including inactive LAB01 and a SIPPQA1 lead with status SVYEXT

Open to enlarge
Recorded aggregate showing three READY rows, including inactive LAB01 and a SIPPQA1 lead with status SVYEXT
November 9, 2026 · Rendered transcript of actual read-only SQL output.
Capture detailsThese are aggregate queue observations from a demo, not evidence that any row was dialed. No queue entries were changed for this check.

You should seeA hopper count is useful, but pair it with the current lead status and campaign state.

Source codes and dialing priority

The source character records how work entered the hopper. Standard inserts start with source S and priority 0 in this build. Other features can use different sources and priorities, so lead order alone does not explain every row's position.

The automatic consumer claims higher priority first, then hopper_id. In particular, callback and alternate-number work should be understood through their own rules rather than treated as ordinary source-S batches. API insertion is another path: the official API exposes separate hopper insertion and local-call-time-check options, so review those controls when diagnosing an integration.

Source codes documented in the installed loaderScroll sideways to compare columns
SourceOriginWhat to investigate
SStandard hopper loadCampaign eligibility and configured ordering.
NXth NEW lead orderThe configured NEW-to-other-lead ordering strategy.
CScheduled callbackDue time, recipient and callback rules.
RRecycled leadEnabled status, retry delay and maximum attempts.
AAutomatic alternate-number dialingThe prior attempt and applicable alternate-number rules.
PNon-Agent API hopper loadThe caller's API request, priority and call-time-check options.
QNo-hopper queue insertionThe manual/no-hopper consumer path.
DCampaign drop-runThe campaign's drop-run trigger and selected drop statuses.

You should seeUse campaign + status + source + priority to explain the queue, not lead_id order alone.

Manual dialing and the no-hopper option

A MANUAL campaign can use hopper leads. In the reviewed Agent UI backend, Dial Next claims a READY row as QUEUE for the requesting user. The automatic-dialer path instead claims work for a dialing server and creates the outgoing call request according to its pacing logic.

No Hopper Dialing is a separate manual workflow. When enabled, the normal loader branch is bypassed and the script removes applicable non-reserved hopper entries for that campaign. It should be evaluated as a deliberate workflow choice, not toggled to bypass an unexplained eligibility failure.

Distinguish the three workflowsScroll sideways to compare columns
WorkflowWho selects the next workWhat an empty hopper means
Automatic dialingAutomatic dialer using campaign pacing and available capacity.No READY queue work is available through that path; inspect eligibility and the loader.
Manual Dial Next with hopperThe agent action claims a staged READY lead.The agent may have no staged next lead even though records exist in the list.
Manual no-hopper workflowThe configured manual selection path.The standard hopper total is not the complete measure of this workflow's readiness.

You should seeIdentify the actual dialing workflow before deciding which queue measurement matters.

Callbacks, recycling and cleanup

Before and around standard loading, the script performs maintenance. It can remove rows from inactive or expired lists, transition due callbacks, handle applicable ANYONE callback inserts, process automatic alternate-number work and reconsider certain leads held by rolling call-count limits.

Within active campaigns it prepares eligible recycle rules, removes DONE entries, removes work excluded by the relevant list/time conditions, applies optional trimming, and updates campaign statistics and diagnostic output. Callback recipients, inactive-list handling, DNC rules and limits can change the exact behavior. These side paths are why running the whole loader is not a read-only diagnostic.

The demo's diagnostic record for SOLAR reported zero leads to call and ERROR CANNOT ADD ANY LEADS TO HOPPER. AIWARM also reported zero, with no assigned lists. Those messages describe the candidate problem; they do not by themselves indicate a crashed process.

You should seeInterpret a maintenance message in the context of the relevant campaign and feature.

  • Inspect the campaign's hopper debug record and the appropriate daily hopper log privately.
  • Keep raw logs, customer details and individual callback records out of screenshots and support uploads.
  • Correlate timestamps using the server's actual clock and timezone. This demo's server clock was UTC−5 during capture.

A compact read-only inspection sequence

Start with the saved campaign and list controls, then inspect aggregate database state. An approved read-only account helps keep an investigation observational. The demo's /etc/vicidial-readonly.cnf is an existing local client configuration, not a file every installation ships with.

  1. Identify the host, installed script build, actual database name and server timezone.
  2. Confirm one intended schedule and fresh completed-run evidence.
  3. Read campaign Active, dialing method, No Hopper Dialing, Dial Statuses and target settings.
  4. Check assigned lists, Active and expiration dates, then count status/reset candidates.
  5. Continue through local calling time, filters, DNC and attempt/recycling limits if candidates remain.
  6. Compare current hopper rows with campaign/lead state; then inspect the appropriate manual or automatic consumer.
Before you use it
Select your installation's actual database using the approved SELECT-only client. These portable inspection queries were not executed as this combined example; the earlier captured queries have their own exact receipts.
Reader-run aggregate checks in the selected VICIdial database
SELECT campaign_id, active, dial_method, no_hopper_dialing,       hopper_level, use_auto_hopper, auto_hopper_level,       local_call_time, dial_statusesFROM vicidial_campaignsORDER BY campaign_id; SELECT campaign_id, status, source, COUNT(*) AS queuedFROM vicidial_hopperGROUP BY campaign_id, status, sourceORDER BY campaign_id, status, source;
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
Compare saved targets with READY versus held/reserved counts. Follow the matching campaign through its lead-selection gates rather than treating a total as proof of readiness.
Stop if
Stop on an unknown database, missing column or access error. Verify the installed schema and permissions rather than guessing another database or using a write-capable account.

You should seeKeep a dated record of the first failing gate and the next decision it requires.

Do not assume --test or --count-only is harmless

In the inspected build 250224-1641, --test assigns $T and $TEST, but neither flag is checked elsewhere in the script. The live hopper table remains selected and the mutation paths remain reachable. Treating this flag as a dry run would therefore be a mistake in this specific installed build.

The --count-only branch also occurs after an unconditional INSERT IGNORE into vicidial_campaign_stats_debug. It is not strictly read-only. Use SELECT counts for observation. The concurrency guard is separately opt-in through --run-check; the observed cron entry did not include it. This audit did not establish overlapping runs.

Before you use it
This grep reads the reviewed source file. It does not invoke AST_VDhopper.pl. Match the source build before applying the finding to another installation.
Inspect the installed diagnostic-flag references
grep -n -E '\$T\b|\$TEST\b|\$run_check=|if \(\$run_check' /usr/share/astguiclient/AST_VDhopper.pl
Evidence · Author-provided captured transcript

Captured demo response · Capture date is documented with the article evidence.. 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: grep -n -E '\$T\b|\$TEST\b|\$run_check=|if \(\$run_check' /usr/share/astguiclient/AST_VDhopper.pl
126:$run_check=0;
281: $T=1; $TEST=1;
294: $run_check=1;
305:if ($run_check > 0)
Success looks like
The captured lines show the test-flag assignments and the opt-in concurrency guard. Full-source review found no later reads of $T or $TEST; the finding is scoped to this build.
Stop if
Do not execute --test, --count-only or --wipe-hopper-clean to confirm the warning. If your source differs, inspect its control flow and database writes first.

Recorded source-reference grep showing test flags assigned and the concurrency check gated by run_check

Open to enlarge
Recorded source-reference grep showing test flags assigned and the concurrency check gated by run_check
November 9, 2026 · Rendered transcript of actual source-file inspection.
Capture detailsThe screenshot shows matching source lines; the unused-test-flag conclusion also relies on review of the complete installed file. No loader command was executed.

You should seeA flag name is not a safety guarantee. Review the installed implementation and use genuinely read-only queries.

Choose the next check from the symptom

Resolve the observed gate before choosing a change. Clearing queue rows and resetting lead flags are different operations: one removes staged work, while the other can make previously attempted leads available again.

Hopper symptoms and the next useful checkScroll sideways to compare columns
SymptomCheck nextAvoid as the first action
Large list, zero hopperStatus/reset counts, followed by time and optional restrictions.Increasing the target or restarting processes.
No lists or no active listsCampaign assignment, Active and expiration dates.Resetting every lead.
READY rows, agents still waitingActual dialing workflow, consumer state and current lead/campaign eligibility.Assuming READY proves a completed or deliverable call.
Queue drains between scheduled runsFresh run timestamps, eligible supply, consumption and target sizing together.Adding a second competing loader.
Retained row conflicts with current statusIts source, owner, feature and reviewed queue-reconciliation plan.Forcing the state or deleting unrelated campaigns' work.
Considering a resetApproved campaign/list scope, retry policy, calling window and agent readiness.Treating reset as a harmless refresh.

You should seeYou should be able to name the failed gate, show the evidence and state what must be reviewed before changing future dialing work.

Follow the focused empty-hopper diagnostic guide

Review dialing modes and pacing

Download the dated, sanitized inspection receipt

Checks and sources

What was checked

  • Source and runtime inspection: November 9, 2026. Installed AST_VDhopper.pl version 2.14, build 250224-1641; SHA-256 6d3879e1c3158160bfdf3ba61dc66e69bafb99d347362a0cbead7042b5a97b94. The published receipt records the independently verified installed-source hash; behavior described here belongs to that reviewed build.
  • Four command transcripts were captured through an existing read-only inspection workflow. Their screenshots are browser-rendered transcripts of actual SSH output, not native terminal application screenshots. Commands and complete returned lines are selectable in the examples.
  • The two November 4 native VICIdial screenshots show unsaved example controls. They locate the fields and do not establish today's saved settings. No form submission or server mutation was performed to make this article.
  • Observed queue counts are dated snapshots. No end-to-end call, carrier acceptance, agent delivery or audio test was performed. The automatic-sizing calculation is an explicitly fictional worksheet.

Primary references

Sources

  1. ViciGeek installed hopper review: build, checksums and dated aggregate receiptsViciGeek Editorial Desk · first-hand source/runtime inspection · accessed November 9, 2026
  2. VICIdial Non-Agent API: hopper_list, hopper_bulk_insert and add_to_hopper controlsVICIdial Group · accessed November 9, 2026
  3. Asterisk AMI Originate actionAsterisk Project · accessed November 9, 2026