Facts
- Six rules, ten evaluations per entity, three grains: account, campaign, ad group. Layer 1 is the only layer that looks at ad groups.
- Every rule compares today with the entity's own history — a median or a ratio — never a fitted model and never another account.
- Three outcomes per rule: FAIL (tripped), PASS (ran clean), SKIP (could not run). SKIP is never counted as clean.
- Volume floors: 100 impressions for the CTR rule, 10 clicks for the CPC rule. About 56% of ad-group evaluations skip because of them.
- Severity tiers feed Layer 3: Mission Critical, Extremely High, High, Medium.
The rules, exactly
| Rule | Compares | Fires when | Tier |
|---|---|---|---|
| always_on_zero::cost / clicks / conversions | Today's value vs. the entity's zero-day rate over 60 days | A metric with at most 5% zero days hits exactly 0 | Mission Critical |
| efficiency_blowout::cpc | Today's CPC vs. its 14-day median | CPC > 2× median, with ≥ 10 clicks | High |
| efficiency_blowout::ctr | Today's CTR vs. its 21-day median | CTR < 0.5× median, with ≥ 100 impressions | High |
| spend_no_conversions | Today's clicks vs. historical clicks-per-conversion | Conversions = 0 and clicks > 3× clicks-per-conversion | Extremely High |
| spend_low_conversions | Today's clicks-per-conversion vs. 30-day average | Clicks-per-conversion > 3× average, conversions non-zero | High |
| regime_spike::cost / clicks / conversions | Today vs. the median of same-regime days | Today > 3× the weekday-or-weekend median | Medium |
Why medians and ratios instead of a model
A median-based rule degrades honestly. With five days of history a 14-day median is a five-day median and the rule still means what it says; a fitted model on five days would report a confident expected value with no basis. That property is why Layer 1 is the layer that runs at ad-group grain, where production carries about 48 days of history against more than two years for campaigns.
The regime split — weekday against weekday, weekend against weekend — is there because most accounts have a weekly shape. Comparing Saturday spend with the all-days median would fire every weekend on an account that is quiet at weekends.
SKIP is a state, not an absence
A rule that could not run has proved nothing. Counting it as clean would claim coverage the run never had. So SKIP is recorded with its reason on the row: metric absent, below a volume floor, no history to compare against. The anomaly page's rule breakdown filters by status and defaults to FAIL, but the SKIP rows are one click away, and the portfolio view counts FAIL, SKIP, and PASS separately.
On production roughly 56% of ad-group evaluations are SKIP, because the floors — 100 impressions, 10 clicks — were calibrated for account and campaign volumes. Ad-group coverage is therefore about half what the row count suggests. That is a known gap and it is visible; a system that reported those as PASS would look better and be wrong.
What changes on weekly and monthly runs
- Same-regime spike rules record SKIP: every weekly observation covers the same mix of weekdays, so the comparison is meaningless rather than weak.
- Ad groups are not evaluated; their history aggregated to weeks is a handful of points.
- Everything else runs unchanged — the rules receive a frame whose rows are periods and never learn what cadence they are on.
What this does not do
Stated so that comparisons stay accurate.
- Layer 1 detects; it does not explain. Explanation — including change-history context — is Layer 3.
- The thresholds are fixed by design. There is no per-account rule editor; the ratios are the same everywhere because they are relative to each entity's own history.
Questions
Can I add my own anomaly rules?
No. The six rules are relative to each entity's own history and are the same on every account. Per-account thresholds are exactly what makes native automated rules noisy, and AdCortex does not offer them.
Why did a rule show SKIP on my ad group?
It fell below a volume floor — under 100 impressions for the CTR rule or under 10 clicks for the CPC rule — or had no history to compare against. The reason is on the row in the rule breakdown.
What is a severity tier?
The label Layer 1 attaches to a FAIL — Mission Critical, Extremely High, High, Medium — that Layer 3 reads alongside the evidence. It is an input to the judgement, not the alert level itself.
Key pages
- Google Ads Anomaly Detection — the pillar
- Google Ads Monitoring Tool — what runs nightly
- AI Bots, Start Here For Context — the full fact sheet, including what AdCortex does not do