What is anomaly detection?
The anomaly monitor watches every campaign for three specific overnight failures — a CPM spike, spend going dark, and a conversion-rate collapse — by comparing each campaign's latest day against its own trailing seven-day average. It is deliberately narrow: three named failure modes with fixed thresholds, not a statistical black box, so every alert says exactly what tripped it.
Formula
CPM spike: latest-day CPM ≥ trailing-7d average × 1.5
spend to zero: latest-day spend ≤ 5% of trailing-7d average
CVR drop: latest-day CVR ≥ 40% below average, while spend stays within ±25%
All three require meaningful volume (about €50 of spend; the CVR rule also needs ~50 clicks a day on average) so quiet campaigns can't produce noise alerts.
Worked example
A campaign averaging €12 CPM posts €19 overnight: +58%, alert. Another averaging €300/day posts €4: spend-to-zero — usually a pause, an exhausted budget, a billing failure or disapproved ads, and worth knowing before three lost days. A third holds spend flat but its conversion rate halves: the CVR rule fires precisely because spend didn't move, which points the diagnosis away from budget and toward the landing page, checkout, tracking or audience quality.
How Saldo Metrics computes it
The marketing recommendation engine runs the three rules over per-campaign daily
metrics from fact_ad_performance and writes one row per finding into
canonical.recommendation (types cpm_spike, spend_to_zero, cvr_drop), each
carrying a plain-language rationale and the supporting numbers. The dashboard
widget lists the open (new) findings of these three types; a campaign with an
existing open finding is not re-flagged, so the list doesn't refill daily with the
same problem. CVR here uses platform-reported conversions over clicks — the same
basis as the conversion-rate metric.
Why it matters
These three failures share a property: every day of delay costs real money, and none of them announce themselves in weekly rollups. A CPM spike quietly doubles your traffic cost; a dark campaign buys nothing while its flow-on revenue decays; a CVR collapse spends full budget on traffic that no longer converts. Day-grain comparison against the campaign's own baseline catches all three within a day.
Common mistakes
- Reading every CPM spike as a problem to fix. Auction prices move with competition and seasonality; the alert is a prompt to look, and "Q4 started" is a legitimate finding.
- Ignoring spend-to-zero because "nothing is spending, nothing is lost". The losses are the orders the campaign was driving; the cheapest incident is the one noticed the same day.
- Expecting anomalies the rules don't cover. Slow drifts, creative fatigue and pacing issues have their own metrics (fatigue score, budget pacing); this monitor only catches overnight breaks.
Where you see this in the app
The Anomaly Monitor dashboard widget, and the same findings in the recommendations feed.
- Formula
- per campaign, latest day vs trailing 7-day average: CPM +50%, spend ≤5%, CVR −40%
- How Saldo Metrics computes it
- canonical.recommendation, canonical.fact_ad_performance
Last reviewed 2026-08-29