Erlang C · free practitioner tool

Erlang C Calculator for Call Center Staffing

Work out how many agents a call center or contact center needs for an 80/20 target (80% of calls answered within 20 seconds) or any service level you set. Plan a day in 30-minute intervals with every step of the Erlang C calculation shown, plan a week by weekday, or divide a month’s contacts across weekdays.

  • Calculates in your browser
  • Nothing you enter is sent or stored
  • Every result explained

Staffing planner

Loading the calculation engine…

Starting values are an example. Replace them with your own.

Plan

Enter the week’s contacts. They are distributed across the open weekdays by their shares, and each weekday is planned as one day using the arrival distribution below.

Enter the month’s contacts. Month shows how they are distributed across Monday to Sunday, with no calendar and no staffing. For staffing, use Day or Week.

Contacts
contacts
contacts
contacts
Open days
Weekday shares

Automatic weekday distribution

Illustrative contact-center starting pattern. Replace it with your historical weekday shares when available.

To fix one interval, type its contacts in the data table; the rest of the day is spread over the others.

Arrival distribution
HH:MM
HH:MM

Type or pick a time: 24-hour clock, on the hour or half hour. Closing can be 24:00.

Example ES-1

Synthetic example pattern automatically fitted to your selected operating hours.

Not measured data.

Show the interval shares
Service objective
%
s
Planning constraints optional
%
agents
After Erlang C optional
%
hours

Shrinkage converts required agents into agent-equivalents to schedule; it never changes the Erlang C result. Paid hours and FTE are converted only for the period the FTE basis describes.

Available staffing optional
agents

Agents handling contacts, after shrinkage. The planner shows the service each interval would get with them. “Per interval” is available when planning a single day.

Contacts

—

for the day

Peak requirement

—

agents

Required agent-hours

—

net, before shrinkage

Required paid hours

—

after shrinkage

Contacts and required agents by interval

Nothing to chart until the inputs marked on the left are fixed.

Contacts

Agents

Arrow keys choose · Enter shows the calculation

Explain this interval

Data

Calculated with the Elaris Erlang C engine (CS-050 / CS-051), gross staffing (CS-052) and paid-hours (CS-053) calculations, running in your browser.

Software notices and licences

One day is easy. Running the workforce is harder.

A staffing plan for a single day is where workforce planning starts, not where it ends. Elaris is being built to connect the rest of the workforce process in one model, so each step can be traced back to the one before it.

  1. Historical demand
  2. Forecast
  3. Staffing requirements
  4. Scheduling
  5. Intraday management
  6. Performance
  7. Reporting

Elaris is in active development and is not generally available. Early access is opening to a small number of workforce teams.

Practitioner guide

Understanding an Erlang C staffing calculation

What is Erlang C?

Erlang C is a queueing formula named after A. K. Erlang, the Danish engineer who published the underlying analysis of telephone traffic in 1917. For a given number of agents handling a steady stream of inbound contacts, it predicts the probability that a contact has to wait, how long contacts wait on average, and what share of contacts are answered within a chosen time.

Workforce planners usually run it the other way round: start from the expected contacts and a service-level target, and find the smallest number of agents that meets the target in one interval. In queueing theory the model is known as the M/M/N queue.

With A as the workload in Erlangs and N as the number of agents (more than A), the probability that a contact has to wait is:

P(wait) = [AN ÷ N! × N ÷ (N − A)] ÷ [sum of Ak ÷ k! for k = 0 to N − 1 + AN ÷ N! × N ÷ (N − A)]

The service-level formula further down this page uses P(wait), and the worked example puts real numbers through both.

What is an Erlang?

An Erlang is a unit of workload. One Erlang is enough work to keep one agent continuously busy for the whole interval. Offered workload is calculated as:

workload (Erlangs) = contacts offered × average handle time ÷ interval length

With 100 contacts, a 180-second handle time and a 30-minute interval, the workload is 100 × 180 ÷ 1,800 = 10 Erlangs. Ten agents would be busy all of the time, with no capacity left to absorb the natural clustering of arrivals. That is why the requirement is always above the workload: with 10 agents or fewer the model has no steady state, and waiting times keep growing through the interval.

How contact volume and AHT affect staffing

