Why the maths matters
Most customer service leaders are comfortable with the qualitative side of WFM — the logic of forecasting, the principles of scheduling, the importance of matching supply to demand. Fewer are comfortable with the quantitative engine that sits underneath it.
That's a gap worth closing. The three formulas covered in this article — Erlang C, shrinkage, and occupancy — are not academic exercises. They are the calculations that turn a volume forecast into a headcount number, that turn a headcount number into a hiring plan, and that tell you whether your operation is running efficiently or burning out your team.
You don't need to run these calculations manually. Tools do that. But you need to understand what drives the outputs — because that's what allows you to interrogate a staffing model, identify where assumptions are wrong, and make decisions that the tools can't make for you.
Erlang C: how many agents do you actually need?
Erlang C is the standard formula for calculating how many agents are required to hit a given service level target. It was developed in the early twentieth century by Danish mathematician Agner Krarup Erlang while working for the Copenhagen Telephone Company — and despite being over a hundred years old, it remains the foundation of virtually every WFM staffing calculation in use today.
The formula takes three inputs and produces one output.
Input 1: Contact volume — how many contacts are expected to arrive in a given time interval. Typically measured per hour or per 30-minute interval.
Input 2: Average Handle Time (AHT) — the average time an agent spends on a single contact, including talk time, hold time, and after-contact work. Measured in seconds or minutes.
Input 3: Service level target — the SLA you're trying to hit. For example, 80% of contacts answered within 20 seconds, or 95% of tickets acknowledged within 4 hours.
Output: Agent requirement — the minimum number of agents needed at that interval to hit the service level target, given the expected volume and handle time.
The relationship between these inputs is non-linear, which is the most important thing to understand about Erlang C. Small changes in AHT have disproportionately large effects on agent requirement. If your volume is 200 contacts per hour and your AHT drops from 12 minutes to 10 minutes, you don't need 17% fewer agents — you might need 25% fewer, depending on your SLA target and the shape of the arrival distribution.
This non-linearity is why AHT reduction is one of the highest-leverage efficiency levers available to a CS leader. Every minute you take out of average handle time compounds across every interval in your schedule.
What Erlang C assumes — and where it breaks down
Erlang C is built on a set of assumptions that hold reasonably well in most contact centre environments but are worth understanding so you know when the formula's outputs need to be treated with caution.
It assumes random contact arrival. Erlang C models contacts as arriving randomly according to a Poisson distribution. In practice, contact arrival is not perfectly random — it follows intraday patterns. This is why you apply Erlang C at the interval level rather than to daily totals: within a 30-minute interval, the random arrival assumption is close enough to hold.
It assumes all agents are identical. The formula doesn't distinguish between a T1 generalist and a T2 specialist. If your team has tiered routing and significant skill variation, you need to run Erlang C separately for each tier and queue, not as a single blended calculation.
It assumes infinite patience. The standard Erlang C formula assumes no customer abandonment — that every customer will wait indefinitely for an agent. In reality, customers abandon queues. Erlang A (an extension of Erlang C) accounts for abandonment, and produces lower agent requirements than Erlang C for the same service level target. For operations with significant abandonment rates, Erlang A is more accurate.
It doesn't account for shrinkage. Erlang C tells you how many productive agent-hours you need. It says nothing about how many agents you need to roster to deliver those productive hours. That's where shrinkage comes in.
Shrinkage: the gap between agents rostered and agents available
Shrinkage is the percentage of paid time that agents are unavailable to handle customer contacts. It is not absenteeism. It encompasses every activity — planned or unplanned — that takes an agent away from the queue during their scheduled shift.
Understanding shrinkage is essential because it determines the relationship between your Erlang C output and your actual headcount requirement. If Erlang C says you need 50 productive agents in a given interval and your shrinkage is 30%, you cannot achieve that with 50 rostered agents. You need significantly more.
Building a shrinkage budget
The most common mistake with shrinkage is using an industry average rather than measuring your own operation. Industry benchmarks of 30–35% are useful as a starting point, but your actual shrinkage will reflect your specific operating model — your training investment, your meeting culture, your sick leave patterns, and your team's adherence behaviour.
A properly built shrinkage budget breaks down every category of unavailable time:
| Category | Typical range |
|---|---|
| Scheduled breaks and lunch | 10–12% |
| Team meetings and huddles | 3–5% |
| Training and coaching sessions | 4–6% |
| One-to-ones and performance reviews | 2–3% |
| Sick leave (rolling average) | 3–5% |
| Late login and system issues | 1–2% |
| Unplanned offline time | 1–2% |
| Total | 24–35% |
Build this budget from your own data, not from a textbook. Pull your actual sick leave rates, measure your average training hours per agent per week, count your meeting load. The more accurate your shrinkage budget, the more accurate your headcount model.
The shrinkage formula: a critical distinction
This is where many operations make a calculation error that understates their true headcount requirement.
The incorrect approach — which is unfortunately common — is to add shrinkage to the Erlang C output:
Agents needed = Erlang output + (Erlang output × shrinkage %)
Using this formula with an Erlang output of 50 and 30% shrinkage gives you 65 agents. This is wrong.
The correct formula uses shrinkage as a divisor:
Agents needed = Erlang output ÷ (1 − shrinkage %)
Using the same inputs: 50 ÷ (1 − 0.30) = 50 ÷ 0.70 = 71.4 agents, rounded up to 72.
The difference is 7 agents. Across a large operation running multiple shifts, this error compounds into a significant and systematic understaffing problem. The additive method understates headcount requirement because it doesn't account for the fact that shrinkage applies to the additional agents too, not just the original Erlang output.
Always use the divisor formula.
Applying the full calculation: a worked example
Suppose you're planning staffing for a Monday morning peak interval — 9:00am to 9:30am — with the following inputs:
- Expected contact volume for the interval: 120 contacts
- Average Handle Time: 8 minutes (480 seconds)
- Service level target: 80% of contacts acknowledged within 10 minutes
- Shrinkage: 28%
Step 1: Run Erlang C with these inputs. The output — which you'd calculate using a WFM tool or an Erlang calculator — gives you a productive agent requirement. For these inputs, Erlang C returns approximately 22 agents needed to hit 80% within 10 minutes.
Step 2: Apply shrinkage using the divisor formula: 22 ÷ (1 − 0.28) = 22 ÷ 0.72 = 30.6 agents, rounded up to 31.
So to have 22 productive agents available during this interval, you need to roster 31. The difference of 9 agents represents your shrinkage load — people who are on break, in training, in a meeting, or logged off for other reasons.
Step 3: Repeat this calculation for every 30-minute interval across every day of your operating week. The result is a staffing requirement curve — a complete picture of how many agents you need rostered at each point in time to hit your SLA targets.
Occupancy: the efficiency dial
If shrinkage tells you the gap between agents rostered and agents available, occupancy tells you how hard the available agents are working. It is the percentage of available time that agents spend actively handling contacts versus waiting for the next one.
The formula is straightforward:
Occupancy % = (Total handle time) ÷ (Total available time) × 100
If an agent is available for 6 hours in a shift (after accounting for shrinkage) and spends 4.8 of those hours handling contacts, their occupancy is 80%.
The occupancy sweet spot
Occupancy has a target range — not a single target — because both extremes create problems.
Too low (below 70%): Agents are spending more time waiting than working. Budget is being wasted on idle capacity. This often indicates overstaffing, particularly during off-peak intervals. It can also demoralise high performers who want to be productive.
Too high (above 85%): Agents have no recovery time between contacts. The psychological pressure of moving immediately from one contact to the next — without a moment to decompress, complete notes, or gather thoughts — accelerates fatigue and burnout. Quality drops. Errors increase. Attrition rises. The cost of replacing burned-out agents far exceeds the apparent efficiency gain.
The target range of 75–85% reflects the point where agents are productively busy without being overwhelmed. Within this range, there is enough contact flow to keep agents engaged, and enough breathing room to maintain quality and sustainability.
In practice, occupancy varies significantly across the day — higher during peak intervals when volume is compressed, lower during off-peak periods. Managing average occupancy across the shift, rather than trying to optimise every interval, is the practical approach.
The relationship between occupancy, AHT, and service level
These three metrics are deeply connected, and understanding the relationship between them is where WFM analysis becomes genuinely useful rather than just mechanical.
When occupancy is too high, agents under pressure tend to rush contacts. AHT drops in the short term — which looks like an efficiency improvement — but quality drops with it. FCR falls. Customers call back. Volume increases. Occupancy goes up further. This is the overload spiral: high occupancy causes lower quality, which causes more contacts, which causes higher occupancy.
When occupancy is too low, agents may unconsciously extend contact duration — taking longer on after-contact work, being more thorough than necessary, or simply moving more slowly. AHT creeps up. The operation becomes less efficient without any visible cause.
The implication for CS leaders is that AHT should be measured in context. An AHT that drops during a period of high occupancy is not necessarily a sign of efficiency improvement — it may be a signal of quality degradation. An AHT that rises during a period of low occupancy may indicate agent disengagement rather than contact complexity.
How the three formulas connect
Erlang C, shrinkage, and occupancy are not independent calculations. They form a chain:
Erlang C takes your volume forecast and AHT and tells you how many productive agent-hours you need to hit your SLA target.
Shrinkage takes that productive agent-hour requirement and tells you how many agents you need to roster to deliver it, accounting for all the time those agents won't be available.
Occupancy takes your rostered headcount and tells you how hard those agents will work — and whether that workload is sustainable.
Running the chain in sequence gives you a complete staffing model: from forecast input to agent requirement to roster size to workload intensity. Changing any input propagates through the whole chain. A 10% increase in forecast volume doesn't just increase your Erlang C output by 10% — it increases roster size, changes occupancy, and may push you toward the burnout threshold if you don't adjust accordingly.
Using the formulas to build a business case
One of the most practical applications of these formulas is justifying headcount investment or tooling changes to senior leadership. Converting operational problems into financial terms is the language that gets budget approved.
A worked example: your operation is currently breaching S1 SLA commitments 4% of the time. Each breach triggers a service credit worth 5% of the customer's monthly fee. Your average monthly fee per customer is €800. With 300 affected customers, that's €1.2 million in annual revenue at risk from SLA breaches alone — before factoring in churn probability.
Running Erlang C with your actual volume and AHT data shows that adding 4 T2 specialists eliminates approximately 70% of those breaches. At a fully loaded cost of €60,000 per specialist annually, the investment is €240,000. The annual service credit exposure it addresses is €840,000. Payback period: under four months.
That is a business case. It is built entirely from WFM formulas applied to operational data.
Common mistakes in applying these formulas
Using daily or weekly volume in Erlang C instead of interval volume. Erlang C must be applied at the interval level — 30-minute or hourly. Applying it to daily totals produces a meaningless output because it averages out the peaks that actually cause SLA breaches.
Forgetting that Erlang C output is a minimum, not a target. The formula gives you the minimum agents needed to hit your SLA target. In practice you should add a small buffer above this minimum to absorb forecast error and unexpected volume spikes.
Using the additive shrinkage formula instead of the divisor. As covered above, this systematically understates headcount requirement. Always divide by (1 − shrinkage %).
Treating occupancy as a target to maximise. Occupancy is a dial, not a goal. Pushing it above 85% in pursuit of efficiency will cost you more in attrition and quality degradation than it saves in idle time.
Applying a single AHT across all contact types. If your operation handles a mix of simple informational queries and complex multi-step resolutions, blending them into a single AHT produces a distorted Erlang C output. Segment by contact type and tier, run the calculation separately, and sum the results.