With that established, here is what the planner is genuinely good at.
Two ways in
- Plan a campaign
- Approve a plan Leed drafted
You start from nothing: create the campaign, write a subject and preview line, pick the personas and accounts it aims at, then add the deliverables that make it up and approve them as they firm up. Everything below describes this path in order.
The one thing you cannot do on this path from the Engage screen alone is add a deliverable — there is no create control for one in the campaign body. Deliverables arrive from Chat, from an AI client, or through the API, which is why the empty sequence list reads “No deliverables planned yet. Approve a plan to populate the sequence.”
The more common path in practice. You ask the Leed Assistant for a campaign, it creates the campaign and drafts a sequence of deliverables against it, and your job becomes review rather than authorship.
Those drafted deliverables land on the Plan calendar immediately, and any campaign carrying a deliverable still in draft raises a review strip there for anyone holding contact:publish. Approving from that strip is the fastest route: it pre-selects every draft item, lets you untick the ones you do not want, and approves the rest in one action. The plan calendar documents that overlay.
Creating a campaign
The + button in the left panel opens the create form, as does /engage/campaigns/new. Creating needs contact:write, whose minimum role is Content Publisher.
The form asks for three things: a Campaign name, a status — draft, scheduled or active — and a Subject line. Preview text is not on the create form; you add it inline afterwards.
The list groups every campaign under Campaigns · N, showing the name, the subject line (or —), and a status dot — gray for draft, amber for scheduled, green for active. Sorting by signal puts active campaigns first, then scheduled, then drafts. Search matches the name and the subject.
The builder strip
Across the top of a selected campaign sit five steps that tick themselves from real data. None of them is a wizard — you can work in any order, and a tick is a description rather than a gate.
| Step | Ticks when |
|---|---|
| Objective | A subject line or preview text exists |
| Audience | At least one persona or account is targeted |
| Content | At least one deliverable exists |
| Schedule | Some deliverable carries a real date and the status is not draft |
| Live | The status is active |
The last two depend on you changing the status by hand, which is why a campaign with a full, dated, approved sequence can still show two unticked steps. Approving a deliverable flips the status to scheduled and ticks Schedule; only you can tick Live.
Objective
Two cards: Subject and Preview text. Both edit in place and save on their own — click, type, click away. They are the campaign’s stated intent and the seed for anything Chat drafts against it; because nothing sends, they are not yet an email header.
Audience
A campaign targets personas and accounts. Both are edited inline: each card lists the current targets with a remove control and an Add persona… / Add account… picker beneath, and every change replaces the whole target set on the server.
There is no contact-level targeting and, importantly, no recipient count anywhere. The audience stores target ids and never resolves them to people, so nothing on this screen will ever tell you that a campaign reaches 412 contacts. Readers look for that number; it is not there and it is not hiding.
What targeting does do today is real but modest. It fills the Campaigns facet on each targeted persona, so somebody reading a persona can see what is aimed at it. It gives the same for a targeted account. And it gives Chat a concrete audience to write against when you ask it to refine the plan.
Deliverables
The Content & sequence list is the campaign’s actual plan. Each deliverable carries a title, a type, a scheduled date, an ordering number, an optional detail note, an optional assignee, and an approval state. Rows sort by order, then by date, and each shows its type icon, its title, type · date, and its approval pill.
Every deliverable must also reference exactly one real thing — a page, a deployment or an email batch. That rule is type-agnostic and enforced on write: a social or event deliverable still has to name one of the three, and supplying none, or two, is a 400 reading “exactly one of pageId, deploymentId, or leadBatchId is required”.
| Type | What it represents | Reference it carries | On the Plan calendar |
|---|---|---|---|
new-page | A new page to be written and published | A page | As a deliverable, with its type and approval state |
republish | An existing page to be revised and republished | A page | " |
site-update | A change to the site itself rather than to one page | Usually a deployment | " |
email | An email to go out — and the only type the Performance facet reads | An email batch | " |
social | A social post | One of the three, whichever fits | " |
event | A webinar, launch or other dated moment | One of the three | " |
deploy | A deployment of the site | A deployment | " |
The calendar treats all seven the same way: it shows the title, the date, the deliverable type and the approval state. It does not render a different shape per type.
Approving a deliverable
Approval is a separate privilege — contact:publish — and there are three states in the data model.
| State | Pill | Who sets it | Effect |
|---|---|---|---|
draft | Draft, gray | Set automatically on creation | Counts against the approval percentage; raises the review strip on the Plan calendar |
approved | Approved, green | Anyone with contact:publish | Stamps who approved it and when, and moves the campaign to scheduled. Approving an already-approved item answers 409 |
rejected | Rejected, red | Nothing. No route and no control writes this state | — |
The rejected state is real enough to have a pill, and there is currently no way to reach it: the approve endpoint is the only writer of the column, and it only ever writes approved. If you want an item out of a plan, delete it.
What each action needs
| Action | Privilege | Minimum role | Plan gate |
|---|---|---|---|
| List and read campaigns | contact:read | Read Only | Growth |
| Create, update or delete a campaign | contact:write | Content Publisher | Growth |
| Read a campaign’s audience | contact:read | Read Only | Growth |
| Set a campaign’s audience | contact:write | Content Publisher | Growth |
| List a campaign’s deliverables | contact:read | Read Only | Growth |
| Create or delete a deliverable | contact:write | Content Publisher | Growth |
| Approve a deliverable | contact:publish | Content Publisher | Growth |
| Read campaign email metrics | contact:read | Read Only | Growth |
| Read the plan calendar | contact:read | Read Only | None |
Every one of those permission checks resolves overrides against the contact resource specifically, so an override that elevates somebody on a page or a label does not satisfy a campaign route. Below Growth, the routes answer 402 rather than 403 — but only after the permission check has passed, so a reader without contact:read gets a 403 on a Growth workspace and on a Free one alike.
How this reaches the Plan calendar
Every deliverable whose date falls inside the week you are looking at appears on the plan calendar, alongside scheduled page revisions and deployments. Approval state is not a filter — a draft deliverable is on the calendar too, carrying its Draft pill, which is precisely what makes the review strip appear.
That strip is the campaign’s real workflow. A campaign holding any draft deliverable prompts anyone with contact:publish to review and approve, and approving from there is what moves the campaign to scheduled.
Performance
The Performance facet rolls up genuine per-recipient send data: it collects the email batches referenced by this campaign’s email-type deliverables and sums their recipients, sends, opens, clicks, unsubscribes and bounces, showing open and click rates against sends. Unsubscribes and bounces appear only when they are non-zero.
Those numbers come from the same open and click trackers as any other send, described in tracked links and open tracking.
Why the Performance facet is empty
Because the planner does not send, and the facet only reports on sends.
It reads “Send metrics appear once this campaign’s emails go out.” whenever the rolled-up sent count is zero, which is the normal state for a campaign you have only planned. To get a number into it, three things have to line up: a deliverable of type email, that deliverable referencing a real email batch, and that batch having actually been sent from the email surface.
In other words the facet is a reporting hook waiting for the send half of the product. It is not broken, and no amount of approving or setting a campaign Active will populate it.
The rest of the facet rail
- Plan — Deliverables, Approved and Draft counts, the campaign status, and an approval-progress bar reading
N% approved. Empty until a deliverable exists. - Schedule — every dated deliverable in date order. Empty, it reads Nothing scheduled yet.
- Channels — the distinct deliverable types present, as chips. It is a one-glance answer to “is this actually multi-channel?”
- Actions — Refine plan with Leed, which opens Chat with a prompt naming the campaign and asking for an objective, an audience and a sequence; and Duplicate campaign, which really does create something: a new campaign named
(copy) , indraft, carrying the subject and preview text. It does not copy the audience or the deliverables, so a duplicate starts with an empty plan. - Leed suggests — one of three fixed sentences, chosen by counting deliverables and approvals. It is written by an
ifstatement, not by a model, and it says either draft a first piece, N deliverables still need approval, or all deliverables are approved.
Deleting a campaign
Delete sits in the header and needs contact:write. It removes the campaign row and its audience targets.
Campaigns from an AI client
Most of the campaign surface is reachable over MCP, under the same contact:* permissions and the same Growth gate as the screen:
| Tool | What it does |
|---|---|
list_campaigns | Lists the workspace’s campaigns |
create_campaign | Creates one |
update_campaign | Changes name, status, subject or preview |
get_campaign_audience | Reads the targeted persona and account ids |
set_campaign_audience | Replaces the whole target set |
list_campaigns_for_persona | The reverse lookup behind a persona’s Campaigns facet |
list_campaign_deliverables | Reads a campaign’s sequence |
create_campaign_deliverable | Adds one — the only way to add a deliverable other than the API |
get_campaign_email_metrics | The Performance roll-up |
Three more exist but are assistant-only rather than MCP-visible, because each is destructive or an approval: delete_campaign, approve_campaign_deliverable and delete_campaign_deliverable. An external client can plan a campaign for you; it cannot approve or dismantle one. The campaigns and personas tool reference has the argument shapes, and get_plan_calendar — the one that keeps working below Growth — is documented with the publishing and distribution tools.
The seam, drawn
flowchart LR
C["Campaign<br/>name · status · subject · preview"] --> A["Audience<br/>personas + accounts"]
C --> D["Deliverables<br/>title · type · date · order"]
A -.->|"fills the Campaigns facet<br/>no recipients resolved"| P["Persona / Account"]
D --> AP{"Approved?"}
AP -- "draft" --> CAL["Plan calendar<br/>with a review strip"]
AP -- "approved" --> CAL2["Plan calendar<br/>campaign moves to scheduled"]
D -->|"email-type deliverables only"| PERF["Performance facet"]
B["Email batch actually sent<br/>from the Email surface"] --> PERF
CAL2 -.->|"NOT IMPLEMENTED — nothing here sends"| SEND["Email send"]
G["Contact group"] --> B
style SEND stroke-dasharray: 5 5
The dashed edge is the whole point of the diagram. Everything to its left works; the arrow itself does not exist. To email the people a campaign is aimed at, build a contact group and send to it from the email surface — the two halves meet only if you link the resulting batch to an email deliverable by hand, and even then the link is for reporting.