Call Center Staffing Calculator

Call Center Staffing Calculator

Optimize your workforce using Erlang C methodology

Total incoming calls in a 60-minute window.
Talk time + hold time + wrap-up time.
Percentage of calls to be answered within target time.
Answer time threshold (e.g., "within 20 seconds").
Breaks, training, meetings, and absenteeism.

Staffing Requirements

Raw Agents Needed
0
Before Shrinkage
Total Staff Required
0
Including Shrinkage
Agent Occupancy
0%
Efficiency Level
Traffic Intensity
0
Erlangs
Note: Occupancy is high. This may lead to agent burnout and high attrition.

Understanding Call Center Staffing Calculations

Calculating the correct number of agents is critical for maintaining high customer satisfaction while controlling operational costs. This tool utilizes the Erlang C formula, the industry-standard mathematical model for determining the number of service resources needed based on call volume and handle time.

Key Metrics Explained

  • Calls Per Hour: The volume of workload expected during a peak interval.
  • Average Handle Time (AHT): The total duration of the customer interaction, including talk time and post-call work.
  • Service Level: The performance goal, traditionally expressed as "X% of calls answered in Y seconds" (e.g., 80/20).
  • Shrinkage: A multiplier that accounts for time agents are paid but not available to take calls (vacation, breaks, training, coaching).
  • Occupancy: The percentage of time agents spend actively handling calls versus waiting for new ones. High occupancy (over 85-90%) often leads to burnout.

How to Use the Staffing Calculator

To get an accurate staffing forecast, follow these steps:

  1. Enter your peak hourly call volume. Forecasts should be based on historical data or marketing projections.
  2. Input your Average Handle Time in seconds. Be sure to include wrap-up time.
  3. Define your Service Level objectives. A standard goal is 80% answered within 20 seconds.
  4. Factor in shrinkage. In most professional call centers, shrinkage ranges from 30% to 35%.
  5. Click "Calculate" to see the "Raw" count (agents on the phone) and "Total Staff" (total headcount needed on the roster for that shift).

Staffing Example

Imagine a support center receiving 400 calls per hour with an AHT of 240 seconds. To reach an 80/20 service level with 30% shrinkage:

  • The traffic intensity is 26.67 Erlangs.
  • The calculator determines that 31 "Raw" agents are needed to meet the service level.
  • Applying 30% shrinkage (31 / (1 – 0.30)), the total headcount required is 45 agents.
function calculateStaffing() { var callsPerHour = parseFloat(document.getElementById('callsPerHour').value); var aht = parseFloat(document.getElementById('avgHandleTime').value); var targetSL = parseFloat(document.getElementById('targetServiceLevel').value) / 100; var targetTime = parseFloat(document.getElementById('targetTime').value); var shrinkage = parseFloat(document.getElementById('shrinkage').value) / 100; if (isNaN(callsPerHour) || isNaN(aht) || isNaN(targetSL) || isNaN(targetTime) || isNaN(shrinkage)) { alert("Please enter valid numerical values for all fields."); return; } // Traffic Intensity (A) in Erlangs var intensity = (callsPerHour * aht) / 3600; // Find minimum number of agents (m must be > intensity) var m = Math.max(1, Math.ceil(intensity) + 1); var serviceLevelAchieved = 0; var probabilityOfWaiting = 0; // Erlang C Loop to find required agents var maxIterations = 500; // Safety break var found = false; while (m = targetSL) { serviceLevelAchieved = sl; probabilityOfWaiting = pw; found = true; break; } m++; } if (found) { var totalStaff = Math.ceil(m / (1 – shrinkage)); var occupancy = (intensity / m) * 100; document.getElementById('rawAgents').innerText = m; document.getElementById('totalAgents').innerText = totalStaff; document.getElementById('occupancy').innerText = occupancy.toFixed(1) + "%"; document.getElementById('intensity').innerText = intensity.toFixed(2); document.getElementById('results-area').style.display = 'block'; if (occupancy > 88) { document.getElementById('sl-warning').style.display = 'block'; } else { document.getElementById('sl-warning').style.display = 'none'; } // Scroll to results document.getElementById('results-area').scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } else { alert("Could not calculate. Check your inputs."); } } function getProbabilityOfWaiting(m, intensity) { // Formula for Erlang C: Pw = [ (A^m / m!) * (m / (m – A)) ] / [ sum_{k=0}^{m-1} (A^k / k!) + (A^m / m!) * (m / (m – A)) ] // To handle large numbers and factorials, we use a ratio-based approach var erlangB_inv = 1; for (var i = 1; i <= m; i++) { erlangB_inv = 1 + (i / intensity) * erlangB_inv; } var erlangB = 1 / erlangB_inv; var pw = (m * erlangB) / (m – intensity * (1 – erlangB)); return Math.max(0, Math.min(1, pw)); }

Leave a Reply

Your email address will not be published. Required fields are marked *