Google Ads Anomaly Detection — A Practical Guide
Statistical methods, sensible thresholds, and tooling — so wasted spend gets caught in 24 hours, not 24 days.
Why anomaly detection matters
The single largest source of PPC budget waste is delay. A negative-keyword conflict, a runaway PMax asset group, a campaign budget cap that triggered after-hours, or a Google policy disapproval can all double your daily spend or zero out your conversions overnight — and most teams discover it 5-10 days later in the weekly review.
Anomaly detection compresses that detection window from days to hours. Done right, it pays for itself within the first month it catches anything. Done poorly, it floods you with false alerts and you turn it off.
The 4 metrics worth alerting on
- Spend (cost_micros) — abrupt up moves usually mean budget cap reset, new keyword unlock, or competitive bid surge. Down moves usually mean disapprovals.
- Conversions — most direct revenue signal. Sudden drops mean tracking broke, landing page broke, or a key campaign paused.
- Conversion value — when conversions look fine but value is off, attribution is shifting (low-value lead form replacing high-value purchase).
- CTR — high-volume metric, useful early-warning for ad disapproval (CTR drops fast when one variant in a campaign goes dark).
You can add more (impressions, average CPC, conversion rate) but the four above catch ~90% of accidents.
The statistical method that actually works
The naive approach — flag when today is N standard deviations above the rolling 7-day mean — fails in two ways: 1) seasonality (Mondays differ from Saturdays), 2) outlier sensitivity (a single bad day inflates SD).
The better method, what we use inside MarqOps, is median + Median Absolute Deviation (MAD) over a 14-day window:
- Pull the last 14 days of daily values for the metric.
- Compute
median(values). - Compute
MAD = median(|value - median|). - Compute the robust z-score for today:
z = (today - median) / (1.4826 × MAD). - Flag if
|z| ≥ 2.5(medium severity) or|z| ≥ 4(high).
MAD is robust to outliers — one bad day doesn’t inflate the baseline. The 1.4826 multiplier scales MAD to be comparable to standard deviation under normality.
Thresholds that don’t cry wolf
Pure z-score thresholds aren’t enough — small absolute changes can have huge z-scores when MAD is tiny. Combine with a minimum-percent-change floor:
- Spend: z ≥ 2.5 AND change ≥ 25%
- Conversions: z ≥ 2.5 AND change ≥ 30%
- CTR: z ≥ 3 AND change ≥ 20%
- Conversion value: z ≥ 2.5 AND change ≥ 30%
Add a baseline-floor: ignore campaigns with median spend <$5/day or median conversions <1.5/day — anomalies on tiny baselines aren’t actionable.
Handling false positives
You will get false positives. The way to keep alerting useful:
- Tier the severity. Daily digest for medium; same-day push for high.
- Decay good-direction alerts. If CTR went up dramatically, that’s a "good anomaly" — log it, don’t page anyone.
- Annotate known events. Use timeline annotations ("launched promo on the 12th") so future regression analyses can pattern-match. MarqOps’s annotation feature handles this.
- Acknowledge / dismiss / resolve. Don’t just leave a noisy backlog of "open" anomalies; build status workflow.
Tooling: build vs buy
Build if: you have a data engineer, you want to integrate with internal alerting (PagerDuty), or your account is >$500K/mo and you want full control.
Buy if: you want results in <1 day, you don’t want to maintain stats code, you want the alerts wired into Slack/email/in-app notifications without doing the plumbing.
The best-in-category tools all ship anomaly detection now: Optmyzr, Opteo, Adalysis, MarqOps. The differences are in severity tiering, false-positive handling, and integration depth (Slack, webhooks, email digest customization).
For a no-cost start: the free MarqOps tier includes daily anomaly detection on connected Google Ads accounts. Or run the free audit to see your current account snapshot.
FAQ
What's the difference between anomaly detection and rules?⌄
Rules fire on a fixed condition ("if CPA > $50"). Anomaly detection fires on a relative deviation ("CPA is 2.5 standard deviations above the rolling baseline"). Anomaly detection adapts to seasonality and is better for unknown-unknowns; rules are better for known thresholds.
Why median + MAD instead of mean + standard deviation?⌄
Means and standard deviations are pulled around by single outliers. A spend day 3x higher than usual will inflate the standard deviation enough to mask real anomalies the next week. Median absolute deviation (MAD) is robust to outliers — one bad day doesn’t flatten the baseline.
How quickly should I be notified?⌄
For accounts under $20K/mo: daily digest is enough. Above that: same-day Slack notifications for high-severity. Above $200K/mo, consider real-time webhook integration so wasted spend is throttled within hours.
Related
Want this baked into your daily workflow?
MarqOps automates 90% of what guides like this teach: anomaly detection, schema monitoring, AI-driven keyword analysis, branded weekly reports, and a public API for the rest.
Get started free