# Campaigns

Campaigns control the merchandising execution window: `start_at` -> `end_at`.

## What gets created
- `start_run` of type `apply_plan` with `available_at = start_at`.
- `rollback_run` (or `apply_plan` for a revert plan) with `available_at = end_at`.
- Dependency: `rollback_run.depends_on_run_id = start_run.id`.
- Correlation: `merch_runs.correlation_id = campaign-{id}`.

## Auto-revert modes
- `rollback_snapshots`: restore from the pre-apply snapshot state.
- `apply_plan`: run a dedicated revert plan (`revert_plan_id`).

## Campaign statuses
- `draft`, `scheduled`, `running`, `completed`, `canceled`, `failed`.

## Best practices
- Generate preview before scheduling.
- Do not schedule a campaign without reviewing blocked/conflict items in preview.
- For high-risk promotions, use approval policy + Jira ticket policy.
