Live demo

13 series in. 4 alerts out.

One register, roughly 1,900 employees, 60 days of daily accruals, 13 series across four employee classes. On day 44 an HRIS update re-keyed the classes and four ratios on class=hourly-ops moved at once. Total payroll cost, headcount, and average salary all kept doing exactly what they were doing. Everything below is a flag for a human payroll review, not a determination of what anyone is owed.

Every number on this page is computed in your browser right now, by the same CUSUM and Bayesian changepoint code that runs in production. Nothing here is a screenshot.

The comparison that matters

Against the rule most teams actually ship

The standard configuration is a percentage or sigma threshold against a trailing mean, evaluated per metric. Run it over the exact same 13 series and count what lands in the channel.

Naive rule
25
alerts sent · alert if |Δ| > 3σ vs 7-day mean
Of those, false
15
fired before anything was wrong
This engine
4
alerts sent, all correct
Noise reduction
84%
fewer messages, same catch

The false-alarm count is not a judgement call. The incident was injected at a known index, so every naive alert before that index is wrong by construction.

What the engine found

Detection run

Detection run4 alerts13 series tested · 4 fired · 0 suppressed by BH at FDR=0.05
MetricTrendBaselineNowChangeConfidenceMethod
Benefits deduction rate
class=hourly-ops
7.16%3.21%−55.1%99.9%CUSUM
Overtime hours per employee
class=hourly-ops
3.7296.201+66.3%99.9%CUSUM
Gross-to-net ratio
class=hourly-ops
0.7130.765+7.4%99.9%CUSUM
Effective tax rate
class=hourly-ops
21.4%17.6%−17.7%99.9%CUSUM

Show your work

Benefits deduction rate · class=hourly-ops

Baseline
7.16%
After changepoint
3.21%
Change
−55.1%
Confidence
99.9%
CUSUM (Page 1954)
The series60 daysdashed line = baseline mean · red = detected changepoint
2.64%5.21%7.78%changepointJun 29Aug 27
The CUSUM accumulatorsmall deviations stack slowly; a real shift stacks fast
h = 0.145 (decision boundary)0.650

Baseline mean μ = 0.0014 and σ = 0.0364, both computed from the first two thirds of the day-over-day percentage changes. The slack k = 0.0182 is half a sigma, and the decision boundary h = 0.1455 is four. The accumulator runs on percentage changes rather than raw levels so a healthy growing series cannot drift across the boundary on its own.

What the naive rule did on this same series

alert if |Δ| > 3σ vs 7-day mean fired 1 times across this one metric. The statistical pipeline sent one message, on the day the regime actually changed.

What lands in Slack

One message, with the work already done

P
PayrollAPP#eng-alerts
🔴 Benefits deduction rate dropped −55.1%class=hourly-ops
Baseline
7.16%
Now
3.21%
Confidence
99.9%
Started
Aug 12
Employee class
hourly-ops
Employees in class
412
HRIS update
Aug 12
Cycles since
2 (semi-monthly)
Likely cause · Four metrics on class=hourly-ops changed together on Aug 12, the day the HRIS version update re-keyed employee classes. Benefits deduction rate fell by more than half, effective tax rate fell, overtime hours rose, and gross-to-net rose as a consequence of the first two. The other three classes on the same register are unchanged, which rules out a company-wide policy or calendar effect. This is a flag for review, not a determination: the payroll team confirms against the carrier file, the overtime rule, and the jurisdiction mapping before anything is corrected.
  1. 1.Pull the benefits carrier eligibility file for class=hourly-ops and confirm the 412 members are still matched.
  2. 2.Check the overtime rule bound to hourly-ops for a lost daily threshold after the Aug 12 update.
  3. 3.Reconcile work-location to tax-jurisdiction mapping for the class against the pre-Aug-12 export, then take the withholding question to payroll tax counsel.
AcknowledgeFalse positiveCUSUM · q < 0.0001 · BH-corrected

The written cause is generated only after the statistics confirm the change. The model never decides whether something is an anomaly — it explains one that has already been established. Getting that order backwards is how these products hallucinate.