Layers

Content Refresh Cycle

Nightly disable+replace cycle that keeps every ad set running fresh, eligible creatives.

View as Markdown

Content-refresh workflows run on each ad layer. They:

  1. Disable underperforming ads on each ad set, subject to guardrails.
  2. Refresh creative pool — re-run creative selection per ad set to pick top-N.
  3. Launch replacements — push new creatives onto ad sets.
  4. Activate — flip the new ads to active.

The global ads-optimize schedule runs daily and fans out per layer. Per-layer cron overrides are honored if set in project_layers.schedule.

Disable rules (recap)

The disable step pauses ads classified as UNDERPERFORMING or FATIGUED, subject to:

  • Min 3-day age.
  • Min $5 total spend.
  • Never disable TOP_PERFORMER or HEALTHY ads.
  • Never leave an adset/adgroup with zero active ads.
  • Fallback: ads older than 30 days with no metrics are disabled.

What the refresh DOES NOT do

  • It does not raise budgets — that's a separate optimizer pass.
  • It does not change targeting / audiences.
  • It does not fetch new metrics — that's the global metrics-sync schedule.
  • It does not consider organic_score for already-running ads (only for selection of new ones).

Watching the refresh

Open the layer detail → Runs tab → filter to content-refresh workflow. You'll see one run per night per layer with all activities logged.

Manual refresh

Layer settings → Refresh now. Triggers an out-of-cycle run. Useful when you've just approved a batch of creatives and want them in the mix immediately.

Per-platform variations

  • Meta — refreshes ads within ad sets.
  • TikTok — refreshes ads within ad groups; Spark Ads handled identically.
  • Apple Search Ads — refreshes ad-group keywords (a different unit than creative; the "creative" for ASA is your App Store listing).

What you'll see in the morning

After a refresh:

  • Some ads paused with reason "FATIGUED — replaced".
  • New ads activated. On Meta, new ads typically enter the platform's LEARNING effective status, which Layers reflects as the LEARNING_PHASE classification.
  • The optimizer's daily summary in the notifications inbox.

A min-age guardrail of 3 days prevents the optimizer from pausing or adjusting any entity younger than 3 days — so brand-new ads are protected regardless of how the platform's own LEARNING phase behaves.

On this page