Contacts and handle time both enter the calculation through the workload, but the staffing requirement does not move in proportion to it. With the same 100 contacts, raising the handle time from 180 to 240 seconds increases the workload by a third, from 10 to 13.33 Erlangs. The requirement for 80% within 20 seconds rises from 14 to 17 agents, which is about a fifth more, and occupancy at the requirement rises from 71.4% to 78.4%.

Larger workloads can be served at higher occupancy for the same target, so a requirement has to be recalculated whenever the inputs change. Scaling a previous answer up or down gives the wrong number.

What service level means

A service-level target has two parts that belong together: a percentage and an answer-time threshold, such as 80% of contacts answered within 20 seconds. Changing either part changes the requirement. For the 10-Erlang example:

Required agents for different targets, 10 Erlangs of workload
TargetRequired agents
80% within 20 s14
90% within 20 s15
95% within 20 s16
85% within 5 s15
85% within 10 s14
85% within 20 s14
85% within 60 s13

Erlang C predicts the share of arriving contacts that are answered within the threshold:

service level = 1 − P(wait) × e−(agents − workload) × threshold ÷ AHT

Because the model assumes nobody abandons, the usual ways of reporting service level (answered within the threshold divided by contacts offered, or by contacts answered) give the same figure inside the model. In your ACD reports they can differ, and the reported number depends on which definition your operation uses.

A target of 100% cannot be met at any finite staffing level, because some contacts always have a chance of waiting. Elaris reports such a target as unattainable instead of returning an ever larger number.

How occupancy affects staffing decisions

Model occupancy is workload divided by agents: the share of agents’ time spent handling contacts. In the example, 10 Erlangs across 14 agents is 71.4%. Occupancy is an outcome of an Erlang C calculation, not an input to it.

Many operations also plan to a maximum occupancy as a policy. Elaris treats that maximum as a separate constraint alongside the service-level target, and the requirement is the smallest staffing level that satisfies every active constraint at once. The result says which constraint controlled it.

For example, a target of 50% within 60 seconds on the same workload needs only 11 agents, but occupancy would then be 90.9%. With an 85% occupancy limit, the requirement becomes 12 agents (10 ÷ 0.85, rounded up). The result names occupancy as the controlling constraint and flags that the service-level answer alone would have exceeded the limit. With the stricter 80% within 20 seconds target, service level already needs 14 agents at 71.4% occupancy, so the same limit does not change the answer.

How shrinkage differs from workload

Erlang C tells you how many agents need to be handling contacts during the interval. That is net staffing. People are also paid for time away from contacts: breaks, meetings, training, coaching and other planned activity. That is shrinkage, and it belongs in a separate step after the Erlang C result is final:

gross staffing = net staffing ÷ (1 − planned shrinkage rate)

With 30% planned shrinkage, 14 net agents become 14 ÷ 0.70 = 20.0 agent-equivalents to schedule. Two common shortcuts give different numbers:

  • Multiplying instead of dividing (14 × 1.30 = 18.2) understates the requirement.
  • Inflating handle time to “include” shrinkage (180 ÷ 0.70 ≈ 257.1 seconds) gives 18 agents, because it changes the queueing workload itself. Shrinkage is not workload, and it never enters the queueing calculation.

Planned shrinkage and unplanned absence are also kept apart. Unplanned absence is something you observe afterwards. It belongs in a requirement only as a deliberate, separately labelled allowance. Gross staffing for an interval is still not FTE: converting it needs the contracted hours that define an FTE in your organization.

Why interval duration matters

Erlang C assumes arrivals come at a steady rate within the interval being staffed. The inputs therefore have to describe that interval: the contacts expected in that 15, 30 or 60 minutes, and the handle time for those contacts. The interval length is an explicit input because the same count means a different workload over a different length of time.

The same 100 contacts spread over an hour instead of 30 minutes are 5.00 Erlangs, and the requirement for 80% within 20 seconds is 8 agents. That is not half of 14. The model should never be applied to a daily or weekly total: averaging a day hides the peaks you have to staff for, and requirements from different intervals or queues cannot simply be added together.

Erlang C assumptions and limitations

Erlang C is a model, and its results hold only as far as its assumptions do. It assumes:

  • contacts arrive at random, at a constant average rate within the interval;
  • handle times vary randomly around the average handle time (exponentially distributed);
  • agents are interchangeable, and each handles one contact at a time;
  • contacts are answered first come, first served;
  • nobody abandons: every contact waits until it is answered;
  • nobody is blocked: there is no busy signal or queue limit;
  • each interval is treated on its own, with no queue carried over from the interval before.

