Erlang B and Erlang C calculator (call centre staffing)
Erlang C and Erlang B calculator: agents needed for a service level such as 80/20, lines for a blocking target, shrinkage, a table and a chart.
A clear answer. Here’s how.
Traffic in erlangs is the average number of calls in progress: A = calls per second × seconds per call, so 100 calls in 30 minutes at 180 seconds each is 100 × 180 / 1,800 = 10 erlangs. Erlang B gives the share of calls that find all N lines busy when blocked calls are cleared: B(0) = 1 and B(n) = A B(n − 1) / (n + A B(n − 1)). This recursion has no factorials, so it stays accurate up to 5,000 erlangs. Erlang C is for calls that wait in a queue; with N agents above A it is the probability of waiting C = N B / (N − A (1 − B)). The average speed of answer is C × AHT / (N − A), where AHT is the average handling time, the service level (share answered within T seconds) is 1 − C × e^(−(N − A) T / AHT), and occupancy is A / N. The agents needed are the fewest that reach the service level (and stay within any occupancy limit you set), and the table shows the agents around that answer. Shrinkage turns agents on the phones into staff on the roster: roster = agents / (1 − shrinkage), rounded up. Both models assume random (Poisson) arrivals and exponential handling times. Erlang C assumes nobody gives up and nobody calls back, so it usually asks for a few more agents than a real queue needs. Skills, the shape of the day, breaks and multi-channel work are not modelled: run it interval by interval.
How this is checked
5 reference checks passed These 5 cases were run when this page was built, on 20 October 2026, and all reproduce within the stated tolerance. The same cases are part of the automated tests that run on every change to Toolmoz. Engine version 1.
See the checks and where each expected answer comes from
Case 1
- Inputs
- What to work out capacityNumber of agents or lines 10Blocking target (% of calls blocked) 1
- Expected, and what Toolmoz gave
- Traffic (erlangs) expected 4.461, Toolmoz 4.461176857577691
- Where the expected answer comes from
- The classic Erlang B table at 1% blocking lists 4.461 erlangs for 10 lines (and 1.361 for 5 lines, 12.03 for 20 lines). Solving B(10, A) = 0.01 by bisection on the textbook sum formula (A^N / N!) / (sum of A^k / k! for k = 0 to N) in an independent Python Decimal script gives A = 4.4611769, which the table rounds to 4.461
- Allowed difference
- ±0.0005 absolute
Case 2
- Inputs
- What to work out blockingTraffic is entered as erlangsTraffic (erlangs) 12.03Number of agents or lines 20
- Expected, and what Toolmoz gave
- Blocking probability expected 0.999586791306609, Toolmoz 0.9995867913066083
- Where the expected answer comes from
- Erlang B by the textbook sum formula, not the recursion, in an independent Python Fraction script: B(20, 12.03) = (12.03^20 / 20!) / (sum of 12.03^k / k! for k = 0 to 20) = 0.00999586791, which is 0.99959%. The 1% table gives 12.03 erlangs for 20 lines, rounded to four digits
- Allowed difference
- ±1e-9 relative
Case 3
- Inputs
- What to work out linesTraffic is entered as erlangsTraffic (erlangs) 10Blocking target (% of calls blocked) 2
- Expected, and what Toolmoz gave
- Lines needed expected 17, Toolmoz 17Blocking probability expected 1.294887522472657, Toolmoz 1.294887522472657
- Where the expected answer comes from
- Exact sum formula in an independent Python Fraction script: B(16, 10) = 2.2302% is above the 2% target and B(17, 10) = 1.2949% is below it, so 17 lines are the fewest (the Erlang B table at 2% blocking lists 17 lines for 10 erlangs)
- Allowed difference
- ±1e-9 relative
Case 4
- Inputs
- What to work out agentsNumber of agents or lines 13
- Expected, and what Toolmoz gave
- Traffic (erlangs) expected 10, Toolmoz 10Probability of waiting expected 28.527045303649295, Toolmoz 28.527045303649302Average speed of answer (seconds) expected 17.116227182189576, Toolmoz 17.11622718218958Service level (answered within 20 seconds) expected 79.55947884177831, Toolmoz 79.55947884177831Occupancy expected 76.92307692307693, Toolmoz 76.92307692307693
- Where the expected answer comes from
- The standard example: 100 calls in 30 minutes at 180 seconds each is A = 100 x 180 / 1,800 = 10 erlangs. Erlang C by its sum formula in an independent Python Fraction script, C = (A^13 / 13! x 13 / (13 - 10)) / (sum of A^k / k! for k = 0 to 12 + A^13 / 13! x 13 / 3) = 0.2852705. Average speed of answer = C x 180 / 3 = 17.116 s. Service level = 1 - C e^(-3 x 20 / 180) = 1 - 0.2852705 x 0.7165313 = 0.795595. Occupancy = 10 / 13
- Allowed difference
- ±1e-9 relative
Case 5
- Inputs
- What to work out staffService level target (% answered in time) 80Answer within (seconds) 20Highest occupancy allowed (%) 100Shrinkage (% of paid time agents are unavailable) 30
- Expected, and what Toolmoz gave
- Agents needed expected 14, Toolmoz 14Agents to roster with shrinkage expected 20, Toolmoz 20Service level (answered within 20 seconds) expected 88.83500191794668, Toolmoz 88.83500191794668Occupancy expected 71.42857142857143, Toolmoz 71.42857142857143
- Where the expected answer comes from
- For the same 10 erlangs and 180 seconds, the Erlang C service level for 20 seconds is 79.559% with 13 agents (below the 80% target) and 88.835% with 14 (independent Python Fraction and Decimal script), so 14 agents are the fewest. Occupancy is 10 / 14 = 71.43%. With 30% shrinkage the roster is 14 / (1 - 0.3) = 20 people
- Allowed difference
- ±1e-9 relative
What this shows: the engine reproduces independently worked values for these cases. It does not prove every possible input is right. To test an answer you were given, see how to check a number; to see what is and is not checked across Toolmoz, see the accuracy ledger.
See a worked example
Worked example
A fixed demonstration, separate from the values you enter above.
- What to work out
- Erlang C: agents needed for a service level target
- Traffic is entered as
- Calls in an interval and the handling time
- Calls arriving in the interval
- 100
- Interval length (minutes)
- 30
- Average handling time (seconds)
- 180
- Number of agents or lines
- 14
- Service level target (% answered in time)
- 80
- Answer within (seconds)
- 20
- Highest occupancy allowed (%)
- 100
- Shrinkage (% of paid time agents are unavailable)
- 30
- Blocking target (% of calls blocked)
- 1
Example result
| Agents | Occupancy (%) | Probability of waiting (%) | Service level (%) | Average speed of answer (s) | Note |
|---|---|---|---|---|---|
| 11 | 90.9090909091 | 68.2118204689 | 38.9613811729 | 122.781276844 | Below the target |
| 12 | 83.3333333333 | 44.9388224298 | 64.0158040374 | 40.4449401868 | Below the target |
| 13 | 76.9230769231 | 28.5270453036 | 79.5594788418 | 17.1162271822 | Below the target |
| 14 | 71.4285714286 | 17.4131933595 | 88.8350019179 | 7.83593701178 | Fewest that meet the target |
| 15 | 66.6666666667 | 10.2042367008 | 94.1452842869 | 3.67352521229 |
Traffic 10 erlangs (100 calls in 30 minutes, 180 s each). Erlang C assumes random arrivals, exponential handling times, no abandonment and no retrials, so real queues behave a little differently.