Honest Growth
← All detections

Detection · learning_phase_stuck

Detection: Ad set stuck in Meta's learning phase

Key: learning_phase_stuck Severity: High Confidence: 80–95%

What this detection looks for

We flag an ad set as learning-phase-stuck when all of these are true:

  1. The ad set is active
  2. Its learning_status is LEARNING or LEARNING_LIMITED
  3. It was created at least 14 days before the end of the audit date range

Why this matters

Meta's optimization model requires roughly 50 conversion events per ad set per 7-day window to exit the learning phase. An ad set that has been live for two weeks and is still in learning is telling you one of three things:

  • The conversion volume is too low for the optimization goal
  • The conversion event you have selected is too rare for this ad set's audience and budget
  • The targeting is too narrow to generate qualifying conversions at the required rate

Spending into a stuck ad set produces inflated CPAs because Meta is still exploring rather than exploiting. The fix is to consolidate the ad set into a higher-volume sibling, move it to a higher-funnel conversion event, or pause it and start over with a broader audience.

LEARNING_LIMITED is the harder case: Meta has explicitly told you the ad set will not exit learning at the current budget and audience size. The fix options are narrower than for plain LEARNING.

How we calculate confidence

Condition Confidence
LEARNING_LIMITED (any duration ≥ 14 days) 90%
LEARNING for > 21 days 95%
LEARNING for 14–21 days 80%
LEARNING for less than 14 days We don't surface the finding

How we calculate the estimated monthly cost

We project the ad set's observed spend across the audit date range to a 30-day month at the same daily run rate.

monthly_cost = (observed_spend_in_range / days_in_range) × 30

This is the dollar amount being spent into an ad set that the platform's own delivery system says it cannot optimize for you. It is not a perfect waste number — some conversions happen even in learning — but it is the budget exposure of the broken ad set.

What would change our mind

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

  • The ad set was recently edited. A budget change, a new ad, a creative swap, or a targeting edit resets the learning phase. If the edit happened within the last 7 days, the ad set is in a fresh learning window and the finding does not apply.
  • The conversion event is rare by design. High-AOV products with low conversion volume (custom software, luxury goods, B2B) often run permanently in learning. The fix is to optimize on a higher-funnel event (Add to Cart, Initiate Checkout, Lead) and treat the deeper event as a reporting metric.
  • Account-level event volume is low across the board. If every ad set in the account is stuck in learning, the problem is account-level conversion volume, not this specific ad set. Consolidate ad sets first.

How to fix it

  1. Check when the ad set was last edited. If within 7 days, wait — the learning window has reset.
  2. Count the actual conversion volume in the last 7 days. If it is below roughly 25 conversions, the ad set will not exit learning at the current budget.
  3. Choose one of the following, in order of preference:
    • Consolidate. Merge with a similar sibling ad set so the combined volume exceeds 50 conversions per week.
    • Move to a higher-funnel event. Optimize for Add to Cart or Initiate Checkout if your purchase volume is too low.
    • Increase budget. Only if the audience is large enough to absorb the additional spend — otherwise you are just spending more on the same exploration.
  4. If LEARNING_LIMITED: the audience is too narrow for the budget. Expand the audience or reduce the budget. Do not just wait it out.

What we look at to make this detection

  • effective_status on the ad set
  • configured_status.recommendations.learning_phase from the ad set object (mirrored into the snapshot's learning_status field)
  • created_at on the ad set, compared to date_range_end
  • spend insights metric summed across the audit date range

Source

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