Skip to main content

Canvas Analytics

Understand entries, drop-offs, and conversions within Canvas journeys - from a whole-journey summary down to per-node and per-user detail.

Where analytics live​

Journey analytics are built into the journey builder itself. When a journey is live, opening it shows the canvas in a read-only analytics view - a teal "Viewing analytics - Read-only" banner appears at the top, with a date-range picker (default All Time) that filters every metric on the page. Click Edit journey to switch back to editing; Discard returns you to the live analytics view.

Analytics refresh automatically (about every 30 seconds) while the view is open.

Journey summary row​

The toolbar shows a summary row of journey-level tiles, read left to right as a flow:

  • Entries - how many users entered the journey (taken from the trigger node).
  • Could not start - shown in red beside Entries when some people were enrolled but their journey never started. They are included in Entries; open Journey Runs and filter by Failed to see why. The trigger node shows the same count under its Entries / Moved on strip.
  • Conversions - total conversions across the journey, based on the conversion goal you configured.
  • Conversion rate - a colored pill (conversions / entries); green, amber, or red by rate. Shows N/A when no conversion tracking is configured.
  • Revenue - attributed revenue, shown when the journey has driven revenue. It is computed under the journey's own attribution model (labeled on the tile, e.g. "revenue · last-touch") so it reconciles with the conversions above. Mixed-currency totals are marked as approximate.
  • Carts recovered - shown when orders credited to the journey came from an abandoned cart: their value and how many carts (for the selected date range). Click it to see the orders behind the count - see Recovered carts.
  • Uplift vs control - shown only when the journey has a control group (see below).

Recovered carts​

The carts recovered figure (for example "$60 · 1 cart recovered") counts abandoned carts whose order is credited to this journey - by the order's resolved attribution, so a checkout from the cart recovery link under another email still counts for the journey that sent the link. Cancelled and fully refunded orders are left out, and the amount is net of refunds.

Click the figure to open the list behind it: the same query as the count, for the same date range, so the list and the number always agree. Each row shows:

  • the store's order number and when the cart was recovered;
  • the contact whose cart it was (names follow the personal-data permission - without the View PII permission a masked name shows as the email) and, when the order was placed under someone else, who bought it;
  • the cart value;
  • how it was recovered: Recovery link (checked out from the cart recovery link), Same cart (the contact checked out the cart they had abandoned) or Reported by the store;
  • links to the order on the Orders page and to the cart's row on the Carts page.

The list is paginated, newest first. The date range counts carts recovered inside it, in your workspace timezone. A campaign's Revenue panel has the same line ("N abandoned carts recovered") and opens the same list for that campaign.

Per-node analytics​

Every node on the canvas carries its own stats in the analytics view.

The date range applies to the node, not to the journey entry: a node's figures cover the people who reached that node inside the range, so a step reached weeks after entry is still counted on the day it ran. Counts are rolled up hourly and folded into whole days in your workspace timezone, and a date-only bound means the whole local day - so picking today returns today.

On-card overlay​

Each node card shows a compact strip with two counts. Hover or focus a label to see what it counts.

MetricMeaning
EntriesEach time someone entered the journey and reached this step, in the selected range. A person who enters the journey more than once counts each time; a run that loops back to the same step counts once
Moved onEntries that have left this step - to the next step, or out of the journey here (it completed, met an exit criterion, or failed at this step)

Entries and Moved on count entries (journey runs), not people. To count people, read Unique people below.

There is no per-node "Exited" count. It used to sit beside Moved on while being the same number - both derive from the node's exit timestamp, and leaving a node is moving on - so "exited the journey here" is not measured per node.

Message nodes add a channel block: Sends, Skipped (when non-zero), Deliveries, Failed, Opens, Unique open rate, Clicks, and Unique click rate. The open and click rates are unique people over messages delivered, so they cannot pass 100% - the raw Opens and Clicks counts are shown beside them as totals. Open rows are hidden on channels that report no open: SMS carriers never report a read, and a tap on a push is recorded as a click, not an open.

Step reach, split and time in step​

The journey engine records an event each time a person reaches a step and each time they leave it (canvas.step.entered and canvas.step.left). From those, every node card adds:

MetricMeaning
Unique peopleDifferent people who reached this step in the selected range - on every node type, not only message nodes
Waiting nowEntries in this step right now. This is the live journey state, not limited by the date range
Split by outcomeOn branching steps (Branch, Behavior split, Experiment, Webhook, AI decision, AI agent, Issue coupon, Next best message): how many people left by each outcome, with each one's share of everyone who left. Experiment paths are shown by name
Avg time in stepOn Delay and Behavior split steps: the average time people spent in the step before leaving it. Hover for the median

Unique people and Entries answer different questions. Entries counts runs from the run history, so a person who enters the journey three times and reaches this step each time is 3 entries and 1 unique person. A Delay step reading Entries 5, Moved on 5, Unique people 3, Waiting now 0 means three people went through it five times between them, and none is waiting there now.

These numbers start at the release

Step events are recorded from the 2026-10-13 release on. Visits before it were never recorded as events and are not back-filled, so on a journey that was already live, Unique people, Split by outcome and Avg time in step cover only the time since the release, while Entries and Moved on still cover its whole history.

Node Metrics drawer​

Click a node body to open its preview drawer on the Metrics tab:

  • Entries / Moved on with Moved on as a percentage of Entries, then Unique people and Waiting now - the same numbers and explanations as the card.
  • Paths - for Branch and Behavior Split nodes, a per-path breakdown showing how many users took each named path (and what share of Entries that is). This is the fastest way to sanity-check branching logic - see Canvas Branching.
  • For message nodes, the full channel breakdown: Sends, Skipped, Deliveries, Failed, Opens, Unique open rate, Clicks, Unique click rate, Bounces, and Unsubscribes. Here the open rows appear only for the channels that actually measure an open - email (the tracking pixel), WhatsApp and Viber (read receipts).

