Here is a number that should bother you: the average outbound call center converts between 2% and 5% of its leads on the first dial pass. That means 95-98% of the leads you paid for -- the ones that cost $8, $15, $25 each depending on your vertical -- get dialed once or twice, catch a No Answer or Busy signal, and then sit in your vicidial_list table collecting dust while you load the next batch of fresh records.
Do the math. 10,000 leads at $15 each = $150,000. First pass converts 350 leads. CPA: $428. A recycling framework that recovers just 15% more conversions from those same leads -- 52 additional sales -- drops your CPA to $372 without buying a single new record. At 30% recovery, 105 additional sales, CPA falls to $329. Same leads. Same agents. Same infrastructure. Zero incremental data cost.
Most VICIdial operators understand recycling conceptually. Some have even turned it on under Admin > Campaigns > Lead Recycling. But the gap between "recycling is enabled" and "recycling is systematically producing recovered conversions" is enormous.
How VICIdial Recycling Actually Works Under the Hood
VICIdial's recycling operates at two distinct levels, and confusing them is the source of most recycling misconfigurations.
Intra-Day Recycling: The Built-In Engine
The native lead recycling feature is configured per-campaign. For each disposition you want to recycle, you set two parameters:
- Attempt Delay: Seconds before the lead becomes eligible for the hopper again (minimum 120, maximum 43,199)
- Attempt Maximum: How many recycling attempts for this disposition (1 to 10)
When a call gets a recyclable disposition -- say NA (No Answer) -- the engine marks the lead with a timestamp. After the delay expires, the lead re-enters the dial queue automatically, no list reset needed.
The critical limitation: Maximum delay is 43,199 seconds -- just under 12 hours. Intra-day recycling doesn't reliably span midnight boundaries. A lead dispositioned NA at 4 PM with an 8-hour delay becomes eligible at midnight. If your campaign isn't running at midnight, that lead never gets dialed. It just sits there.
This isn't a bug. It's a design constraint. The recycling engine was built for same-day retry patterns.
Multi-Day Recycling: List Resets + Dial Statuses
For anything spanning more than a single shift, you need three mechanisms working together:
Dial Statuses: Determines which lead statuses are eligible for the hopper. If NA is checked, any lead with status NA that hasn't been called since the last reset enters the hopper.
List Resets: Flipping the
called_since_last_resetflag makes leads eligible again.Lead Filters: SQL WHERE clauses that restrict hopper eligibility beyond the status check. This is how you enforce attempt caps and age restrictions across passes.
The overnight workflow: campaign ends, cron job resets called_since_last_reset for qualifying leads, next morning those leads enter the hopper because their status is in the dial status list and their flag is reset.
The Disposition Recycling Matrix
Not all dispositions deserve the same treatment. A Busy signal means something entirely different from a No Answer, which means something different from a voicemail where your agent left a message. Your recycling rules need to reflect this.
| Disposition | What Happened | Intra-Day Delay | Intra-Day Max | Multi-Day Treatment | Total Cap |
|---|---|---|---|---|---|
| B (Busy) | Line occupied | 5 min | 5 | Reset daily | 15 |
| NA (No Answer) | Ring, no pickup | 1 hr | 3 | Reset daily, vary time-of-day | 12 |
| A (Answering Machine) | Agent heard VM | 2 hr | 2 | Reset every other day | 8 |
| AA (Auto-Detected VM) | AMD flagged machine | 3 hr | 2 | Reset every other day | 8 |
| ADC (Carrier No Answer) | Network failure | 30 min | 3 | Reset daily | 10 |
| LMVM (Left Voicemail) | Agent left message | 4 hr | 1 | Reset after 48 hours | 4 |
| DECMKR (Decision Maker Unavail) | Wrong person answered | 2 hr | 2 | Reset daily, vary time-of-day | 10 |
| HUAGNT (Hung Up on Agent) | Immediate hangup | 6 hr | 1 | Reset after 72 hours | 3 |
| DROP (Dropped Call) | No agent available | 10 min | 4 | Reset daily | 12 |
Why These Specific Delays
Busy (5 minutes): The person is literally on the phone. They'll be done soon. Aggressive retry captures people near their phone and active.
No Answer (1 hour): The prospect is unavailable -- at work, driving, ignoring unknown numbers. Retrying in 5 minutes just rings the same empty room. One-hour offset puts you in a different activity window. Three intra-day attempts cover morning, midday, and afternoon.
Answering Machine (2 hours): Person either screens calls or is genuinely unavailable. Limiting to 2 intra-day retries avoids filling someone's voicemail box, which generates complaints.
Left Voicemail (4 hours): This is the most mishandled disposition. Your agent left a message. The prospect has your number. They may call back. Calling again in 30 minutes undermines the voicemail's purpose and comes across as aggressive. One intra-day retry is enough.
Hung Up on Agent (6 hours): They answered, recognized the call, made a deliberate choice. Calling back within an hour is the fastest path to a DNC request or spam report. Six-hour delay and single retry respects the signal while leaving one door open.
Dropped Call (10 minutes): The person answered but no agent was available to take the call. The prospect doesn't know what happened -- they just heard silence or a brief message. Quick retry catches them while they're still near the phone and curious about who called.
Setting This Up in VICIdial
Navigate to Admin > Campaigns > [Campaign] > Lead Recycling. Add a row for each status with the delay and max from the matrix.
Then ensure your campaign's Dial Statuses include all recyclable statuses. For custom dispositions like LMVM and DECMKR, create them first under Admin > Campaign > Campaign Statuses with Dialable = Y.
The Three-Pass Framework
Single-pass dialing is like fishing a lake once and concluding there are no fish. The contacts are there -- you just haven't reached them at the right time yet.
Pass 1: Fresh Leads (Days 1-3)
Highest-value window. Peak intent. Aggressive intra-day recycling using the full matrix.
- Lead Order: DOWN (newest first) or DOWN RANK if using lead scoring
- Nightly resets: Every night, reset all recyclable statuses with called_count < 8
- Expected contact rate: 15-25% on quality leads
- Expected conversion: 3-6% of total leads
Pass 2: Warm Recycle (Days 4-14)
Leads that survived Pass 1 without converting. Shift from volume to timing.
- Lead Order: DOWN COUNT (lowest call count first -- gives underworked leads priority)
- Longer delays: 2 hours for B, 4 hours for NA, 6 hours for A
- Resets: Every other night. Exclude LMVM and DECMKR from resets -- if multiple voicemails and gatekeeper conversations haven't worked, more won't help.
- Time-of-day variation: Use lead filters to dial at different times than Pass 1
- Expected contact rate: 8-15%
- Expected incremental conversion: 1-2% of original lead count
Pass 3: Aged Leads (Days 15-45)
Hard to reach but surprisingly high conversion rate on the contacts you do make. The timing finally aligned.
- Lead Order: RANDOM (eliminates remaining time-of-day patterns)
- Intra-day recycling: Disabled. One attempt per day max.
- Resets: Twice weekly (Monday and Thursday), only NA and B, called_count < 20
- Different caller ID: Avoid number fatigue from previous passes
- Different script: Acknowledge the multiple contacts. "I know we've been trying to reach you" works better than pretending it's a first contact.
- Expected contact rate: 4-8%
- Expected incremental conversion: 0.5-1% of original lead count
Why Three Passes
Three maps to three distinct behavioral phases:
- Fresh interest window (Pass 1): Prospect is actively seeking information. Speed and frequency matter.
- Scheduling mismatch window (Pass 2): Prospect is reachable but you haven't hit the right time. Varied timing matters.
- Circumstance change window (Pass 3): Prospect's situation or availability shifted. Patience and different approach matter.
A fourth or fifth pass rarely produces enough incremental conversion to justify agent time, caller ID wear, and compliance risk.
Automating Pass Transitions
Schedule transitions as nightly cron jobs:
# 11 PM: Move Day 3+ leads from Pass 1 lists to Pass 2 lists
0 23 * * * mysql -u vicidialuser -p'pass' asterisk -e "..."
# 11:05 PM: Move Day 14+ leads from Pass 2 to Pass 3
5 23 * * * mysql -u vicidialuser -p'pass' asterisk -e "..."
# 11:10 PM: Retire Day 45+ leads to archive lists
10 23 * * * mysql -u vicidialuser -p'pass' asterisk -e "..."
# 11:15 PM: Reset appropriate leads for next day
15 23 * * * mysql -u vicidialuser -p'pass' asterisk -e "..."
List Mix: Blending Fresh and Recycled
List Mix lets a single campaign dial from multiple lists with a controlled ratio. Instead of hoping the hopper pulls proportionally, you define the blend explicitly.
Configure at Admin > Campaigns > [Campaign] > List Mix:
| Order | List ID | Description | Mix % | Statuses |
|---|---|---|---|---|
| 1 | 1001 | Fresh leads - Source A | 40% | NEW |
| 2 | 1002 | Fresh leads - Source B | 20% | NEW |
| 3 | 2001 | Pass 2 recycle - Source A | 25% | NA, B, A |
| 4 | 2002 | Pass 2 recycle - Source B | 15% | NA, B, A |
This ensures 60% of dial capacity goes to fresh leads, 40% works the recycle pool. Without List Mix, the hopper might load 90% recycled leads (there are more of them) and starve fresh leads.
For the most sophisticated setups, shift the blend throughout the day:
- Morning: 70% fresh / 30% recycle (business hours, web forms flowing)
- Afternoon: 50/50 (catching morning NA leads)
- Evening: 30% fresh / 70% recycle (residential availability peaks)
Priority Injection
Not all recycled leads are equal. A lead that filled out a detailed form and got dispositioned NA three days ago is worth more than a bulk list lead that's never answered.
Use VICIdial's rank field with lead order DOWN RANK:
| Lead Type | Rank |
|---|---|
| High-value quote request | 90-99 |
| Callback request / inbound inquiry | 80-89 |
| Multi-step form completion | 70-79 |
| Single-step form | 50-59 |
| Purchased list (verified) | 30-39 |
| Purchased list (unverified) | 10-19 |
| Aged recycle (Pass 3) | 1-9 |
Dynamically adjust rank based on disposition history: boost rank for DECMKR leads (they answer the phone, you just haven't reached the right person). Reduce rank for leads hitting voicemail repeatedly.
For real-time priority injection -- when a web form comes in for a lead already in your recycled pool -- use VICIdial's Non-Agent API to update rank and reset the flag. The lead jumps to the front of the queue within 30-60 seconds.
When to Stop: The Diminishing Returns Math
From a real insurance campaign (50,000 leads, 30 agents):
| Pass | Attempts | Incremental CPA |
|---|---|---|
| Pass 1 (Days 1-3) | 1-8 | $562 |
| Pass 2 (Days 4-14) | 9-15 | $327 |
| Pass 3 (Days 15-45) | 16-20 | $450 |
| Pass 4 (Days 46-90) | 21-25 | $1,800 |
Pass 2 is actually cheaper than Pass 1 because the lead cost is sunk. Pass 3 is viable if margins support $450 CPA. Pass 4 is almost certainly unprofitable.
Hard Stops to Enforce
- Max called_count: 20 total attempts for most verticals
- Max age: 90 days from entry. Data quality degrades beyond this.
- Voicemail-only retirement: 6+ attempts with no human contact = stop dialing
- Contact-without-conversion retirement: 3+ human contacts without converting = move to low-priority reactivation
And the compliance ceiling: every additional attempt increases TCPA exposure, caller ID flagging risk, and consumer complaint volume. If the math says 25 profitable attempts, cap at 20 to protect caller ID reputation.
Real-Time Priority Injection via API
When a web form submission comes in for a lead that already exists in your recycled pool, use VICIdial's Non-Agent API to update it immediately:
/vicidial/non_agent_api.php?function=update_lead&lead_id=12345&rank=95&called_since_last_reset=N&source=WEB_REINQUIRY
This makes the lead eligible for the hopper with rank 95 on the next refill cycle -- typically within 30-60 seconds. A prospect who was dispositioned NA three days ago just visited your website and filled out another form. That behavioral signal means they're back in the market. Getting them dialed within minutes instead of hours can be the difference between a conversion and a lost opportunity.
Automating List-Level Recycling
For BPOs running multiple campaigns, automate the entire recycling lifecycle with cron jobs that handle pass transitions, resets, and retirement. The automation should run late at night when no campaigns are active, moving leads between pass lists based on age and attempt counts, resetting flags for the next day's dialing, and retiring leads that have exceeded their useful life.
Key principle: every lead should flow through the system automatically without manual intervention. If someone has to remember to reset a list or move leads between passes, it won't happen consistently. Automation is the difference between a recycling "strategy" and a recycling system.
Monitoring Recycling Performance
Track these weekly:
- Incremental contact rate per pass: How many new contacts each pass generates
- Conversion recovery rate: Percentage of total conversions from Pass 2+. Below 15% means underperforming. Above 40% means under-dialing on Pass 1.
- Disposition recycle yield: Which dispositions produce the most recovered contacts. If recycled A leads convert at 0.01% while recycled B leads convert at 0.8%, recycle Busy leads more aggressively.
Callback-Recycling Integration
Callbacks and recycling should work together. When a callback is scheduled (CALLBK), the lead exits the recycling pool -- it's in the callback queue with its own priority. But when a scheduled callback fails (agent calls at the appointed time, gets no answer), the lead should re-enter recycling with boosted priority.
Without this, failed callbacks fall into a black hole -- not in the recycling queue (status is CALLBK) and not in the callback queue (time has passed). Catch them with a nightly job that resets callbacks older than 24 hours back to NA status with a rank boost.
Time-of-Day Recycling Optimization
The most sophisticated setups shift the blend throughout the day to match when different lead types are most likely to answer:
Morning (8 AM - 12 PM): 70% fresh leads / 30% recycle. Business hours, web forms flowing in. Focus on fresh data.
Afternoon (12 PM - 5 PM): 50% fresh / 50% recycle. Catch morning NA leads who were commuting or in meetings.
Evening (5 PM - 9 PM): 30% fresh / 70% recycle. Residential availability peaks. The morning and afternoon NA leads are now home from work.
This approach maximizes contact rate across the entire day by matching lead types to the times they're most reachable.
Monitoring Recycling Performance in Detail
A recycling strategy is only as good as the data you use to tune it. Without per-pass and per-disposition metrics, you're guessing at delays and attempt caps instead of optimizing them.
Key Metrics to Track Weekly
Incremental contact rate per pass. The most important recycling metric. How many new contacts is each pass generating? If Pass 3 contacts are below 4%, the pass isn't producing enough incremental value.
Conversion recovery rate. What percentage of total conversions came from recycled leads (Pass 2+)? Below 15% means underperforming recycling. Above 40% suggests you're under-dialing on Pass 1 -- fresh leads should be producing more.
Disposition recycle yield. Which dispositions produce the most recovered contacts when recycled? If recycled A (Answering Machine) leads convert at 0.01% while recycled B (Busy) leads convert at 0.8%, recycle Busy leads more aggressively and back off on Answering Machine.
Weekly Review Process
Every Monday morning:
- What was the incremental contact rate for each pass last week?
- Which dispositions produced the most recovered conversions?
- Are any passes showing diminishing returns below breakeven?
- Did any caller IDs get flagged? (Check carrier reports)
- Are attempt caps being reached on any significant lead segments?
Adjust delays, attempt caps, and pass boundaries based on data. A recycling framework that doesn't get tuned monthly is a recycling framework that gradually becomes a waste of agent time.
Compliance Ceiling
Beyond the financial math, regulatory and reputational risks escalate with each additional dial:
- TCPA exposure: Every call outside permitted hours or to DNC numbers is $500-$1,500 per violation. More attempts = more exposure windows.
- Caller ID flagging: Carriers and labeling services (Nomorobo, Hiya, TNS) track patterns. Numbers repeatedly calling the same destination get flagged. DID management burden scales directly with recycling volume.
- Consumer complaints: The FTC tracks complaints per campaign. Higher volumes trigger investigations.
These factors should push your hard stop threshold lower than the pure financial breakeven. Build compliance margin into your caps.
ViciStack models the optimal recycling curve for specific verticals and lead sources. The difference between guessing at delays and optimizing them is usually 15-30% more recovered conversions.
Originally published at https://vicistack.com/blog/vicidial-lead-recycling/
Top comments (0)