Forecast contact volume, prove accuracy with rolling-origin backtests, and convert the forecast to Erlang A/C staffing. Runs entirely in the browser.
翻訳待ち
ビジネスTypeScript · CSSGitHub @ryanportfolioオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Browser-only contact center WFM workbench: interval volume forecasting (seasonal average, Holt-Winters, harmonic regression, ensemble), rolling-origin backtests, and Erlang A/C staffing with live what-if scenarios. No backend.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Open the live demo, then click "Load sample data". No install, no sign-up, no backend.
A contact center workforce management tool: forecast interval-level contact volume with comparable methods, prove accuracy with rolling-origin backtests, convert the forecast to interval staffing through Erlang A or Erlang C, and test what-if scenarios live.
Built by Ryan Allen (WFM senior team lead; Verint tenant admin). Runs fully in the browser: no backend, no data leaves the machine.Read the full README ↗Open the live demo, then click "Load sample data". No install, no sign-up, no backend.
A contact center workforce management tool: forecast interval-level contact volume with comparable methods, prove accuracy with rolling-origin backtests, convert the forecast to interval staffing through Erlang A or Erlang C, and test what-if scenarios live.
Built by Ryan Allen (WFM senior team lead; Verint tenant admin). Runs fully in the browser: no backend, no data leaves the machine.
npm install
npm run dev
Open http://localhost:5173, click "Load sample data" (2 years, 3 queues, 30-minute intervals), and walk the tabs left to right. npm run build produces a static site; npm test runs the suite.
Data. Bundled sample program (two voice queues plus chat, public-sector shape: Monday peaks, benefit-cycle bumps, holiday closures, injected outages) or your own CSV with columns timestamp,queue,offered,aht, one row per interval:
timestamp,queue,offered,aht
2026-01-05T08:00,voice-support,42,415
2026-01-05T08:30,voice-support,51,402
2026-01-05T09:00,voice-support,58,398
Duplicate queue/timestamp rows reject the entire file, including equivalent timestamps with omitted zero seconds. Other invalid rows are listed and skipped; valid rows load. Contact counts and AHT must be finite, nonnegative numbers, and positive demand needs positive AHT. Review row errors before using the results.
The completeness report separates missing dates, missing expected slots and explicit zero rows for every queue. Expected slots are inferred from repeated weekday history, so gaps may be closures or missing data. The forecast still fills absent calendar days with zero and uses available interval records; resolve unexplained gaps before planning. MAD-based outlier cleaning lists each flagged point and replacement.
Forecast. Three component methods plus a custom ensemble, all hand-implemented in TypeScript:
Daily forecasts are spread to 30-minute intervals with recency-weighted day-of-week profiles learned from cleaned history. The daily chart shades an 80% prediction range around the ensemble, calibrated from the empirical errors of the same rolling-origin evaluation that fits the blend weights.
Accuracy. Rolling-origin backtest (8 folds, 28-day horizon, re-cleaned and re-fit per fold so nothing leaks), scored as WAPE, MAPE, and bias at interval, daily, and weekly grain. The scorecard includes an equal-weight blend row as a benchmark, so the fitted ensemble weights have to prove they beat the naive average. Sample-data result for the largest queue (voice-benefits), daily WAPE: seasonal average 11.2%, Holt-Winters 11.3%, harmonic regression 7.9%, equal-weight blend 9.5%, ensemble 8.1%. The scorecard renders whatever the loaded data says, including when a single component beats the ensemble: on this data the harmonic regression still edges the ensemble by 0.15 points.
Staffing. Interval requirements via Erlang C or Erlang A (abandonment-aware; the birth-death solve was validated against an independent 400k-arrival Monte Carlo simulation to within 0.3pp on service level). Levers: SL target, patience, abandonment cap, shrinkage (applied as division, the correct way), occupancy cap, chat concurrency, volume and AHT deltas. Scenario B comparison shows the FTE-hour and occupancy deltas per day. A fixed-staff ("what I have") mode projects SL, ASA, and abandonment at the heads you enter instead of solving for a target, flagging the intervals that miss. An optional cost-per-hour rate prices scheduled FTE-hours.
Capacity. Compare a no-hire baseline with up to 12 hiring classes across 13 weeks for the selected queue. Enter starting paid headcount, tenured and new-hire weekly attrition, paid hours, shrinkage and hourly cost. Each class has a size, start week, training weeks, nesting weeks at a set nesting productivity, and ramp weeks that rise evenly from the nesting productivity to full productivity. Demand is productive FTE: required on-contact hours divided by paid hours per week. Supply applies shrinkage once. The chart, table and CSV show required versus available FTE, shortages and paid cost. The chart marks each class's start week and production start (the first week after training and nesting), and the weekly table lists each class's phase.
Use "Seed demand from selected forecast" to convert complete seven-day blocks of default staffing need (Erlang A, 80% in 20 seconds, 120-second patience, 90% occupancy cap; two concurrent chats for chat queues). The last complete week repeats through week 13, labeled as an editable assumption. Seeding is explicit; later scenario changes do not rewrite the plan.
This is the beginning of the README. Read the rest at the original. Read the full README ↗