Campaign / Gig Lifecycle

The state machine every gig moves through, from posting to payout. This is the backbone the data model, notifications, and payment triggers all hang off of.

States

DRAFT
  │  (hirer saves brief but hasn't published)
  ▼
OPEN
  │  (published; visible in marketplace; accepting pitches, or a direct offer sent)
  ▼
PITCHED / OFFER_SENT
  │  (creator has applied, or hirer sent a direct offer)
  ▼
NEGOTIATING            (optional loop: counter-offers on rate/scope/timeline)
  │
  ▼
HIRED / ACCEPTED
  │  (both sides agreed; escrow funded — see 08-payments-escrow.md)
  ▼
IN_PROGRESS
  │  (creator working; milestone checkpoints if applicable)
  ▼
SUBMITTED
  │  (creator delivers; hirer review window starts)
  ├──► REVISION_REQUESTED ──► (back to IN_PROGRESS, within revision cap) ──► SUBMITTED
  ├──► DISPUTED ──► (admin mediation — see 07-trust-safety.md) ──► resolved into APPROVED or REFUNDED
  ▼
APPROVED
  │  (hirer approves, or auto-approve timeout elapses — see below)
  ▼
COMPLETED
  │  (escrow released to creator, minus platform commission)
  ▼
[REVIEWED]  (both sides leave reviews — can happen any time after COMPLETED, doesn't block payout)

Terminal/exception states: CANCELLED (before HIRED, no funds moved), REFUNDED (dispute resolved in hirer's favor, funds returned minus any dispute-resolution fee policy), EXPIRED (gig posted but never received a pitch/offer within its listed window).

Key rules and edge cases

Notification triggers (non-exhaustive, informs features docs)

Every state transition above should fire a notification to the relevant party: new pitch received, offer sent, offer accepted, deliverable submitted, revision requested, approval/payment released, dispute opened, deadline approaching (T-24h reminder), auto-approval window closing soon.