Live demo

13 series in. 4 alerts out.

One paid social account, 60 days, 13 series across four creative assets. On day 42 the engagement rate on hook-a-summer-v3 breaks. Its click-through follows two days later and its conversion metrics only move on day 48. Account-level CPA, spend, and impressions never turn. Find the asset and the date.

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
27
alerts sent · alert if |Δ| > 3σ vs 7-day mean
Of those, false
11
fired before anything was wrong
This engine
4
alerts sent, all correct
Noise reduction
85%
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
Engagement rate
creative=hook-a-summer-v3
3.85%2.20%−42.7%99.9%CUSUM
Click-through rate
creative=hook-a-summer-v3
1.44%0.90%−37.6%99.9%CUSUM
Cost per acquisition
creative=hook-a-summer-v3
$41$72+73.7%99.9%CUSUM
Conversion rate
creative=hook-a-summer-v3
2.93%1.88%−35.9%99.9%CUSUM

Show your work

Engagement rate · creative=hook-a-summer-v3

Baseline
3.85%
After changepoint
2.20%
Change
−42.7%
Confidence
99.9%
CUSUM (Page 1954)
The series60 daysdashed line = baseline mean · red = detected changepoint
1.83%3.06%4.28%changepointJun 29Aug 27
The CUSUM accumulatorsmall deviations stack slowly; a real shift stacks fast
h = 0.181 (decision boundary)0.540

Baseline mean μ = -0.0002 and σ = 0.0452, both computed from the first two thirds of the day-over-day percentage changes. The slack k = 0.0226 is half a sigma, and the decision boundary h = 0.1810 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 3 times across this one metric, including 1 before anything was actually wrong. The statistical pipeline sent one message, on the day the regime actually changed.

What lands in Slack

One message, with the work already done

C
CreativeAPP#eng-alerts
🔴 Engagement rate dropped −42.7%creative=hook-a-summer-v3
Baseline
3.85%
Now
2.20%
Confidence
99.9%
Started
Aug 10
Asset
hook-a-summer-v3
Live since
Jun 29
Frequency
4.2 and climbing
Spend on asset
$2,180/day
Likely cause · Engagement rate on hook-a-summer-v3 broke on Aug 10. Click-through followed on Aug 12, and the conversion metrics only moved on Aug 16 and 17. Nothing about targeting, bid, or budget changed across that window, and the other three assets in the account are flat, so this is asset-level fatigue rather than an account or audience effect. Account-level CPA never moved, because this asset is about 18% of spend and the blend absorbs it.
  1. 1.Cap frequency on hook-a-summer-v3 or rotate it out; it has been past its useful life since Aug 10.
  2. 2.Move its budget to carousel-offer-v4, whose click-through has held flat at 1.5% across the whole 60-day window.
  3. 3.Re-cut the hook rather than the offer. Engagement broke before conversion, which points at the first three seconds, not the landing page.
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.