Real contact centers depart from these in familiar ways. Customers hang up. When abandonment is material, Erlang C typically overstates the staffing requirement, and models that include caller patience, such as Erlang A, are designed for that situation. This calculator does not implement them. Other departures include callers retrying after abandoning, agents handling several chats at once, asynchronous work such as email, skills-based routing across queues, and agents who work at different speeds.

The result is also only as good as the forecast it is given. A requirement calculated for the expected volume does not cover volume above that forecast. An Erlang C result is an estimate under stated assumptions. It is not a guarantee of real-world performance.

A worked example, step by step

One interval from start to finish: 100 contacts in 30 minutes, a 180-second handle time and a target of 80% answered within 20 seconds.

One interval, calculated in full

WORKED EXAMPLE A fixed example on synthetic inputs, calculated by the same engine as the planner. Its figures are checked against the engine.

Erlang C inputs

Contacts offered
100 in the interval
Interval length
30 minutes (1,800 s)
Average handle time
180 seconds
Service-level target
80% answered within 20 seconds

Planning constraints

Maximum occupancy
Not set
Minimum staffing
Not set

Staffing adjustment applied after Erlang C

Planned shrinkage
30% of paid scheduled time

Erlang C result

14 agents

Required net staffing: agents handling contacts during the interval. Not FTE, not headcount.

Computed. Meets the 80% in 20 s target. Controlling constraint: service level.

Offered workload
10.00
Erlangs
Predicted service level
88.84%
within 20 s, at 14 agents
Average speed of answer
7.8 s
all contacts
Occupancy
71.4%
model occupancy
Probability of waiting
17.4%
any wait at all
Average queue length
0.44
contacts waiting

Staffing adjustment not part of Erlang C

20.0 agent-equivalents to schedule

Required gross staffing = 14 ÷ (1 − 0.30). Unrounded, and not FTE: converting to FTE needs a contracted-hours basis.

Evaluate a staffing level

With 13 agents instead: predicted service level 79.56%, average speed of answer 17.1 s, occupancy 76.9%.

Below target. One agent short of the requirement.

How this was calculated
Interpreted inputs
100 contacts offered in a 30-minute (1,800 s) interval, average handle time 180 s, target 80% answered within 20 s. No occupancy limit or staffing minimum was set.
Workload
100 × 180 s ÷ 1,800 s = 10.00 Erlangs
Search
Staffing must exceed the workload for the queue to be stable, so the search starts at 11 agents and adds one agent at a time until the predicted service level reaches the target. 13 agents give 79.56%; 14 agents give 88.84%.
Result
14 agents. The service-level target is the only active constraint, so it controls the result.
Staffing adjustment
Planned shrinkage is applied only after the Erlang C result is final: 14 ÷ 0.70 = 20.0 agent-equivalents.
Status and warnings
Computed. No warnings.
Assumptions
Steady arrivals within the interval, no abandonment, one contact per agent at a time. Read the full list and its limits.
Method
Elaris Erlang C engine, method version erlang_c 0.2.0 (specification 0.3); gross staffing specification 0.5. See every step below.

The same calculation, step by step:

  1. State the interval. 100 contacts offered in a 30-minute interval, average handle time 180 seconds, target 80% answered within 20 seconds.
  2. Calculate workload. 100 × 180 ÷ 1,800 = 10.00 Erlangs.
  3. Find the first stable staffing level. Agents must exceed workload, so the search starts at 11. At 9 or 10 agents there is no steady state and the model reports no service level at all.
  4. Test each staffing level against the target. Add one agent at a time and compute the predicted service level.
  5. Stop at the first level that meets the target. 13 agents give 79.56%, below 80%. 14 agents give 88.84%. The requirement is 14.
  6. Apply shrinkage separately. 14 ÷ (1 − 0.30) = 20.0 agent-equivalents to schedule.
Erlang C measures by staffing level: 10 Erlangs, 180 s average handle time, 20 s threshold
Agents Service level P(wait) ASA Occupancy Against 80% in 20 s
9No steady state: agents do not exceed workloadNot evaluated
10No steady state: agents do not exceed workloadNot evaluated
1138.96%68.2%122.8 s90.9%Below target
1264.02%44.9%40.4 s83.3%Below target
1379.56%28.5%17.1 s76.9%Below target
1488.84%17.4%7.8 s71.4%Meets target (required)
1594.15%10.2%3.7 s66.7%Meets target
1697.06%5.7%1.7 s62.5%Meets target

