/audience is the lead-capture campaign manager. A campaign defines a capture
surface (a form, popup, or gated asset) with its GDPR consent requirements and
drain destinations; the Leads view is the per-campaign inbox of captured records.
The entry page (page.tsx) is a client state machine over four views —
list, create, edit, and leads — backed by CampaignForm, CampaignList,
and LeadsView under components/.
| Route | Purpose | Guard |
|---|---|---|
/audience | Campaign list, create/edit form, per-campaign leads inbox | org:leads:view (layout.tsx) |
The module gate lives in
layout.tsx
via requirePermission("org:leads:view").
| Route | Purpose | Guard |
|---|---|---|
GET /api/workspace/campaigns | List campaigns | org:leads:view |
POST /api/workspace/campaigns | Create a campaign | org:leads:view |
PUT /api/workspace/campaigns/[id] | Update a campaign | org:leads:view |
POST /api/workspace/campaigns/[id]/clone | Duplicate a campaign | org:leads:view |
GET /api/workspace/campaigns/[id]/leads | Leads inbox for one campaign | org:leads:view |
Source: api/workspace/campaigns.
Each campaign carries name, slug, source, a require_gdpr flag with a
consents list, drains (downstream destinations), a meta map, and status.
The list view surfaces leadCount per campaign so operators can see volume at
a glance before drilling into the leads inbox.
org:leads:view