Collections Staffing Optimization
Data-Driven Agent Allocation & Dialer Strategy
February 17, 2026
Executive Summary
53.9%
Queue calls to never-answered numbers
527K
Wasted calls / month (84K phones)
36 + 2
Calling agents + team leads
The binding constraint on Fido's collections operation is call list quality — 53.9% of all queue calls go to phone numbers that never answered once. Of 978,947 calls in January, 527,521 went to 84,113 phones with zero answers all month. Agent headcount (36) is correct. The problem is what the dialer feeds them and when.
The operation runs through 9 XCALLY campaigns, each targeting a DPD segment. Three structural problems emerged: (1) the dpd_0_2 campaign — highest answer rate at 30.5% — only runs 2 of 5 salary phases; (2) GH_Regular_Calls (DPD 31-60) is absent during Post-Salary and answer rates collapse from 24% to 4.7% through the month due to wrong-time dialing; (3) 4 agents spend 271 talk hours/month on DPD 90+ at a flat 5.8% rate that doesn't respond to timing changes — this segment should be IVR outside salary week.
The recommendation: 36 calling agents + 2 team leads (1 per shift or 1 per 18 agents). Not 5 managers. The 41-person roster includes 3 part-time or supervisory staff who don't make full-time calls — reassign or formalize their role. With list optimization (suppressing unreachable numbers), 25 agents can handle mid-month volume, but keep 36 on roster for salary-week surge when answer rates and borrower liquidity peak simultaneously. Borrow 3–5 CX agents during salary week. Six quick wins — all zero cost — can start this week.
Team Parameters
| Parameter | Value | Notes |
| Calling agents (recommended) | 36 | Full-time callers on XCALLY campaigns |
| Team leads | 2 | 1 per 18 agents (or 1 per shift). Monitor queues, escalate, QA. |
| Current roster | 41 | 36 effective + 5 part-time/supervisory. Reassign 3 or formalize roles. |
| Salary-week boost | +3–5 CX | Borrowed from CX team for dpd_0_2 and Reference campaigns only. |
| Mid-month (with list optimization) | ~25 active | 11 agents rotate to training, QA, reactivation outreach. |
| Median calls / agent / day | 144 | — |
| Agent cost / month | GHS 5,000 | — |
| Agent cost per handled call | GHS 1.65 | — |
| Shift hours | 12 (7 AM – 7 PM) | — |
Do we need 5 managers? No. Two team leads are sufficient for a 36-agent team. The current roster gap (41 − 36 = 5) is not 5 managers — it’s 3 part-time/low-output staff plus 2 who function as supervisors. Formalize 2 as team leads; the other 3 should either move to full-time calling or be reassigned.
The Value Map
By DPD Bucket
| DPD | GHS / Call (24h) | % of Total GHS | Rec. Dials / Week |
| 1 – 7 | 299 | 78% | Daily (5/wk) |
| 8 – 14 | 62 | 7% | 4 / week |
| 15 – 30 | 59 | 9% | 3 / week |
| 31 – 60 | 42 | 4% | 2 / week |
| 61 – 90 | 25 | 1% | 1 / week |
| 90+ | 12 | <1% | Targeted only |
By Hour Block
| Block | Hours | GHS / Call | Answer Rate | Daily GHS |
| Power | 7 – 9 AM | 129 | 11.9% | 116K |
| Peak | 9 AM – 1 PM | 182 | 12.8% | 291K |
| Grind | 1 – 5 PM | 135 | 9.5% | 135K |
| Mop-up | 5 – 7 PM | 85 | 8.5% | 34K |
Salary Phase Analysis
The paradox: The team is right-sized on average but wrong-sized on any given day. Monthly utilization swings 2.9x — from 29 calls/agent/hour in post-salary to 84 during salary week — driven by the Ghanaian salary cycle. A flat roster is still optimal because the cost of carrying 4 “excess” agents in quiet periods (GHS 20K/month) is recouped during the 8-day surge window (~GHS 30K in incremental recoveries).
| Phase | Days of Month | Calls / Agent / Hour | Answer Rate | Optimal Agents |
| Post-Salary | 1 – 5 | 29.3 | 12.8% | 41 |
| Transition | 6 – 9 | 48.2 | 10.8% | 34 |
| Mid-Month | 10 – 20 | 78.3 | 8.1% | 26 |
| Pre-Salary | 21 – 24 | 50.6 | 7.8% | 25 |
| Salary Week | 25 – 31 | 84.2 | 12.4% | 40 |
Post-salary and salary-week phases represent just 12 of 22 working days but generate disproportionate recoveries due to higher answer rates and borrower liquidity. These are the windows where every additional agent seat earns its keep.
Staffing Model Results
32
Supply saturation point
36
Recommended (effective)
4,550
Optimized supply target
Marginal Value Curve
| Agents | Marginal GHS / Agent / Day | Cumulative Daily GHS | Note |
| 10 | 4,200 | 42,000 | Steep value zone |
| 16 | 3,100 | 91,600 | Minimum viable team |
| 20 | 2,400 | 139,600 | Diminishing returns begin |
| 25 | 1,600 | 179,600 | Mid-month optimal |
| 30 | 900 | 207,100 | Approaching saturation |
| 32 | 650 | 214,400 | Supply saturation |
| 36 | 350 | 222,800 | Recommended — surge buffer |
| 40 | 150 | 228,800 | Surge-only ROI |
| 45 | 50 | 231,050 | Idle capacity; no value |
Why 36, not 25? Mid-month, only ~25 agents are fully utilized on calls. But salary week (days 25–31) needs all 36 plus 3–5 CX agents. Hiring and firing on a monthly cycle is impractical, so we maintain 36 and rotate the “excess” 11 agents during quiet weeks into training, QA reviews, and reactivation outreach (SMS/WhatsApp for unreachable accounts).
Would list optimization change the headcount? Yes, partially. Suppressing 84K unreachable numbers means the dialer feeds agents better-quality calls — answer rates rise, and fewer agents are needed to cover the same volume. But the salary-week surge still demands 36+ agents. List optimization means mid-month could run with ~20 agents (vs 25 today), freeing even more capacity for reactivation and training. The roster stays at 36.
Agent Allocation Model
Framework: ROI-Based List Coverage
Headcount is the output, not a constraint. For each DPD bucket in each salary phase, we compute the agents required to serve the available list at the auto-dialer’s physical capacity. If the list justifies more agents, we hire; if not, we redeploy or release.
Input 1
Daily List Size
DPD bucket × salary phase
×
Input 2
Answer Rate
attempt-level, per DPD
÷
Input 3
Agent Capacity
3600 ÷ (talk + 45s wrap)
→
Output
Agents Needed
per Phase × Hour Block
agents = ∑DPD (list_size × answer_rate / hours_in_block) / (3600 / cycle_time)
| cycle_time = avg_talk + 45s | cost = GHS 30/agent-hr
Why cycle time instead of observed throughput? Observed calls/agent-hr is endogenous — overstaffing depresses it artificially. Cycle time (how long each call physically takes) is staffing-independent, giving an objective capacity ceiling per agent.
GHS Per Agent-Hour by DPD Bucket
Revenue generated per hour an agent spends on each DPD bucket (capacity/hr × GHS/answered call from attribution model). Bars use √-scale to show lower-value buckets more clearly. Every bucket clears the GHS 30 cost threshold — list size is the binding constraint, not ROI.
Bar width = √(GHS/hr) scale • Return multiples vs GHS 30 cost: Pre-Due 378× • DPD 1–7 323× • DPD 8–14 68× • DPD 15–30 67× • DPD 31–60 45× • DPD 61–90 30× • DPD 90+ 15×
Agents Needed by Hour Block × Salary Phase
Total agents across all DPD buckets per shift segment. Agent capacity is long-run flexible (hire/fire), short-run firm (plan 4+ weeks ahead). Color intensity = agent count.
|
Post-Salary Days 1–5 |
Transition Days 6–9 |
Mid-Month Days 10–20 |
Pre-Salary Days 21–24 |
Salary-Week Days 25–31 |
Power 7–9 AM (2 hrs) |
43 |
32 |
28 |
32 |
34 |
Peak 9 AM–1 PM (4 hrs) |
13 |
9 |
8 |
10 |
10 |
Grind 1–5 PM (4 hrs) |
3 |
2 |
2 |
2 |
3 |
Reading the heatmap: Power needs 28–43 agents because the full daily list is fresh and answer rates peak in the morning (37–38% for Pre-Due; 28% for DPD 1–7). By Peak, most first-attempt contacts are exhausted — only second/third-attempt callbacks remain, cutting demand to 8–13 agents. Grind is purely residual (2–3 agents on low-answer-rate re-dials). Post-Salary drives the 43-agent peak because the DPD 1–7 list swells to 10,668 contacts — the post-payday default wave.
Portfolio DPD Composition by Salary Phase
What’s in the dialer queue at each phase. Post-Salary is DPD 1–7 heavy; Mid-Month accumulates DPD 15–30; Pre-Salary shows the largest DPD 15–30 pile-up.
Post-Salary (Days 1–5) 34,295 contacts
DPD 1–7 dominates at 31% — post-payday default wave is the driver
Transition (Days 6–9) 33,766 contacts
DPD 1–7 + DPD 8–14 = 48% — early delinquency still dominant
Mid-Month (Days 10–20) 33,970 contacts
DPD 15–30 now largest bucket at 25% — shift staffing toward mid-range DPD
Pre-Salary (Days 21–24) 35,304 contacts
DPD 15–30 spikes to 38% — month-end delinquency pile-up before next payday
Salary-Week (Days 25–31) 31,397 contacts
Pre-Due surges back to 16% as paydays approach — fresh contacts for high-return first calls
Answer Rate Decay by Attempt Number
How answer rates fall with each re-dial. Informs when to stop re-dialing and reassign agents to fresher lists. Color intensity = answer rate (darker = higher).
| DPD Bucket |
1st Call |
2nd Call |
3rd Call |
4th–5th |
6th+ |
| Pre-Due |
37.6% |
30.7% |
29.0% |
25.4% |
23.3% |
| DPD 1–7 |
27.7% |
25.1% |
22.7% |
19.2% |
11.5% ⚠ |
| DPD 8–14 |
32.0% |
9.6% ⚡ |
11.7% |
15.6% |
9.0% |
| DPD 15–30 |
9.3% |
8.9% |
7.9% |
7.7% |
6.7% |
| DPD 31–60 |
10.7% |
9.8% |
9.7% |
10.1% |
8.5% |
| DPD 61–90 |
13.4% |
10.7% |
10.7% |
10.2% |
7.6% |
| DPD 90+ |
15.2% |
13.4% |
10.6% |
9.8% |
7.5% |
⚡ DPD 8–14: answer rate collapses 70% on 2nd attempt — first call is critical; re-dialing is low-yield. ⚠ DPD 1–7: rate halves by 6th+ attempt — diminishing returns after 3rd call.
Priority Dispatch: Agent Assignment Rules
Tier 1 — Highest Priority
Pre-Due + DPD 1–7
GHS 9,680–11,323/agent-hr. Assign all available agents here first. These contacts just crossed their due date — answer rates are highest, urgency is highest, and recovery per call is 25× the next tier. Exhaust this list before moving agents down.
Tier 2 — Second Priority
DPD 8–14 + DPD 15–30
GHS 2,004–2,048/agent-hr. Once Tier 1 is covered, move surplus agents here. DPD 8–14 has a uniquely high first-call rate (32%) — call once, then move on; re-dials are low-yield. DPD 15–30 is large (especially Pre-Salary at 13K) and flat answer rates reward volume coverage.
Tier 3 — Fill Remaining Capacity
DPD 31–60, 61–90, 90+
GHS 445–1,354/agent-hr. Still 15–45× above cost — always run these; never idle agents. DPD 90+ works well in Mop-up (5–7 PM) when primary lists are exhausted. Redeploy agents between tiers at block transitions (end of Power, end of Peak).
Operational rule (Power block): Staff at the Power-block peak count for the salary phase. For Post-Salary that means 43 agents checked in by 7 AM. After Power ends, release agents not needed for Peak (redeploy or break); keep 2–3 agents on Grind for residual callbacks. This structure saves approximately 30 agent-hours/day compared to holding peak headcount throughout the shift.
Quick Wins — Zero-Cost, This Week
1
Suppress unreachable numbers + reactivation campaigns
What: Mark 16,591 phone numbers (called 11+ times, zero answers) as “unreachable” in the dialer. Remove them from all auto-dial campaigns.
Why: These dead numbers consume 361,551 calls/month — 37% of all queue volume. The dialer wastes agent wait time cycling through them.
How: Export list from Snowflake (phones with 10+ attempts, 0 answers in XCALLY_CALL_RECORDS). Upload as suppression list in XCALLY. Create separate “Reactivation” campaign: try alternate numbers from loan application, send SMS/WhatsApp with callback link. Re-enter auto-dial after 30 days or if they respond to SMS.
Owner: Data Analyst (extract list) + Campaign Ops (upload suppression + create reactivation campaign)
Free 361K calls/month for reachable borrowers
2
Run dpd_0_2 campaign all month
What: Extend dpd_0_2 to Post-Salary, Transition, and Mid-Month phases. Currently it only runs during Pre-Salary and Salary-Week.
Why: dpd_0_2 has the highest answer rate in the portfolio (30.5%). Borrowers at DPD 0–2 are the most likely to pick up and pay — catching them early prevents them from rolling into deeper delinquency. No reason to stop calling them 3 weeks of the month.
How: In XCALLY, enable dpd_0_2 campaign for all salary phases. Assign 6–8 agents in non-salary periods, 10 + 3 CX during salary week. Morning priority (7 AM–1 PM).
Owner: Campaign Ops (campaign scheduling change — ~15 min in XCALLY admin)
+~15K answered calls/month at 30.5% rate
3
Start GH_Regular during Post-Salary (days 1–5)
What: Activate the GH_Regular campaign (DPD 31–60) during Post-Salary phase. Currently, these accounts are not called at all during days 1–5.
Why: Post-Salary is when borrowers have the most cash (just received salary). DPD 31–60 accounts are already delinquent — this is the best window to catch them with money in hand. Answer rates during Post-Salary are 12.8% (highest of all phases).
How: Enable GH_Regular for Post-Salary in XCALLY. Assign 6 agents, morning hours only (7 AM–12 PM).
Owner: Campaign Ops
New coverage window at peak-liquidity phase
4
Shift GH_Regular to morning hours only
What: Restrict GH_Regular campaign to Power (7–9 AM) and Peak (9 AM–1 PM) blocks. Stop afternoon calling for this campaign.
Why: GH_Regular answer rate is 15–24% in the morning and drops to 2–6% after 1 PM. Afternoon calls to DPD 31–60 accounts are essentially wasted — agents sit through rings and voicemails. Redirecting those agents to New_Model_B or Reference campaigns in the afternoon produces higher returns.
How: Set GH_Regular campaign hours to 7:00–13:00 in XCALLY. Agents on GH_Regular shift to New_Model_B or GH_Reference after 1 PM.
Owner: Campaign Ops + Team Leads (afternoon reassignment)
2x answer rate from time-window adjustment
5
Move DPD 90+ to IVR outside salary week
What: Replace agent calls with IVR (automated voice) for GH_Legal and GH_Legal_Discount campaigns during Post-Salary, Transition, Mid-Month, and Pre-Salary. Keep agent calls only during Salary-Week (days 25–31).
Why: DPD 90+ answer rate is flat at 5.8% regardless of what time, day, or phase agents call. Timing optimization has zero effect. 4 agents spend 271 talk hours/month on this segment. IVR can deliver the same legal notice message at a fraction of the cost. During salary week, agent calls add a human touch when borrowers are most likely to have cash.
How: Create IVR lists for GH_Legal and GH_Legal_Discount. Set up automated dialing with pre-recorded legal notice + payment instructions + callback option. During salary week, switch back to agent-dialed. Reassign the 4 freed agents to dpd_0_2 and New_Model_B.
Owner: Data Analyst (IVR lists) + IVR Admin (recording + scheduling) + Campaign Ops (agent reassignment)
Free 4 agents for higher-yield campaigns 3 weeks/month
6
Borrow 3–5 CX agents during salary week
What: During days 25–31, move 3–5 agents from the Customer Experience team to collections. Assign them to dpd_0_2 (highest answer rate) and GH_Reference (high answer rate, simple script).
Why: Salary week combines peak answer rates (12.4%) with peak borrower liquidity. Every additional agent seat during this window earns its keep. CX agents already know the product and can handle basic collections scripts. CX volume typically dips during salary week (fewer complaints when people have money).
How: Coordinate with CX Manager on a recurring monthly schedule. Pre-train CX agents on dpd_0_2 and Reference scripts (1-hour training). Log into XCALLY with collections queues. Track their performance separately for the first 2 months.
Owner: Ops Lead + CX Manager (scheduling) + Team Leads (onboarding + QA)
+3–5 agents at 25–30% answer rate campaigns
6 Quick Wins • Zero Cost
Measure via answer-to-attempt ratio: target improvement from ~10:1 to ~6:1
Performance KPIs
| KPI | Minimum | Basis |
| Answered calls / day | 126 | P25 benchmark |
| GHS / call (non-salary periods) | 75 | Q4 floor |
| Talk time / day | 2.0 hours | Full-time threshold |
| Comment rate | 40% | Quality benchmark |
| Active days / month | 18 / 22 | 82% attendance |
Methodology & Caveats
| Dimension | Detail |
| Attribution model | 24-hour upper-bound, last-touch. Payments within 24h of answered call attributed to that call. |
| Salary cycle validation | 2.9x utilization swing confirmed (29.3 to 84.2 calls/agent/hour across phases). |
| Agent rankings | Non-salary metric used to strip the 8.3-position scheduling bias present in raw rankings. |
| Call list quality | Binding constraint. 53.9% of calls go to never-answered numbers. Campaign scheduling and list hygiene are the primary levers. |
| Analysis window | January 18 – February 16, 2026 (30 days). |
| Data source | Snowflake: BACKEND_NOTIFICATIONS, PAYMENT_TBL, LOAN_INFO_TBL, CALL_LOG_TBL. |
Key limitation: The 24h attribution window is an upper-bound estimate. Some payments within 24h of a call may have occurred regardless. The true causal impact of calls is lower than reported, but the relative ranking across DPD buckets and time blocks is stable.