Skip to main content

Campaigns routes: create wizard, journey canvas, and campaign detail walkthrough

The Campaigns console is four dashboard surfaces working one lifecycle: create, list, journey canvas, and the per-campaign detail page. The Campaigns hub overview maps them at a glance; this walkthrough is the per-route companion — it walks each surface the way a first-time operator meets it, explains which wizard path each campaign type takes, and names the role gates and the four questions that come up most on the list. Everything here points at the deeper guides when you need the full form-field or graph-contract detail. All four surfaces are canonical under Outbound → Campaigns (/outbound/campaigns/*); the legacy /campaigns/* paths redirect there.

1. The four ways into create

When you click New campaign, the chooser offers four entry paths. Which surface each one drops you into depends on the campaign type you’re launching: The blast and drip paths stay inside the create wizard; the journey and AI-prompt paths open the canvas. Drafts from either surface reopen on the same surface they were authored on: a wizard draft resumes at /outbound/campaigns/create?edit=<id>, a journey draft reloads onto the canvas at /outbound/campaigns/journey?edit=<id>. The wizard’s five steps and every field-to-API mapping are covered in Build a blast or drip campaign with the create wizard. The from-prompt loop — writing a brief the generator parses deterministically, reviewing the returned graph, rolling back a mis-branch — is covered in Author a campaign journey from a natural-language prompt.

2. The list surface

The landing page at Outbound → Campaigns is the campaign list: a stats bar over a card grid (or row list), with status tabs, a search box, channel and date filters, and paginated loading at 25 per page.
  • Status tabs. Filter to all, draft, running, paused, scheduled, completed, or failed. The running tab uses the same active-set rollup the stats bar does — it matches running, sending, and aborting together — so a blast actively fanning out shows up under running even though its raw status is sending. The full status set, including cancelled as a terminal outcome, is enumerated in Campaign lifecycle; campaigns you cancelled surface in search and date filters even though no tab is dedicated to the state.
  • Search. Matches campaign name. The box debounces input before issuing the query, so typing does not fire a request per keystroke.
  • Filters. Channel and date-range filters narrow the set further; all filters compose with the active status tab.
  • Pagination. The grid loads 25 campaigns per page and appends further pages as you scroll or page through. A campaign whose status changes mid-session (a scheduled send that started, a pause you triggered from the detail page) re-renders with its fresh status on the next refetch — the list never caches a stale status across pages.
Open any row or card to land on that campaign’s detail page. New campaign, Brief to draft, and Compose with AI sit on the toolbar; the journey-canvas entry is one click away from the same surface.

3. The journey canvas

Outbound → Campaigns → Journey is the visual builder for type: "journey" campaigns. The canvas is a node graph: a left palette of node types, a canvas you wire nodes together on, a config panel for the selected node, and save / simulate / activate actions in the toolbar. The node vocabulary: Before activation, run the simulator — it projects a contact’s path through the graph and flags the validation errors the activator would reject (unreachable nodes, cycles, missing exit criteria, overpowered send density). The canvas saves against the same variables.journeyDefinition contract the API validates, so a graph you built by hand and one generated from a prompt are the same artifact. The full build-validate-simulate-launch loop, including the graph contract, exit criteria, and per-node analytics after launch, is in Build, simulate, and launch a campaign journey.

4. The campaign detail surface

Clicking a campaign on the list opens /outbound/campaigns/[id] — the per-campaign read-and-control page. What renders depends on the campaign type and status, but the core panels are:
  • Stats panel — live totals for sent, delivered, failed, opened, clicked, and replied, refreshing as the campaign runs.
  • Drip analytics — per-step sent / delivered / read / failed for drip campaigns, so you can see where a sequence loses its audience.
  • Holdout lift — treatment-vs-control conversion-rate delta when the campaign carries a holdout percentage. See Measure holdout uplift for how the control group works.
  • ROAS attribution — attributed revenue, send cost, and ROAS / ROI under the attribution model you select (last-touch by default), when conversion goals are set. See Campaign ROAS attribution.
  • Lifecycle controls — Pause, Resume, and Cancel sit in the header for live campaigns. Pause and resume are immediate on blast and drip; on a journey, pause stops new enrollments and holds in-flight waits. Cancel is terminal: in-flight sends finish, no new sends start. A recently cancelled campaign can be reopened from the detail header within the reopen window; after the window expires, the header steers you to Clone instead, which carries the audience and template into a fresh draft. Failed and draft campaigns show relaunch and edit affordances in place of the live controls.
The detail page is also where launch review lands: pre-flight readiness, compliance attestations, and the dry-run summary render here before a draft goes live. The status-to-panel mapping and what each runtime status means are in Campaign lifecycle.

5. RBAC and detail-page role gates

The role gates follow the surfaces, so what you can do on the detail page matches what you could do when you created the campaign:
  • Viewers and billing seats can read every surface — list, detail, analytics, journey simulation — but cannot save, launch, pause, resume, or cancel.
  • Supervisors can compose: open the wizard and canvas, save drafts, and run the simulator. The launch call returns 403 INSUFFICIENT_PERMISSIONS, and the wizard or canvas keeps the draft so an owner, admin, or developer can finish the send.
  • Owner, admin, and developer seats can launch, pause, resume, and cancel. These are also the only seats the Campaigns nav entry renders to — the sidebar mirrors the route’s role guard, so other roles never see the 403.
The same gates are enforced server-side on the lifecycle endpoints (POST /campaigns/:id/send, /pause, /resume, /cancel), so a direct API call respects the same boundary as the dashboard button.

6. Troubleshooting

The four questions that come up most on the list view:
  • “My draft doesn’t appear in the list.” The list paginates at 25 per page and draft is its own tab — switch to the Drafts tab rather than scanning All on a busy workspace. Drafts reopen on the surface that authored them: wizard drafts via Edit on the row, journey drafts onto the canvas. If a draft still isn’t there, check that you’re in the workspace you created it in — drafts live per tenant.
  • “My journey isn’t enrolling anyone.” Three checks in order: (1) the journey’s status is running, not draft — saving a graph doesn’t activate it; (2) the trigger node’s event name matches the event you’re actually emitting (the match is case-insensitive but must be the same name), or the trigger segment resolves to members — use the audience preview on the trigger node; (3) the contact you’re testing with isn’t sitting in a wait or already exited — the journey detail’s enrollment log shows exactly where each contact is.
  • “Pause or cancel — which do I want?” Pause is reversible: dispatch stops, in-flight waits hold, and Resume continues from where it stopped. Cancel is a terminal state: in-flight sends complete but nothing new starts, and the campaign’s analytics close out. If you’re pausing to fix copy or a quiet-hours conflict, pause. If the campaign should never send again — a recalled offer, a wrong audience — cancel. A mistaken cancel can be reopened from the detail header.
  • “ROAS isn’t loading on the detail page.” The ROAS panel renders only when the campaign has conversion goals configured — a campaign with no goals has nothing to attribute, and the panel reports that rather than a zero. If goals are set but the panel shows no revenue, check that conversion events are flowing in with the campaign’s attribution parameters attached (see Campaign ROAS attribution for the event contract) and that the selected attribution model matches the window you’re expecting — switching models recalculates from the same events.