How it fits together

Campaign lifecycle

From "who am I sending to" to "did it work", in the order it actually happens. Follow one campaign through every stage — and learn where to look when the numbers don't match what you expected.

User guide › Campaign lifecycle

The five stages

StageWhereWhat exists afterwards
1. Define who/audiencesAn audience — a channel, some entity sources, some filters. No contacts stored.
2. Define what happens/omniA journey in Draft: a canvas of steps and a way in.
3. LaunchThe builder or the listThe audience is resolved and one enrollment is created per recipient. The journey flips to Active.
4. RunBackground, every minuteEach enrollment advances through the canvas on its own cursor, leaving an outcome trail.
5. ReadResults, Contacts, StatisticsFunnel, per-channel and per-step numbers, and a per-contact timeline.

The one thing worth internalising: the audience is resolved at launch, not saved as a list. Everything downstream is per-recipient state created at that moment.

Stage 1 — build the audience

Marketing → Audiences → New audience. Pick the channel first, because it decides what gets extracted: Email pulls an email address, WhatsApp and SMS pull a phone number.

  1. Add each entity you want to pull from Add entity, choose it, and check the two mapping dropdowns it pre-fills — the identifier field (labelled Email field or Phone field) and the optional Name field. The guess is based on your field names and types; on a table with several email fields it can pick the wrong one.
  2. Filter each source Add filter gives you field / operator / value rows, joined with AND — records matching ALL of these. Each source has its own filters.
  3. Read the live preview The right-hand panel shows the deduped, validated count and a sample of the actual addresses. This runs the exact resolution a launch runs — treat the number as literal.
  4. Save Create audience.

Records with a blank or invalid identifier are dropped silently, and the same address appearing in two sources becomes one recipient. Full detail in Audiences.

Stage 2 — create the campaign

Marketing → Campaign Builder at /omni. Two buttons, two very different things.

New automationNew campaign flow
What walks the graphEach contact, individuallyThe campaign as a whole
A step isA message to that personA whole channel campaign, created and launched
A branch asksDid this person open it?Did that campaign's open rate clear a threshold?
Results viewFunnel + per-recipient timelinePer-step launches, spend and run summary

