Layers

Creative Selection

How creatives are picked from the eligible pool for each ad set. The 3-pool model.

View as Markdown

When the optimizer needs new creative, the creative-selection step runs:

  1. Filterorganic_score >= 4.0 OR override = 'include', AND not override = 'exclude', AND not safetyFailed = true.
  2. Bucket — into generated, ugc, and manual pools.
  3. Rank within each pool by score.
  4. Pick top N per pool to fill the ad set, subject to maxCreativesPerAdset and platform hard limits.
  5. Diversify — never put all generated or all UGC if both pools have eligible content above threshold.

Default pool slots

Each pool gets an equal slot budget by default (3 per pool), with unfilled slots redistributed round-robin across pools that still have candidates, plus one extra "wildcard" slot for the best remaining candidate across all pools:

ParameterDefault
generatedSlots3
ugcSlots3
manualSlots3
maxCreativesPerAdset10

If the generated pool is short (say 1 candidate), the 2 unused slots get redistributed to UGC + manual. Final count is then capped at maxCreativesPerAdset.

maxCreativesPerAdset

Default: 10. Hard upper bound is Meta's per-adset limit of 50 ads. Adsets already at the 50-ad cap are skipped entirely from new selection.

Pinning

Use Pin creative on the ad set's Creative tab to bypass selection entirely. Pinned creatives always run; non-pinned creatives still go through selection.

Blocking

Use Block creative to exclude a specific creative from selection on this ad set (without affecting other ad sets).

Why your "best" creative isn't running

  • It's override = 'exclude'.
  • Score below 4.0 (check the score history).
  • Ad set already has its maxCreativesPerAdset slots filled with higher scorers.
  • safetyFailed = true — regenerate.
  • Missing a caption (candidates with no caption are filtered out before selection).
  • Its media failed validation (e.g. video smaller than 10KB, or no valid video content-type).

Refresh cycle

Selection re-runs nightly via the refresh cycle. It can also be triggered manually via the ad set's Refresh now button.

On this page