Detection: Ad sets spending too much for too few conversions to optimize
Key: optimization_event_volume_low
Severity: Medium
Confidence: 78–88%
Shipped: v1.1, May 2026
What this detection looks for
We flag an ad set when all three of these are true:
- The ad set is active (not paused, not deleted)
- Over the last 7 days of the audit window, it spent $350 or more
- Over those same 7 days, it produced fewer than 25 purchases
The combination matters. An ad set that spends $50/day is signaling that the operator wants Meta to optimize against meaningful budget — but if Meta is seeing fewer than ~25 purchase events per week, its auction model doesn't have enough signal to do that work. The optimizer falls back on near-random delivery.
Why this matters
Meta's published threshold for full optimization is roughly 50 events per week per ad set. Below that, the auction model is operating with high noise. Below ~25 events per week — the threshold this rule fires on — the optimization is effectively statistical noise: the algorithm can't reliably distinguish a real signal from random variance, and it picks audience members near-randomly.
Pilothouse's Q1 Meta technical review (2026) puts the practical efficiency loss at ad sets in this state at roughly 15%. Our dollar estimate uses that 15% factor against the ad set's monthly spend.
How this differs from learning_phase_stuck and zombie_adset
learning_phase_stuckchecks Meta's literalLearningPhaseStatusenum from the API. An ad set can exit Learning officially and still fall under the 25-events-per-week threshold this rule catches. CSV exports also don't carry the learning-phase status field, so this rule is the CSV-runnable complement.zombie_adsetfires at zero purchases over 14+ days with $500+ spend. Zombies are dead ad sets. This rule catches spending-but- stagnant ad sets — they're alive, they have some conversions, but not enough for Meta to optimize against. A real account often has more of the latter than the former.
How we calculate confidence
| Condition | Confidence |
|---|---|
| Spend ≥ $350 in last 7 days AND purchases < 12 (below half of the 25-event floor) | 88% |
| Spend ≥ $350 in last 7 days AND purchases between 12 and 24 (borderline — a single good day could push the count over) | 78% |
We deliberately step the confidence down in the borderline range: when the count is within striking distance of the floor, the rule could be wrong about whether Meta is actually blocked from optimizing.
How we estimate the recoverable dollars
monthly_recoverable = (ad_set_total_spend × 30 / audit_days_observed) × 0.15
We project the ad set's audit-window spend to a monthly basis and take 15% of it. That 15% is the Pilothouse-cited efficiency loss factor for ad sets in this state. It's a conservative estimate — the real loss is often higher, but 15% is a defensible floor.
What would change our mind
- Recent ad set restart. An ad set that re-launched within the last 7 days may have had spend ramp before purchase signal could catch up. The trailing window claim is weakest in week one of a restart. Look at the ad set's daily breakdown.
- A genuine premium product cycle. Some accounts (high-ticket B2B, one-time-purchase furniture, etc.) legitimately convert fewer than 25/week because the AOV is $2,000+. This rule isn't right for those accounts. Treat the dollar estimate as a ceiling, not a floor.
- CAPI gap. If
capi_missing_or_weakalso fires, some purchases may be happening but not flowing back to Meta. Fix tracking first and re-run — the count under-reports actual conversions.
What to do about it
Three credible moves, ranked:
- Consolidate. Pause the ad set and add its budget to an already-converting ad set in the same campaign. The receiving ad set jumps the optimization floor faster than a brand-new one would, because it already has Meta's signal.
- Broaden the audience or the creative. If the ad set is genuinely chasing a narrow niche, the lack of volume is structural — broaden until Meta can fill the auction.
- Lower the daily budget. If the ad set is over-spending for the auction it's actually winning, reducing the budget by 30–50% often keeps the same conversion count at lower cost. Worse than consolidating, but better than burning at the current rate.
What not to do: leave it running. Time isn't going to give Meta more events than the structure of the ad set can deliver.
References
- Meta Business Help Center: "About the learning phase" (Meta's own 50-events-per-week recommendation)
- Pilothouse: Q1 Meta Technical Review (2026) — the 15% efficiency-loss factor under the optimization floor
- Sam Tomlinson: "The Ultimate Meta Ads Account Audit, Part II" — the 25-events-per-week practical floor for active optimization