Take the automation path for this walkthrough — it's the one with per-contact behaviour to trace.

  1. Name it Required. The placeholder suggests e.g. Welcome series.
  2. Choose the way in Audience enrols everyone when you launch. CRM event enrols a contact when a record is created or a field changes. Engagement enrols on an open, click or conversion. Manual waits for you.
  3. Draw the steps Drag the channel actions and the Omni control nodes onto the canvas and wire them. Branch nodes have two outgoing handles, yes and no; a send node has one, plus an optional error edge.
  4. Put tracking in the message If any branch downstream asks "did they open / click / convert", the message before it must carry {omni_open_pixel} and {omni_link:https://…}. Without them no outcome can ever be recorded for that step.
  5. Save The journey is stored as Draft. Nothing has been sent and nobody has been enrolled.
Only signed, first-party links are tracked

Click tracking works by rewriting the link into one the platform signed, so the redirect can only ever forward to a destination it produced. A plain https:// link pasted into the message body is delivered as-is and generates no click. That's the tradeoff for not being an open redirect.

Stage 3 — launch

Launch on an audience journey asks to confirm — Launch this journey — resolve the audience and enrol every recipient now? Three things are checked before anything happens: the journey has a name, it has an audience, and the canvas has at least one step. Then, in one go:

  • the audience is resolved against your records, right now;
  • one enrollment is created per recipient, carrying their identifier, their name, and a back-link to the record they came from;
  • every enrollment starts active, at the start of the canvas, due immediately;
  • the journey flips to Active.

You get a count back: Enrolled N recipient(s) (N resolved, N already enrolled). Resolved is what the audience produced; enrolled is how many were new.

Launching twice does not send twice

An identifier can appear in a journey only once. Relaunching enrols the people who have started matching the audience since last time and leaves everyone already in the journey exactly where they are. That makes "launch again to catch new leads" a safe, deliberate move.

An event-driven journey is activated instead — Journey activated — contacts will enrol as the trigger fires. Nobody is enrolled up front; a contact joins the moment their record changes in the way you specified, or the moment they engage.

Stage 4 — what happens when a step fires

A tick runs every minute and queues every enrollment that is due. A worker then advances that one recipient as far as it can go — through as many steps as run instantly — until it hits something that has to wait, finishes, or fails.

StepWhat happens to this recipientRecorded
A channel send The channel's own send logic runs — the same code an ordinary automation would call. Tokens like {Email} are resolved from the recipient's source record first, and the tracking tokens are rewritten into signed URLs keyed to this recipient and this step. sent against the contact, tagged with the channel
A send that throws If the step has an error edge the recipient follows it and the journey continues; otherwise that recipient is marked failed and stops. Other recipients are unaffected. failed, plus the error message on the enrollment
Wait The recipient is parked until the delay elapses, then resumes at the next step. Capped at 30 days. A zero wait just continues.
Branch if opened / clicked / converted On first arrival it stamps a deadline and parks. On every poll after that it looks for the outcome. Found → yes. Deadline passed with nothing → no. Defaults: wait up to 24 hours, check every 30 minutes.
Goal Marks the recipient as having reached the goal. If the node is set to end the journey, they complete here. goal
A condition Evaluated against the recipient's record data and their flow variables, then routed down the matching handle.
End of the path Nothing left to go to — the recipient is completed.

A recipient walks one path. There's no parallel fan-out: a branch picks a side, and that's the side they're on.

What the recipient's opens and clicks do

When the contact opens the message the tracking pixel is fetched; when they click a tracked link they hit a signed redirect that forwards them on. Both write an outcome against that recipient and that step, which is what a downstream branch is polling for. A conversion beacon does the same. Those outcomes also feed the contact's lead score and their timeline.

The branch only looks forward

A branch node only counts outcomes that arrive after it started waiting. If someone opens the email in the ten minutes before their cursor reaches the branch, that open is on their timeline but doesn't satisfy the branch. Put the Wait before the branch, not after the send and before nothing.

If it's a campaign flow instead

The shape is the same but the unit is the campaign. A launch creates one run. Each action step creates and launches a real campaign in that channel against its audience — the step's own, or the flow's default — and records which campaign it started. A wait parks the run. Before any result branch is evaluated, every still-running launched step is re-polled so the rate is current; the branch then compares that metric against your threshold and takes yes or no. If nothing has been launched yet, the branch takes no.

Stage 5 — where the results appear

ScreenShowsRead it for
Results on the journey Funnel — Enrolled, Sent, Opened, Clicked, Converted, Failed. By channel. By step (drop-off). Enrolments over time (30d). A Recipients list. Did this campaign work, and where did people fall out.
A recipient's Timeline What that one contact touched, in order, and their current step. What happened to this specific person.
Contacts Every contact across every journey, with a score, the journeys they're in, and a cross-channel timeline. Who's engaged, regardless of campaign.
Reports Automations vs campaign flows vs channels over 7 / 30 / 90 days. Comparing approaches.
Statistics Sent, Delivered, Engaged, Converted, Spend per channel, from each channel's own tables. Channel-level totals, all campaigns included.
The channel's own campaign report Per-campaign delivery detail. The authoritative answer on whether a message actually went out.
"Sent" in the funnel is not "delivered"

The funnel's Sent counts steps that executed without raising an error. Some channels decline to send quietly — the number is on the opt-out list, or no sender is configured — and that is not an error, so the recipient is still counted as sent. When the funnel and the channel's own report disagree, the channel's report is right.

"This contact didn't receive it"

Work down this list in order. Each step eliminates a stage, and the first one that fails is your answer.

  1. Is the contact in the audience at all? Open the audience and read the live preview count and sample. If they're not there, the campaign never knew about them. Check, on their record: does it satisfy every filter (AND, and is is an exact text match)? Is the identifier in the field you mapped? Does the value pass validation — a real name@domain.tld, or at least six digits for a phone?
  2. Did they get enrolled? Open the journey's Results and look for their identifier in the Recipients list. Not there means they weren't in the audience at the moment you launched — an audience is resolved at launch, so a record edited afterwards doesn't retroactively join. Relaunch to pick them up.
  3. Were they deduped into someone else? If the same address appears on two source records, only one recipient exists — and the name and source record attached to it come from whichever source is listed first. A "missing" contact is sometimes present under a colleague's record.
  4. Where is their cursor? Their row shows a Current step. Sitting on a Wait means the delay hasn't elapsed. Sitting on a branch means it's still polling for an outcome and its deadline hasn't passed. Both are normal.
  5. Did they take the branch you expected? A branch takes no on timeout. If the preceding message had no tracking tokens, or the contact's mail client blocked the pixel, the outcome was never reported and the timeout is inevitable. Their timeline tells you which outcomes actually arrived.
  6. Are they suppressed on that channel? Opt-out lists are applied by each channel after the audience resolves, so a suppressed contact is in the audience and in the journey and still receives nothing. Check the channel's suppression list — an SMS contact who replied STOP, a suppressed WhatsApp number, an unsubscribed email address.
  7. Is the channel itself able to send? A step with no sender configured, no connected mailbox, or no approved template produces nothing. Confirm by sending a test from the channel app directly; if that fails too, the problem is the channel's setup, not the campaign.
  8. Did the step fail for them specifically? A recipient whose send threw is marked failed and stops there, with the error stored against them. The funnel's Failed count is where to notice this happening at scale.

"The audience count looks wrong"

SymptomCause
Lower than the number of recordsBlank or invalid identifiers are dropped, and duplicates across sources collapse. Both are silent and both are correct.
Zero, with sources configuredA filter excludes everything, or the identifier field is the wrong one. Remove filters one at a time and watch the preview.
Higher than you sent toChannel suppression, applied after resolution. The audience count is deliverable identifiers in your data; the campaign report is messages actually sent.
Changed since you launchedExpected. The audience is live; the enrollments are a snapshot of the moment you launched. The two drift apart by design.
A whole entity contributes nothingIts source references an entity that no longer exists, or its identifier field was deleted. A dead source contributes zero rather than erroring.
A numeric filter matches oddlyThe comparison operators convert both sides to numbers. On a non-numeric text field the comparison is meaningless — use is or contains.

"The campaign is stuck"

What you seeWhat it means
Everyone enrolled, nothing sent Check the journey's status is Active. A paused or archived journey is not advanced, and neither are its recipients.
Everyone parked on the same branch The branch is waiting for an outcome that can't arrive. Its default is 24 hours, so they will all release down no eventually. Fix the tracking tokens in the message before relaunching.
Everyone parked on a Wait Working as intended. Waits are capped at 30 days; check the amount and unit on the node.
A step does nothing and the flow moves on A step whose action isn't recognised is skipped rather than stalling the recipient — typically after an app was uninstalled. Remove the orphaned step.
Enrolled count doesn't match the recipients list The counters are recomputed from the enrollments whenever a recipient's state changes. If they look stale, advancing any recipient refreshes them.
You paused it and now everyone is gone Pausing or archiving cancels every still-active enrollment. Resuming reactivates the journey but not the cancelled recipients — relaunch to enrol afresh. Pause is a stop, not a hold.
You can't edit it This journey is active — pause it to edit. And pausing cancels the in-flight recipients, so plan edits before launch, not during.
A campaign flow run isn't progressing A result branch can be parked waiting for its source campaign to finish so the rate is final, up to its deadline. Open the run and check which step it's on and what the last polled numbers were.
Launch is refused The three preconditions: a name, an audience, and at least one step on the canvas. A campaign flow additionally has to be in campaign-flow mode.
No Launch button You have app access but not the Launch journeys & campaigns capability. Building and saving stay available. See Permissions & access.

What ends up recorded against a contact

Nothing about a campaign writes back to the source record. The trail lives on the marketing side:

  • an enrollment per journey they entered, with their current step, their status, and a link back to the record they were resolved from;
  • an outcome row per event — sent, failed, opened, clicked, converted, goal — tagged with the channel and the step;
  • a lead score, computed live as each outcome's count times its weight, with the weights editable in the Contacts scoring panel;
  • a timeline assembled from those outcomes, newest first.

Contacts are keyed by identifier — an email address or a phone number — so the same person appearing in three journeys is one contact with one score.

Where to go next