# Creative Lifecycle (/docs/concepts/creative-lifecycle)



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 [#state-details]

### Draft [#draft]

A workflow is mid-generation. Visible in the
[generated content tab](/docs/social/content-generation) with a spinner. If
generation fails, the `content_container.status` is set to `failed` and the
optimizer never sees it.

### Generated [#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](/docs/paid-media/creative-library).

### Approved [#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 [#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](/docs/concepts/optimizer#decisions): `TOO_YOUNG`,
`LEARNING_PHASE`, `TOP_PERFORMER`, `HEALTHY`, `UNDERPERFORMING`,
`FATIGUED`, or `CRITICAL`.

### Fatigued [#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 [#disabled]

Either the optimizer paused the ad (per the
[refresh workflow](/docs/paid-media/refresh-cycle)), or you pressed Pause in
the UI. A disabled ad can be relaunched manually.

### Archived [#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 [#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 [#why-a-fatigued-ad-isnt-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](/docs/concepts/safety-guardrails).
