This is an M/M/c queue: tickets arrive one at a time as a Poisson process with rate λ (per minute), and c identical agents each resolve tickets at rate μ = 1/(handle time), with exponentially distributed service durations. A ticket that arrives when every agent is busy waits in a single FIFO line until an agent frees up. The top panel draws the pipeline live (inbox → queue → agents → resolved); the bottom panel plots queue length / utilization over time and a histogram of how long recently-served tickets actually waited — drag on the time chart to freeze it and inspect a past moment.
offered load a = λ / μ
utilization ρ = a / c (stable only if ρ < 1)
Erlang-C wait probability:
P_wait = [ aᶜ / (c!·(1-ρ)) ] / [ Σ_{k=0}^{c-1} aᵏ/k! + aᶜ/(c!·(1-ρ)) ]
Expected wait (Erlang-C):
Wq = P_wait / (c·μ − λ)
- Arrival rate λ — how fast new tickets arrive; raising it increases offered load a = λ/μ.
- Agents c — headcount answering the queue; more agents lower ρ and the wait, at diminishing returns.
- Handle time 1/μ — average minutes an agent spends per ticket (triage + reply).
- SLA target — the wait threshold used for the "within SLA" readout and the dashed line on the histogram.
The "Avg wait (sim)" readout is measured directly from the running discrete-event simulation (a real running average over resolved tickets); "Avg wait (Erlang-C)" is the closed-form theoretical prediction from the formula above for the same λ, c, μ. They converge as more tickets are resolved — this is the same math contact centres and mobile-app support desks use to size headcount against a wait-time SLA.