A node that hasn't processed anyone yet shows "No analytics for this node yet."

Reading the funnel​

The per-node counts form a funnel you can read across the whole canvas:

  • A large gap between one node's Moved on and the next node's Entries usually means users are parked in between - most often a Delay node still waiting, or a Behavior Split holding users inside its wait window.
  • A gap between a node's Entries and Moved on means entries that have not left the step yet - compare it with Waiting now. Runs that leave the journey at a step (a group flagged Exit canvas, the journey's exit criteria, a failure) are counted in Moved on, so they do not open a gap; use Split by outcome to see how many left that way.
  • On message nodes, remember that users advance as soon as the message is queued - a user can be counted in Moved on while the message is still being delivered. Delivery, open, and click rates live in the node's channel block, independent of funnel progression. See Message advancement behavior.
  • A skipped send (subscription gate, suppression list, quiet-time skip) does not exit the user - the message is dropped but the contact advances, so Sends on a message node can be lower than Entries without any drop-off in the funnel.

Journey Runs (per-user inspection)​

The Analytics button in the toolbar opens the Journey Runs drawer - the execution-level view:

  • Status tabs: All / Completed / In progress / Failed, each with a count.
  • Filters: search by user ID, filter by journey version, and a date-range dropdown (All time / Last 24h / 7 days / 30 days). You can also Export CSV.
  • Columns: user ID, status (completed / in progress / waiting / exited / failed), version, current node, entered at, completed at.

Expanding a row shows the Run timeline - the step-by-step path that user took, with a status dot per step, the node name, an optional result chip (for example "Delivered"), and timestamps - plus a Context Variables panel listing the run's journey variables with their inferred types and values. The eye icon opens a per-user journey view that highlights that user's path on the canvas graph.

A run marked could not start was enrolled, but its journey never started, so it has no steps. Its timeline shows Could not start: followed by the reason the journey engine gave. Runs recorded before reasons were kept say only that they could not start.

Conversion goals​

The journey's conversion goal is configured in the creation wizard's Conversion step: a primary conversion event (with optional property conditions), optional secondary conversions, a conversion window, and an attribution model (first touch / last touch / linear).

Results surface in two places:

  • The Conversions tile and conversion rate pill in the journey summary row.
  • Per-node conversion counts, so you can see which step drives conversions.

Journey variants and control group uplift​

Journeys support whole-journey A/B/n variants with an optional control group - a variant marked "Held out" that receives nothing, so you can measure the journey's true incremental effect. Setting them up is covered in Variants and control group; this section covers how their results read.

Uplift vs control​

When a control group exists and both arms have recipients, the summary row shows the uplift vs control tile:

  • It compares revenue per recipient in the treatment arms against the held-out control arm and reports the uplift percentage (or the raw incremental revenue when a percentage isn't computable - for example, when the control bought nothing).
  • Positive uplift renders green; negative renders red - if the journey under-performed doing nothing, the tile says so.
  • The comparison covers control recipients and revenue vs treatment recipients and revenue over the same attribution window as the headline revenue tile.

The tile populates once there is real traffic: treated sends, control entrants, and purchases inside the conversion window.

Variant configuration vs variant results

The Journey variants modal is configuration-only - it shows no stats. Variant results are reported through the analytics surfaces on this page: the uplift tile for the control comparison, and per-path node analytics on each variant's flow (each variant is an output of the shared Trigger, so the Paths breakdown on the trigger and the node stats down each branch show how each variant performs).

Experiment nodes​

For path-level testing inside a journey (A/B/n on a single fork, winner-locking, bandit optimization), use the Experiment node. Its distribution, winner metric, confidence level, and sample-size settings are configured on the node itself; path performance is visible through the node's per-path analytics like any other multi-output node.

Versions​

Each published journey version keeps its own statistics - entries, active, completed, exited, failed, conversions, conversion rate, and average completion time. The Journey Runs drawer's version filter scopes the run list to a single version, so you can compare behavior before and after a change.

The journeys list page can also show per-journey columns for Entries, In flight, and Completed (enable them from the column picker).

Accessing journey analytics via API​

Everything on this page is also available programmatically:

EndpointReturns
GET /journeys/:id/statsJourney-level stats, revenue, and uplift
GET /journeys/:id/node-analyticsPer-node analytics keyed by node id
GET /journeys/:id/executionsThe runs list, filterable by status
GET /journeys/:id/variant-statsWhole-journey variant performance
GET /journeys/:id/recovered-cartsThe orders behind the recovered-carts figure, paginated (limit, offset); total equals the figure for the same range

All accept the same startDate / endDate range as the in-app date picker. See the Canvas API for details.

Quick reference​

QuestionWhere to look
How many people entered this journey?Entries tile in the summary row
Is the journey converting?Conversions tile + conversion-rate pill; per-node conversion counts for the driving step
How much revenue did it drive?Revenue tile (attributed revenue)
Is it better than doing nothing?Uplift vs control tile (requires a control group)
Where are users dropping off?Per-node Entries / Moved on overlay across the canvas
Which branch path do users take?Node Metrics drawer → Paths section
How is a specific message performing?Message node's channel block (sends, deliveries, opens, clicks, bounces, unsubscribes)
What happened to one specific user?Analytics → Journey Runs → search their user ID → expand the run timeline
Did my last edit change behavior?Journey Runs version filter + per-version stats