Honest Growth
← All detections

Detection · audience_overlap

Detection: Ad sets bidding against each other

Key: audience_overlap Severity: Medium–High Confidence: 75–90%

What this detection looks for

We flag a pair of ad sets when both of these are true:

  1. Both ad sets are active
  2. They each target a custom audience, and the two audiences have ≥ 30% user overlap according to Meta's audience overlap report

We fire one finding per pair, deduplicated regardless of audience order.

Why this matters

When two ad sets in the same account target audiences that share users, those users see your ads from both ad sets and Meta runs an internal auction in which your two ad sets compete against each other. The auction mechanic guarantees that the winning bid is higher than it would have been in a single ad set — meaning your account pays more per impression to reach the same user.

The effect is small at 30% overlap and large at 50%+ overlap. Above 70% overlap, the two ad sets should almost always be consolidated.

How we calculate confidence

Condition Confidence
Audience overlap ≥ 50% 90%
Audience overlap 30–50% 75%
Audience overlap below 30% We don't surface the finding

How we calculate the estimated monthly cost

We estimate the wasted share of combined spend conservatively. The mechanism is auction inflation, which is hard to measure exactly without counterfactual auction data. We surface a share of combined spend as the recoverable waste, projected to a 30-day month.

  • ≥ 50% overlap → 10% of combined spend is treated as waste
  • 30–50% overlap → 5% of combined spend is treated as waste

monthly_recoverable = (combined_ad_set_spend × waste_share) × (30 / days_in_range)

We deliberately stay below the 15–20% figures sometimes cited in the industry, because those numbers assume the more overlapped audience was also the one you would have kept — a claim that requires more evidence than we have.

What would change our mind

This finding can be a false positive in a small number of cases:

  • One ad set is a deliberate retargeting layer. If audience A is "site visitors" and audience B is "purchasers excluded prospecting," the overlap is intentional and the higher cost is a designed feature. The fix is to ensure the retargeting ad set excludes the purchaser audience rather than to consolidate.
  • Different objectives or different funnel stages. If one ad set is optimizing for Initiate Checkout and the other for Purchase, the apparent overlap may still be useful because the ad sets are not competing for the same conversion event.
  • One ad set's audience is much smaller. Meta's overlap report reports A∩B as a share of A. A 50% overlap on a 5,000-person retargeting audience overlapping a 5M-person lookalike is not the same problem as 50% overlap on two 1M audiences. Check the absolute audience sizes.

How to fix it

  1. Open Meta's Audience Overlap tool in Audiences and confirm the overlap.
  2. Decide which ad set is the primary for that audience — typically the one with higher ROAS or longer history.
  3. In the secondary ad set, add the primary's custom audience to the exclusion list. This stops the auction conflict.
  4. If both ad sets are equivalent (same objective, similar creative), consolidate them. The combined ad set will exit learning faster than either alone.
  5. Re-audit in 7 days. If the secondary ad set was carrying the overlap, you should see CPM drop on the primary.

What we look at to make this detection

  • effective_status on each ad set
  • included_custom_audience_ids on each ad set's targeting spec
  • Meta's audience-overlap endpoint, called for each pair of custom audiences that meet a minimum size threshold. The endpoint returns the share of audience A's users that also appear in audience B. We treat the overlap as symmetric for flag purposes
  • spend insights metric per ad set, summed across the audit date range

Source

This methodology page is generated from apps/api/app/services/detections/audience_overlap.py. The detection code is open for inspection. We do not have hidden rules.

See it run on a real account.

The sample audit shows this and 14 other detections fired against a synthetic but realistic $30K/month account.