Creative Lifecycle
Generated → reviewed → live → fatigued → refreshed. The states a creative passes through and what triggers each transition.
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.