Contact center queueing (Erlang C)

4 queues, 2,400 half-hour intervals over a full business month, where agents_staffed is what Erlang C (1917) says is actually required to clear each queue's own SLA target, not a plausible-looking number.

A call_volume column and an agents_staffed column with no relationship between them can't test a workforce-management pipeline, because the whole point of WFM is that staffing is derived, not chosen independently. Here, agents_staffed is reverse-solved from Erlang C (computed via the numerically stable Erlang B recursion) to be the smallest agent count that clears the queue's declared SLA target, plus a real 20% shrinkage buffer. Wait probability, average speed of answer, and service level are the exact deterministic Erlang C formulas, recomputable from the raw columns. Abandonment follows the same expected-vs-realized split as the credit-risk dataset's expected_loss/realized_loss: a deterministic rate from a competing-exponentials wait/patience model, and a real Binomial draw for what actually happened.

  • contact center
  • Erlang C
  • workforce management
  • queueing theory
  • WFM

Explore

Every table, profiled

Each column's type, spread, empties and most common values, measured from the CSVs in the download. Switch to the first rows to see the data exactly as it sits in the file.

intervals.csv

2,400 rows · 15 columns · 1 foreign keys

interval_idprimary key
unique on every row
2,400 distinctno empties
queue_idforeign key
points to queues.queue_id
4 distinctno empties
interval_startdate
May 2026Jun 2026
2026-05-04 to 2026-06-12no empties
offered_callsnumber
351.01
mean 20.47median 191 to 57no empties
aht_secnumber
203489
mean 330.2median 327174 to 515no empties
agents_staffednumber
320
mean 8.15median 83 to 20no empties
traffic_intensity_erlangsnumber
0.549.34
mean 3.73median 3.210.13 to 11.66no empties
occupancy_pctnumber
1559.2
mean 42.99median 43.254.3 to 60.4no empties
wait_probability_pctnumber
0.410.8
mean 3.71median 3.30 to 12.5no empties
asa_secnumber
0.214.6
mean 3.41median 2.50 to 17.5no empties
service_level_pctnumber
91.199.7
mean 97.19median 97.689.8 to 100no empties
expected_abandon_rate_pctnumber
0.27.5
mean 2.07median 1.70 to 8.6no empties
calls_answerednumber
351
mean 20.09median 191 to 56no empties
calls_abandonednumber
04
mean 0.38median 00 to 4no empties
realized_abandon_rate_pctnumber
025.01
mean 2.16median 00 to 33.3no empties

Keys

Every join resolves

1 foreign key, 2,400 references checked against the table each one points at. None points at a row that does not exist.

intervals

  • queue_idqueues.queue_id0 orphans

Checks

What we checked

  • every queue clears its own declared SLA target (75-90%) on 100% of its 600 intervals
  • service_level_pct matches an independent Erlang C recomputation on all 2,400 intervals
  • calls_answered + calls_abandoned equals offered_calls exactly, on all 2,400 intervals
  • occupancy_pct and service_level_pct correlate at -0.31 (higher load, worse service)
  • aggregate abandonment stays under 4.0% for every queue over the full month
  • 0 orphaned foreign keys joining intervals to queues

The same checks ship in the zip as INTEGRITY.txt, so you can rerun them in any SQL engine. How we verify

Questions

Worth asking it

  1. 1Does higher occupancy actually correlate with worse service level, the real Erlang relationship?
  2. 2How much staffing buffer (shrinkage) does it take to keep abandonment in an industry-plausible range?
  3. 3Does a realistic intraday call-volume curve break a naive flat-staffing assumption?
  4. 4Which queue's SLA policy is hardest to hit given its volume and patience profile?

Use it

Take it, or make one shaped like yours

Rebuild it byte for byte

pip install misata
curl -O https://raw.githubusercontent.com/rasinmuhammed/misata/main/examples/contact_center_queueing.py
python -c "from contact_center_queueing import build, verify; t = build(n_business_days=30, seed=17); verify(t)"

This dataset reverse-solves staffing from Erlang C and models abandonment via a competing-exponentials wait/patience relationship, neither of which a per-column declared schema can express, so it ships as a runnable script rather than a schema.yaml a bare misata generate could regenerate honestly.

Your own tables, your own numbers

Describe the data you need in Studio and get connected tables with the totals you state, profiled like this and checked before you download.

Premium datasets

All premium
  • Weekly sales, at regular price and on promotion

    Grocery chain, 10 stores, fiscal 2024 and 2025

    Two fiscal years of a grocery chain, from the shelf to the receipt

    Answer key

    • baseline_units
    • price_effect
    • promo_lift
    • +7 more
    Rows
    2,790,852
    Tables
    14
    Checks
    117 of 117
    Free previewProfile and preview
  • An X-bar chart with the truth underneath: flatness, characteristic 139

    3 plants, 36 CNC machines, six months

    Six months of control charts with the ground truth underneath

    Answer key

    • active_cause_id
    • true_cause_shift_sigma
    • true_tool_wear_sigma
    • +6 more
    Rows
    515,442
    Tables
    15
    Checks
    101 of 101
    Free previewProfile and preview
  • Vibration through a life that ends in failure

    240 machines at 4 plants, two years

    Two years of sensor readings, failures, repairs and costs for 240 machines

    Answer key

    • failure_mode
    • true_life_days
    • true_failure_at
    • +6 more
    Rows
    179,038
    Tables
    6
    Checks
    67 of 67
    Free previewProfile and preview

Related free datasets

All 12

Fully synthetic. No real person, company or transaction is represented, and no production data was read to make it. CC0: use it anywhere, no attribution needed.