Displayed values are rounded for reading. The pass or fail decision uses the unrounded calculation against the exact target.

Frequently asked questions

What is Erlang C?

A queueing formula that call centers and contact centers use to work out how many agents an interval needs. From the contacts expected, the average handle time and a service-level target, it finds the smallest number of agents that meets the target, assuming nobody hangs up while waiting. More on Erlang C.

How many agents do I need for 100 calls?

It depends on how long the calls take, how long the interval is and the target. For 100 calls in 30 minutes with a 180-second average handle time and an 80/20 target, Erlang C needs 14 agents handling calls. The same 100 calls spread over an hour need 8. That is the number on the phones, before shrinkage. See the worked example.

What does shrinkage do to the number of agents?

Shrinkage is paid time away from contacts, such as breaks, meetings and training. It does not change the Erlang C result; it is applied afterwards: agents to schedule = agents on the phones ÷ (1 − shrinkage). With 30% shrinkage, 14 agents on the phones become 20.0 agent-equivalents to schedule. More on shrinkage.

Is the number of agents required the same as headcount or FTE?

No. Erlang C gives the number of agents who need to be handling contacts during that interval. Shrinkage turns that into agent-equivalents to schedule. Headcount and FTE are further conversions that depend on contracted hours and on how shifts cover the day.

Why must the answer be larger than the workload in Erlangs?

With agents equal to or fewer than the workload, work arrives at least as fast as it can be handled on average. The queue then has no steady state and waiting times keep growing. Erlang C gives no meaningful service level there, so none is reported.

Why can’t I set a 100% service-level target?

Under the model’s assumptions there is always some chance that every agent is busy when a contact arrives, so no finite staffing level answers every contact within the threshold. Such a target is reported as unattainable rather than answered with an arbitrary large number.

Can I use Erlang C for a whole day or week?

Not directly. Calculate each interval from its own contacts and handle time. Requirements from different intervals can be summed only as agent-hours, labelled as such. Summing the requirements of separate queues also does not give the requirement for those queues pooled together.

Does Erlang C work for chat, email or messaging?

Only with care. The model assumes each agent handles one contact at a time and that contacts are served as they arrive. Concurrent chats and work that can wait hours, such as email, break those assumptions and usually call for a different method.

Is what I enter sent to Elaris?

No. The planner loads its calculation engine into your browser and calculates there. What you type is not sent to Elaris or anyone else, and it is not stored. “Copy link” puts your inputs into the part of the link after the # sign, which browsers do not send to the website. Anyone you share the link with can read them.

How is a day’s total spread across intervals?

By the arrival distribution. Automatic fits the synthetic example pattern ES-1 to your opening hours: each interval takes the part of ES-1’s day it covers, rounded to 0.01 points so the shares add up to exactly 100%. At ES-1’s own hours, 08:00–20:00, the shares are ES-1’s exactly. ES-1 is an example, not a measured or typical pattern. Custom uses your own shares or contacts per interval.

Each open interval gets its share of the day, exactly as shown or entered: 2,000 contacts × 6.4% is 128 contacts. Your own shares must add up to exactly 100%. If they do not, nothing is spread and the planner shows the difference. You can choose to scale your shares to 100%, and the result is labelled as a calculated pattern. Allocated contacts are kept exact, including fractions, and are only rounded for display.

Why is the day shown in agent-hours rather than agents?

Each interval needs its own number of agents, and the same person can cover many intervals. Adding the intervals’ agent counts would not mean anything, so the day is summarised as agent-hours (agents × half an hour, summed) and as the peak interval requirement.

Why doesn’t my real service level match the prediction?

The prediction assumes the forecast volume and handle time were right, that agents were available as planned, and that callers did not abandon. Differences in any of these, and in how your reports define service level, will show up as a gap between predicted and reported results.

Figures in this guide were calculated by the Elaris Erlang C engine (method version erlang_c 0.2.0, specification 0.3) and the Elaris gross staffing calculation (specification 0.5), from synthetic inputs. They illustrate the method and describe no real operation.