Honest Growth
← All detections

Detection · cost_cap_vs_aov_mismatch

Detection: Bid cap set higher than the account's actual target CPA

Key: cost_cap_vs_aov_mismatch Severity: High Confidence: 85% Shipped: v1.2, May 2026 Runtime: Requires Meta OAuth (the bid_strategy and bid_amount_cents fields aren't in CSV exports).

What this detection looks for

We fire one finding per ad set when all of these are true:

  1. The ad set is ACTIVE with monthly spend projecting to ≥ $1,000
  2. bid_strategy is not UNKNOWN (CSV path withholds)
  3. The account has ≥ 30 purchases in the audit window with positive total purchase value (so we can compute an AOV)
  4. The ad set's bid strategy is either:
    • LOWEST_COST_WITHOUT_CAP, OR
    • COST_CAP with bid_amount more than 1.2 × the implied target CPA (AOV ÷ 2.5)

Why this matters

Common Thread Collective's audit point #4: cost cap should equal AOV ÷ target_ROAS. Many accounts run Lowest Cost without a cap (Meta will chase any conversion at any cost), or carry caps set months ago against a stale AOV. The result is systematic ROAS leak — Meta optimizes against a target that's wider than the account's actual margin allows.

We use target ROAS = 2.5 as the default. That's the most-common DTC target band; profitable accounts often run higher. The 1.2× overshoot factor allows reasonable buffer above the strict target without flagging every conservative cap.

How we estimate the recoverable dollars

target_cpa = account_AOV ÷ 2.5
overshoot_threshold = target_cpa × 1.2
monthly_recoverable = ad_set_spend × 0.20 × (30 / audit_days)

The 20% factor is the Common Thread Collective–cited typical efficiency loss when bid strategy isn't aligned with target margins. Conservative end of the range.

What would change our mind

  • Different target ROAS. Some accounts profitably run at 1.8× or even 1.5× ROAS (high-LTV subscription, replenishment products). The default 2.5× is conservative for those. Treat the dollar estimate as a ceiling.
  • Recent re-strategy. A bid strategy changed in the last 7 days may be tuning. Re-audit in 2 weeks; if it still fires, the cap is genuinely mis-calibrated.
  • Cost cap above AOV/ROAS but spend is well below cap. If Meta isn't actually bidding to the cap (auction is finding cheaper inventory), the cap-vs-AOV mismatch isn't directly costing money. Look at recent CPA vs the cap — if CPA is far below the cap, the mismatch is paper-only.

What to do about it

  1. Compute your true target CPA: AOV × profit_margin × repeat_factor. For a DTC brand with $50 AOV, 40% margin, 1.5× repeat factor: target CPA = $50 × 0.4 × 1.5 = $30.
  2. Update the bid strategy on the affected ad sets. Move Lowest-Cost-Without-Cap to Cost Cap with the computed value; lower existing Cost Caps that exceed it.
  3. Re-feed the ad set. Meta needs ~7 days to re-stabilize against the new cap. Expect CPA to dip first, then volume to follow.

References

  • Common Thread Collective: 27-Point Facebook Ads Audit (point #4)
  • Pilothouse Q1 2026 Technical Review (bid-strategy section)

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.