Planning & productivity

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.

Erlang B and Erlang C calculator (call centre staffing)
Esc to restore

Your inputs

Not used by the last mode above, which works out the traffic.

Use 60 to enter calls per hour, or 30 for a half-hour planning interval.

Calls per second times seconds per call. Up to 5,000 erlangs.

Talk time plus after-call work for one call. It sets the traffic when you enter calls, and the waiting times for Erlang C.

Used by the modes that start from a number of agents or lines.

Erlang C, agents needed. 80 with 20 seconds below is the common "80/20".

The time that counts as answered in time, for Erlang C.

Occupancy is the share of time agents spend on calls. 100 means no limit; use 85 to 90 to leave breathing space. Erlang C, agents needed.

Breaks, training, holidays and sickness. The rostered staff are the agents needed divided by (1 minus shrinkage).

Erlang B: the grade of service, for example 1 for one blocked call in a hundred.

Results update as you type. Larger files run when you press Update result.

Your result

Your result will appear here.

More actions

Your inputs stay in this browser. Nothing is uploaded, and nothing is saved unless you choose “Save result”.

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
  1. 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
  2. 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
  3. 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
  4. 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
  5. 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

First 5 rows of the example result
AgentsOccupancy (%)Probability of waiting (%)Service level (%)Average speed of answer (s)Note
1190.909090909168.211820468938.9613811729122.781276844Below the target
1283.333333333344.938822429864.015804037440.4449401868Below the target
1376.923076923128.527045303679.559478841817.1162271822Below the target
1471.428571428617.413193359588.83500191797.83593701178Fewest that meet the target
1566.666666666710.204236700894.14528428693.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.