Honest Growth
← All detections

Detection · placement_imbalance

Detection: One placement dominates spend with worse unit economics

Key: placement_imbalance Severity: Medium–High Confidence: 70–85%

What this detection looks for

We flag an ad set as placement-imbalanced when all of these are true:

  1. The ad set is active
  2. Its placement breakdown is available and includes at least two non-Audience-Network placements
  3. One placement (not Audience Network) takes ≥ 60% of the ad set's spend in the date range
  4. The dominant placement's cost-per-purchase is at least 1.5× the weighted CPA of all other placements combined
  5. The ad set has ≥ 20 total purchases across all placements in the date range (so the comparison is statistically meaningful)

Audience Network is deliberately excluded from this detection because it has its own (audience_network_leak).

Why this matters

Meta's auto-placement is generally good but it overweights placements where impressions are easy to win, not necessarily where conversions are strong. When 60–80% of an ad set's budget goes through one placement at 1.5–2× the CPA of the others, you are systematically paying more for the same business outcome than you would if the budget were redistributed.

The fix is rarely to turn the dominant placement off — most accounts need it for delivery scale. The fix is to either pin the ad set to a manual mix that constrains the dominant placement, or to split a portion of the budget into a sibling ad set that uses the better-performing placements exclusively.

How we calculate confidence

Condition Confidence
Dominant placement share ≥ 75% AND CPA ratio ≥ 2.0× 85%
Dominant share 60–75% AND CPA ratio 1.5–2.0× 70%
Either signal below the minimums We don't surface the finding

How we calculate the estimated monthly cost

We treat 25% of the dominant placement's spend as the slice that could reasonably shift to better-performing placements, projected to a 30-day month.

monthly_recoverable = (dominant_placement_spend × 0.25) × (30 / days_in_range)

We choose 25% rather than 100% because:

  • The dominant placement is not zero-value — it does produce some conversions, just at a worse rate.
  • Auction dynamics prevent a 1-for-1 reallocation; some of the freed budget will be absorbed by inflated bids elsewhere.
  • A 25% shift is a conservative first move and matches what a careful practitioner would actually do.

What would change our mind

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

  • The dominant placement has a much larger reach inventory. Stories placements, for example, often dominate spend simply because there is more inventory than feeds at the same audience. If you cap stories, delivery may shift in ways that hurt total volume.
  • The dominant placement's "worse CPA" is recent. If you launched a new creative format that works well on feeds but not stories, the CPA gap will close once the format is rolled out everywhere. Check whether the creative is placement-specific before reallocating.
  • Brand-defining placement. Some brands intentionally over-invest in one placement (e.g., Reels for younger audiences) because the brand experience matters more than CPA on that surface. We can flag the imbalance, but you may keep it deliberately.

How to fix it

  1. Confirm the placement breakdown in Meta Ads Manager — open the ad set, choose Breakdown → By Delivery → Placement.
  2. Decide whether the underperforming placements have actually been tested with the creative being run. If creative is the same across placements but only one format works on a specific surface, fix the creative first.
  3. Duplicate the ad set with manual placements, selecting only the well-performing placements. Allocate 25% of the original ad set's budget to the duplicate.
  4. Run 7–14 days. If the duplicate's CPA is ≥ 20% better than the original, increase its budget share. If similar or worse, the placement signal is auction-driven rather than performance-driven — keep auto-placements.

What we look at to make this detection

  • effective_status on the ad set
  • Insights with breakdowns=publisher_platform,platform_position over the audit date range. Each placement returns spend, impressions, clicks, and purchase conversions
  • Spend share and CPA per placement bucket, with Audience Network excluded from the comparison

Source

This methodology page is generated from apps/api/app/services/detections/placement_imbalance.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.