Layers

Creative Lifecycle

Generated → reviewed → live → fatigued → refreshed. The states a creative passes through and what triggers each transition.

View as Markdown

A creative's life inside Layers passes through a small set of states. Knowing them helps interpret the dashboard and the optimizer's actions.

[idea]

draft  (workflow generated; content_container, in `processing`)

generated  (content_container.status = `completed`; ads_content row created with score 7.0)

approved  (a human, or auto-approval, marks it ready)

live  (the optimizer launches it as an ad in one or more adsets)

fatigued  (frequency high, day-7 vs day-1 CPA degraded)

disabled  (paused by optimizer or by a human override)

archived  (no longer eligible; metadata retained for analytics)

State details

Draft

A workflow is mid-generation. Visible in the generated content tab with a spinner. If generation fails, the content_container.status is set to failed and the optimizer never sees it.

Generated

The workflow completed successfully. The content_container.status is completed. A trigger creates an ads_content row with default organic_score = 7.0 and scoring_pool = 'generated'. Visible in the creative library.

Approved

Approval is controlled by the project's approval policy (projects.metadata.approval_policy.requiresApproval). When approval is required, each content_container carries an approval_status column (not_required, pending, approved, rejected) and distribution / ads flows only schedule content whose status is approved or not_required. Approval is one click in the creative library, or a POST /v1/content/:id/approve from the Partner API.

When approval is not required, generated content goes straight from generated to eligible for selection.

Live

The optimizer has launched this creative as an ad in at least one adset. Spend and metrics begin accumulating. The optimizer assigns the ad a classification: TOO_YOUNG, LEARNING_PHASE, TOP_PERFORMER, HEALTHY, UNDERPERFORMING, FATIGUED, or CRITICAL.

Fatigued

The optimizer has detected fatigue (high frequency, day-7 vs day-1 CPA divergence). The ad is eligible for pausing on the next refresh cycle.

Disabled

Either the optimizer paused the ad (per the refresh workflow), or you pressed Pause in the UI. A disabled ad can be relaunched manually.

Archived

A disabled ad whose underlying creative has dropped below threshold and is no longer in the eligible pool. Metrics are retained for historical reporting.

Manual transitions

You can force any of these via the UI:

  • Approve / un-approve in the creative library.
  • Pause / activate at the ad level in the ads detail panel.
  • Override include / exclude to keep a creative permanently in/out of the eligible pool.
  • Regenerate to spin up a new creative based on an existing one.
  • Archive to remove from active management entirely.

Why a fatigued ad isn't always paused

The optimizer respects guardrails. A FATIGUED ad whose removal would empty the adset/adgroup will not be paused. An ad under 3 days old is never paused — it gets classified TOO_YOUNG or LEARNING_PHASE instead. See the optimizer guardrails.

On this page