npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@vicistack/vicidial-callback-automation

v1.0.0

Published

Your VICIdial Callbacks Are Broken — Here's Why Nobody's Getting Called Back — ViciStack call center engineering guide

Readme

Your VICIdial Callbacks Are Broken — Here's Why Nobody's Getting Called Back

Last updated: March 2026 | Reading time: ~16 minutes You just had a 3-minute conversation with a hot prospect. They are interested, but they are in a meeting. "Call me back at 2 PM." Your agent dispositions the call, types a note, and moves on to the next dial. At 2 PM, nothing happens. The callback was never scheduled, or it was scheduled but the system did not fire it, or it fired but routed to a different agent who had no context. The prospect picks up, hears a cold open from a stranger, and hangs up. This happens thousands of times a day across VICIdial operations worldwide. Not because VICIdial lacks callback functionality --- it has one of the most capable callback systems of any dialer --- but because most operators never configure it properly and most agents never learn the difference between a CALLBK and a CBHOLD. This guide covers everything about VICIdial's callback system: how it works at the database and cron job level, the three callback types and when to use each, configuration steps with exact admin paths, scheduling best practices based on lead type and vertical, callback tracking and reporting, and the operational mistakes that cause callbacks to fail silently. If your callback completion rate is below 80%, you are leaving revenue on the table. Let us fix that. ViciStack configures callback automation as part of every deployment, including optimal scheduling windows, agent routing, and CRM integration. Get callback right from day one. --- ## How VICIdial Callbacks Work Internally Before you can optimize callbacks, you need to understand the machinery. VICIdial's callback system involves three components: the vicidial_callbacks table, the callback_check cron process, and the hopper injection mechanism. ### The vicidial_callbacks Table Every scheduled callback in VICIdial creates a row in the vicidial_callbacks table: | Column | Purpose | |--------|---------| | callback_id | Auto-increment primary key | | lead_id | The lead to call back (links to vicidial_list) | | list_id | The list the lead belongs to | | campaign_id | The campaign to dial the callback from | | status | LIVE (pending), ACTIVE (being dialed), INACTIVE (completed/expired) | | entry_time | When the callback was created | | callback_time | When the callback should fire | | modify_date | Last modification timestamp | | user | The agent who scheduled the callback | | recipient | USERONLY, ANYONE, or a specific user ID | | comments | Agent notes about the callback | | customer_timezone | GMT offset of the lead | | lead_status | The lead's disposition when the callback was scheduled | When an agent schedules a callback through the agent interface, VICIdial inserts a row here with status = LIVE and the requested callback_time. The system then waits. ### The callback_check Process VICIdial runs a cron job (actually, a screen process) called AST_VDcallback_check.pl that executes every minute. This script: 1. Queries vicidial_callbacks for all rows where status = LIVE and callback_time <= NOW() 2. For each matching callback, checks whether the lead is eligible for dialing (not on DNC, not in a restricted timezone, not already in an active call) 3. Injects the lead into the hopper with elevated priority 4. Updates the callback status to ACTIVE The critical detail here is hopper injection priority. Callbacks are injected into the hopper with a higher priority than regular leads. This means the predictive dialer will dial callback leads before pulling new leads from the list. The exact priority is configurable, but by default callbacks jump to the front of the line. This is why callbacks work even when you have thousands of leads in your list --- the callback lead gets dialed first, regardless of how many other leads are waiting. ### What Happens When a Callback Fires When the callback lead reaches the front of the hopper and the dialer places the call: - For USERONLY/CALLBK callbacks: The system checks if the specific agent is available. If the agent is logged in, on a pause, or in wrap-up, the call waits in queue for that agent. If the agent is not logged in, the callback remains in LIVE status and rechecks every minute. - For ANYONE/CBHOLD callbacks: The call routes to any available agent in the campaign, just like a regular outbound call. When the call connects and the agent takes it, VICIdial's agent screen displays a callback indicator with the original agent's notes. The callback status changes to INACTIVE and the normal disposition workflow takes over. --- ## The Three Callback Types VICIdial supports three callback mechanisms, each suited to different operational scenarios. Understanding the differences is the key to getting callbacks right. ### CALLBK (Agent-Specific Callback) When an agent dispositions a call as CALLBK, VICIdial prompts them to select a date and time for the callback and optionally add notes. The callback is tied to that specific agent --- only they will receive the call when it fires. How to configure: 1. Navigate to Admin > Campaigns > [Campaign] > Dispositions 2. Ensure CALLBK is in the campaign's disposition list (it is included by default) 3. In Admin > Campaigns > [Campaign] > Detail, verify that Scheduled Callbacks is set to Y When an agent uses CALLBK: 1. Agent clicks CALLBK in the disposition panel 2. A date/time picker appears --- agent selects the callback date and time 3. Agent enters callback notes (e.g., "Interested in premium plan, call back after 2 PM, ask for Sarah") 4. Agent submits --- VICIdial creates the vicidial_callbacks entry with recipient = USERONLY Best used for: - Relationship-based sales (insurance, financial services, real estate) - Complex sales with multi-call close cycles - Situations where the prospect asked for a specific person - Warm transfers that need follow-up by the original agent Limitations: - If the agent is not logged in when the callback fires, it does not route to anyone else --- it just retries every minute - If the agent quits or is terminated, their callbacks become orphaned (you need a cleanup process) - Creates agent dependency --- your best leads are locked to specific agents ### CBHOLD (Campaign Callback) CBHOLD works like CALLBK except the callback routes to any available agent in the campaign, not a specific person. This is the "anyone available" callback. How to configure: 1. Navigate to Admin > Campaigns > [Campaign] > Dispositions 2. Add CBHOLD to the campaign's active dispositions if not present 3. The Scheduled Callbacks setting must be Y When an agent uses CBHOLD: The same date/time picker and notes interface appears, but the callback is created with recipient = ANYONE. When it fires, the lead enters the hopper and routes to whoever is available. Best used for: - High-volume operations where individual agent relationships do not matter - Operations with high agent turnover - Scenarios where the callback is about timing, not about the specific agent (e.g., "call back after 5 PM" for timezone reasons) - Lead reactivation campaigns Advantages over CALLBK: - Never orphaned --- any agent can take the call - Higher completion rates because availability is not agent-dependent - Better for operations with shift-based scheduling ### USERONLY (Direct Agent Assignment) USERONLY is not a disposition status --- it is a callback recipient type that can be configured programmatically or through the API. It functions like CALLBK but with more control: sql -- Insert a USERONLY callback via direct database manipulation INSERT INTO vicidial_callbacks ( lead_id, list_id, campaign_id, status, entry_time, callback_time, user, recipient, comments ) VALUES ( 12345, 100, 'SALES', 'LIVE', NOW(), '2026-03-19 14:00:00', 'agent001', 'USERONLY', 'API-scheduled: follow up on pricing discussion' ); Best used for: - CRM-driven callback scheduling where an external system determines who should call - Manager-assigned callbacks - API integrations that schedule callbacks based on business logic outside VICIdial --- ## Configuring Callback Dispositions Getting callbacks to work correctly requires configuration at the campaign level, the disposition level, and the agent training level. ### Campaign-Level Callback Settings Navigate to Admin > Campaigns > [Campaign Name] > Detail. The callback-relevant settings are: | Setting | Recommended Value | Purpose | |---------|------------------|---------| | Scheduled Callbacks | Y | Enables the callback system for this campaign | | Callback Days Limit | 30-90 | Maximum number of days in the future an agent can schedule a callback | | Callback Active Limit | 50-100 per agent | Maximum pending callbacks per agent (prevents agents from hoarding callbacks) | | Callback Hours Block | N | If Y, prevents callbacks from firing outside campaign calling hours | | Callback List Calltime Check | Y | Ensures callbacks respect list-level call time restrictions | The Callback Active Limit is important. Without it, an agent who dispositions every difficult call as CALLBK will accumulate hundreds of pending callbacks, effectively hoarding leads. Set this to a reasonable number based on your sales cycle length. For high-velocity sales (solar, insurance quotes), 20-30 is appropriate. For longer-cycle B2B sales, 50-100 may be needed. ### Disposition Configuration The default VICIdial dispositions include CALLBK and CBHOLD. If you have removed them or are using custom dispositions, you need to ensure callback-type dispositions are properly configured. Navigate to Admin > Campaigns > [Campaign] > Dispositions: 1. Click "Add New Status" if CALLBK or CBHOLD are not present 2. Set the disposition properties: - Status: CALLBK (or your custom callback status name) - Description: Agent Callback - Selectable: Y - Human Answered: Y - Category: CALLBACK - Min Seconds: 0 - Max Seconds: 0 The Category = CALLBACK designation is what triggers VICIdial's callback scheduling interface when the agent selects this disposition. Without this category, the agent will not get the date/time picker. ### Custom Callback Statuses You can create multiple callback-type dispositions for different scenarios: | Status | Description | Recipient | Use Case | |--------|-------------|-----------|----------| | CALLBK | Agent Callback | USERONLY | Standard agent-specific callback | | CBHOLD | Campaign Callback | ANYONE | Standard campaign-wide callback | | CB15M | Quick Callback (15 min) | ANYONE | Lead is busy, try again shortly | | CB24H | Next Day Callback | USERONLY | Lead requested next-day follow-up | | CBPM | PM Callback | ANYONE | Lead only available after 5 PM | Each custom status needs the CALLBACK category to trigger the scheduling interface. For statuses like CB15M where the timing is standardized, you can use VICIdial's auto-callback feature (covered below) to skip the manual scheduling step. --- ## Scheduling Best Practices When a callback fires matters as much as whether it fires at all. Here are scheduling recommendations based on lead type, vertical, and data from production VICIdial operations. ### Optimal Callback Windows by Lead Type | Lead Type | First Callback Window | Second Attempt | Third Attempt | |-----------|----------------------|----------------|---------------| | Hot inbound lead (just filled out a form) | 5-15 minutes | 1 hour | 4 hours | | Warm outbound (interested but busy) | 15-30 minutes | 2-4 hours | Next business day | | Appointment setting | Exact time requested | 15 min after requested time | Next business day | | Re-engagement (old lead) | 24-48 hours | 3-5 business days | 7-10 business days | | Post-sale follow-up | 24-72 hours | 7 business days | 30 business days | The 5-minute rule for hot leads: Research consistently shows that the probability of contacting a lead drops by 10x if you wait more than 5 minutes after they submit a form. If you are running inbound web leads, your callback system should fire within 5 minutes. VICIdial can do this --- but only if the lead is loaded into the system quickly (via API, not manual upload) and the hopper is configured to process callbacks with high priority. ### Time-of-Day Optimization Not all callback times are equal. Based on aggregated contact rate data across outbound dialing operations: | Time Window | Contact Rate Index | Notes | |-------------|-------------------|-------| | 8:00-9:00 AM | 85 | People are commuting, lower answer rate | | 9:00-11:00


Read the full article

About

Built by ViciStack — enterprise VoIP and call center infrastructure.

License

MIT