Synthetic Data for Contact Center / Erlang C
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. Misata generates interval data where agents_staffed is the actual output of running Erlang C backwards from a declared SLA target, and service level, wait time, and abandonment all reconcile from the raw columns.
The tables Misata generates
queuesFour queues with real SLA policies (e.g. 80% of calls answered within 20 seconds) and customer patienceintervalsHalf-hour volume, staffing, wait probability, ASA, service level, and an expected-vs-realized abandonment splitWhat holds true, every time
- agents_staffed is the smallest N for which Erlang C's own service-level formula clears the queue's declared SLA target
- service_level_pct and asa_sec are the exact Erlang C formulas, recomputable from offered_calls, agents_staffed, and AHT
- occupancy_pct and service_level_pct correlate negatively -- the real Erlang relationship, not two random columns
- abandonment follows an expected-vs-realized split: a deterministic rate from a wait/patience model, and a real Binomial draw for the outcome
Frequently asked
Do I need real contact center data to generate this?
No. Misata builds the dataset from a specification, not a sample. There is no real contact center data to source, anonymize, or leak. You describe the tables you need and the engine constructs them with referential integrity and realistic distributions.
Is the generated contact center data privacy safe?
Yes, by construction. Nothing is learned from real records, so there is no membership to infer and nothing to leak. It runs entirely on your machine with no API key for the core engine.
Can I control the outcomes, like rates and totals?
Yes. Declare a target such as a monthly volume curve or an event rate and Misata produces rows that hit it exactly, while foreign keys stay intact and roll-up columns reconcile after a JOIN.
How is agents_staffed calculated?
Reverse-solved, not assigned. Given a queue's declared SLA target and an interval's forecast volume, agents_staffed is the smallest N for which the Erlang C service-level formula actually clears that target, plus a 20% shrinkage buffer for breaks, training, and absenteeism (the standard WFM planning concept). It's the same reverse search every commercial staffing calculator runs.
What is Erlang C?
The formula A.K. Erlang published in 1917 for the probability an arriving call has to wait, given traffic intensity and agent count. It's computed here via the numerically stable Erlang B recursion (Sundt-Jewell), and used to derive average speed of answer and service level -- the same formulas every commercial WFM tool (NICE, Genesys, Assembled) runs.
How is call abandonment modeled?
As a race between two exponential clocks: the Erlang-C-implied wait-clearing rate, and an exponential customer-patience clock. That gives a closed-form abandonment probability for a queued call. The realized abandoned/answered split is a real Binomial draw at that rate, not the expected rate copy-pasted into every row -- the same expected-vs-realized split the credit-risk dataset uses for expected_loss vs realized_loss.
Is there a free sample contact center dataset?
Yes, at https://misata.studio/datasets/contact-center-erlang: 4 queues and 2,400 intervals over a full business month, public domain (CC0), no signup. The zip includes an INTEGRITY.txt with every formula re-measured against the exact files.
Choosing a tool? How Misata compares

