Methodology · every rule, every threshold, in public
How we decide what's a finding.
24 deterministic rule families. Each one expands at runtime into ~10–25 individual statistical checks against your specific ad sets, ads, audiences and placements — typically 200+ checks on a mid-size account. Every rule, every threshold, and every false-positive correction is documented on this page. A CSV runs the families a CSV has the data to feed; connecting your Meta account runs all of them.
More on why we have 24 rules and not 150 — read the essay.
Math, shown
Every finding traces to a specific row of your data.
Click any number on your audit to see the calculation behind it. The rule that fired, the entities it applied to, the raw evidence values, the confidence threshold. No black box. If we can't show the math, we don't fire.
We document the math for every detection on this page — read it before you pay us a dollar.
What we look at, that most tools miss
- Per-ad CR vs siblings, not vs account average. Catches winners that are only winning because Meta over-served them.
- Audience overlap matrix across every custom audience pair. For an account with 12 audiences, that's 66 pairwise checks.
- Per-placement CPA inside every ad set. Most dashboards aggregate placement performance at the campaign level, which hides where the actual waste is.
- Browser pixel vs Conversions API parity check per event. Cross-references your purchase data on both channels — most tools only see one.
- 14-day rolling windows, not lifetime aggregates. Lifetime CTR averages hide week-over-week saturation. We compute the deltas.
- Confidence intervals on every finding. We don't just say "you have a problem" — we say how sure we are, and where the rule could be wrong.
Detection logic is deterministic Python code, not an LLM. The same account snapshot always produces the same findings. See why this matters →
The surfacing layer
23 patterns we'll flag for you.
Each rule below is what actually decides whether something becomes a finding on your audit. Read them before you pay us a dollar. When a rule changes, the change is dated in the changelog at the bottom of this page.
- 01
Ad sets spending without converting
Active ad sets that have spent $500+ over 14+ days with zero purchases.
zombie_adset
- 02
Campaign at daily cap while sibling underspends
Reallocate budget from a campaign that can't spend its cap to one that's hitting it.
budget_capped_alongside_underspend
- 03
Single creative driving most conversions
When one ad drives >70% of purchases, the campaign is one fatigue cycle from collapse.
creative_concentration_risk
- 04
Frequency saturation with declining CTR
Recent frequency ≥5 combined with a >20% week-over-week CTR drop. The audience is fatigued.
frequency_saturation
- 05
Ad set stuck in Meta's learning phase
Active for 14+ days and still in LEARNING or LEARNING_LIMITED. Won't stabilize without intervention.
learning_phase_stuck
- 06
Ad sets bidding against each other
Two ad sets target overlapping audiences ≥30%. You pay the auction premium twice.
audience_overlap
- 07
Upper-funnel campaign in a purchase-driven account
Traffic, Engagement, or Awareness objective spending against an account that exists to sell things.
wrong_objective
- 08
Audience Network consuming spend at poor unit economics
AN takes ≥15% of an ad set's spend at 2× the CPA of other placements, or with zero conversions.
audience_network_leak
- 09
Prospecting ad set without a purchaser exclusion
Sales-objective prospecting that doesn't exclude recent purchasers. Small waste, real brand cost.
no_purchaser_exclusion
- 10
One placement dominates spend with worse unit economics
Non-Audience-Network placement takes ≥60% of an ad set's spend at ≥1.5× the other placements' CPA.
placement_imbalance
- 11
Attribution window too narrow for this account
1-day click attribution on an account with sales campaigns and ≥$5K/mo spend.
attribution_window_mismatch
- 12
Too few standard events firing for Meta to optimize
Fewer than 3 standard pixel/CAPI events firing across the audit window.
weak_event_coverage
- 13
Top ad got more impressions than it earned
Brand-defining detection. Catches false winners produced by Meta's early-leader delivery bias.
false_winner_meta_bias
- 14
1% lookalike at scale — broader audience worth testing
Active 1% LAL with size ≤5M and ad-set spend ≥$1.5K. Informational; test 3-5% lookalikes.
lookalike_size_suboptimal
- 15
Conversions API missing or weak for Purchase
No CAPI Purchase events, or CAPI volume <50% of browser pixel. iOS signal loss.
capi_missing_or_weak
- 16
Ad sets spending too much for too few conversions to optimize
Active ad sets with >=$350 spent over the last 7 days AND fewer than 25 purchases over that window. Below Meta's optimization noise floor.
optimization_event_volume_low
- 17
Spend fragmented across too many small ad sets
Account has 8+ active spending ad sets and $3K+/mo spend, but the top 3 ad sets hold less than 50% of total spend. Budget is too thin to feed Meta's auction.
spend_fragmentation
- 18
Active prospecting running on too few creative concepts
Account has fewer than 6 distinct active creative concepts at $2K+/mo spend. One fatigue cycle away from CTR collapse.
creative_volume_floor
- 19
Advantage+ Shopping without an existing-customer budget cap
ASC campaign with the existing-customer cap unset, or set above 35% of ASC spend. Meta defaults to over-spending on existing customers.
asc_existing_customer_cap_missing
- 20
Bid cap set higher than the account's actual target CPA
Ad set on Lowest-Cost-Without-Cap at meaningful spend, OR Cost Cap set 20%+ above AOV/target ROAS. Meta optimizes against the wrong CPA.
cost_cap_vs_aov_mismatch
- 21
Retargeting spend share is too high
Retargeting + existing-customer audiences take more than 35% of account spend. Paid Meta is cannibalizing organic and email, not incrementing.
prospecting_retargeting_imbalance
- 22
Conversions API Event Match Quality below the optimization floor
Purchase event EMQ score below 7.0. CPA inflates 15-30% when Meta can't match server events back to a person.
capi_event_match_quality_low
- 23
Browser pixel and CAPI events are double-counting
Purchase event dedup rate below 0.85. Meta is counting some purchases twice; reported ROAS is inflated, every other finding's dollar estimate compounds the error.
pixel_capi_deduplication_broken
- 24
Reported conversions dominated by 1-day-view attribution
More than 40% of attributed purchases came via 1-day-view. Likely cannibalization of organic / email rather than true incremental lift.
attribution_one_day_view_overdependent
Versioning + changelog
Determinism without versioning isn't determinism.
A “deterministic engine” that silently changes its thresholds isn't deterministic — it just hides where it moved the line. So when a rule's logic changes, the version bumps and the diff lands here, dated, with the rule key, the previous value, and the new one. Your audit also records the version it ran against, so a finding three months ago is reproducible against the rule that fired it.
- v1.2Six new rule families· May 22, 2026
Added six new detection families targeting the gaps senior media buyers flagged in the 2026 Pilothouse / Common Thread Collective / Sam Tomlinson audit frameworks: creative_volume_floor, asc_existing_customer_cap_missing, cost_cap_vs_aov_mismatch, prospecting_retargeting_imbalance, capi_event_match_quality_low, pixel_capi_deduplication_broken, and attribution_one_day_view_overdependent. All six are deterministic or strict-α (0.001) so the /why-15 false-positive math still scales at 24 rules (~0.80 expected false positives per audit). Most require a Meta read-only connection to fire — they silently withhold on CSV-derived snapshots until OAuth populates the new fields. Engine is now 24 rule families.
- v1.1Two new rule families· May 22, 2026
Added optimization_event_volume_low (ad sets spending $350+ in the last 7 days with fewer than 25 purchases — below Meta's optimization noise floor) and spend_fragmentation (accounts with 8+ active ad sets where the top 3 hold less than 50% of spend). Both deterministic, CSV-runnable, sourced to Pilothouse, Common Thread Collective, and Sam Tomlinson's 2026 frameworks. Brought the engine to 17 rule families (extended again to 23 in v1.2 above).
- v1.0Initial release· May 2026
Fifteen detection rules shipped. Nine run on a CSV upload today; six require Meta read-only access and unlock the day OAuth ships. Every rule's logic and thresholds are documented on its detail page above. Confidence math, false-positive cases, and the “what would change our mind” note are published per rule.
Future changes — a threshold lowered, a rule retired, a new rule added — will land as new entries here with the date, the rule key, the before/after value, and a one-line reason. If a rule fires on your audit, the report records the version it ran against. Spot a rule you think should be sharper? Email Nachiket.
Now you've read the method
See it run, then see what it costs.
Run a full audit free, once a month, forever. When you want every finding, the pricing page has both plans — flat-rate, no surprises — and a dated timeline of what's coming next.