> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

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

> First-run walkthrough of the four campaign dashboard surfaces — the four ways into create (blast, drip, journey, AI journey-from-prompt), the list with status filters and search, the journey canvas, and the per-campaign detail page with stats, holdout lift, ROAS, and lifecycle controls.

# 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](/campaigns/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:

| Entry | Route | What it builds |
| - | - | - |
| **Blast** | Create wizard, `?type=blast` | One scheduled send to a resolved audience. The five-step wizard — setup, audience, message, schedule, review — is the whole flow. |
| **Drip** | Create wizard, `?type=drip` | A fixed multi-step sequence on a shared clock. Same wizard plus the drip-steps composer, so every enrolled contact walks the same steps in the same order. |
| **Journey** | Journey canvas, `?new=1&type=journey` | An event-driven graph. Skips the wizard entirely — you draw triggers, sends, waits, and branches on the canvas instead. |
| **AI journey-from-prompt** | Journey canvas, `?ai=1` (or **Brief to draft** / **Compose with AI** on the list) | A generated journey graph from a plain-English brief. The brief lands on the journey canvas for review, simulation, and launch — nothing persists until you save, nothing sends until you activate. |

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](/guides/campaign-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](/guides/campaign-journey-from-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](/concepts/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:

| Node | What it does |
| - | - |
| **Trigger** | Entry router — who enrolls and what starts them (an event, a segment membership change, a webhook, an inbound reply, or a rollout over a list). |
| **Send message** | One outbound send on `sms`, `whatsapp`, `email`, `rcs`, `viber`, and the rest of the channel registry. An unset channel defaults to SMS so drafts don't block saves. |
| **Wait** | Pause for a duration, until a fixed date, until a per-contact date attribute, or for an event with a timeout — the node's config panel picks the mode. |
| **Condition** | Branch on a contact field, event property, or attribute — each outgoing edge is one branch handle you label and wire. |
| **A/B split** | Divide traffic between branches by percentage; results roll into per-branch analytics after launch. |
| **Goal** | The conversion event the journey optimizes toward; enrolling contacts exit on goal when exit criteria say so. |

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](/guides/campaign-journey-builder).

## 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](/guides/campaign-holdout-uplift-measurement) 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](/guides/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](/concepts/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](/guides/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.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.