Measure bounded session paths
Ask your agent to measure which events follow or led to one anchor event, walk the exact instances behind an edge, read their replay evidence, and open the result as a proof page.
On this page
Paths measure what resolved people did around one event, inside the same session: which nodes
followed it (forward) or led to it (backward), up to a bounded number of steps and a bounded time
horizon. It answers a narrower, more precise question than a funnel — "what happens after
checkout_started?" rather than "did people complete an ordered sequence?" — by walking every
qualifying session once and reporting exactly what it found.
Your agent runs the measurement through MCP or the CLI. You open the stored result as a read-only proof page.
Ask your agent
"What do people do in the 30 minutes after
checkout_started, in the same session? Measure the last 7 days and send me the proof link."
"Take the busiest edge in that result and list the exact sessions behind it, with their replay evidence."
| Job | MCP tool or action | CLI command |
|---|---|---|
| Check which path shapes and bounds the server accepts | get_product_query_capabilities |
anectico analytics capabilities |
| Measure paths around one anchor event | query_product_analytics |
anectico analytics query |
| Read a stored paths result again | get_analytics_result |
anectico analytics result get |
| Page the exact walked instances behind an edge | list_analytics_path_instances |
anectico analytics result path-instances |
| Page the resolved people behind an edge | list_analytics_participants |
anectico analytics result participants |
These are MCP read actions. Your agent finds them with list_read_actions and runs them with
execute_read_action. Measuring needs analytics:query, analytics:read and persons:read;
reading the instances and the people needs analytics:read and persons:read; over MCP the key
also needs mcp:read. Reading page-path node keys needs the content read permission (see
Define a measurement).
What your agent gets back
The response carries paths.manifest, state, summary, steps, edges, other, and the two
selection registries described below. Every count keeps occurrences, instances and people apart
(see Read the counts).
Every displayed edge declares an instances_selection_id and a people_selection_id, which your
agent pages with the last two tools in the table.
Over MCP, the result carries a link to the proof page in its links, in the entry titled
"Analytics result" (the address is its href). Every tool in the table that reads this stored
result carries the same link. The CLI prints the result and no link.
Open the proof
Open the link from your agent. It opens the stored result in the read-only result viewer, with the project named in the page header. See Proof pages and Result viewer.
The page never measures again. It shows what was stored, when it was measured (in UTC) and when the stored result expires. Its one action is Copy link. To change the question, ask your agent to measure again with a new definition and a new execution key.
You see:
- a state banner, then the summary, including the terminal breakdown and
excluded_no_session; - one bar per step, showing its node breakdown with
otherfolded in; - the edge table described below. An edge's instances count opens the walked paths behind it — timestamps, the highlighted transition step, the terminal and the replay reference — and its people count opens the resolved people behind it.
What one path instance is
For each (subject, session), a path instance starts at the first anchor occurrence inside
the measurement window. Anchor occurrences that carry no session ID are never stitched to
anything; they are counted in the summary's excluded_no_session and never become an instance.
From the anchor, the walk follows the same subject's events of the same session only — never
another session, even the same person's — for up to transitions steps, within horizon_minutes
of the anchor. Forward reads follow-up after the anchor; backward reads history before it, and that
history must be inside your retained, readable window or the measurement fails
HISTORY_UNAVAILABLE.
Define a measurement
{
"version": 2,
"timezone": "UTC",
"window": {"relative": {"lookback_seconds": 604800}},
"paths": {
"anchor": {"name": "checkout_started"},
"direction": "forward",
"transitions": 2,
"horizon_minutes": 30,
"node_key": "event"
}
}
Run it the same way as any other kind: anectico --project PROJECT_UUID analytics query --file paths.json --execution-key EXECUTION_UUID, MCP's query_product_analytics, or POST /api/v1/analytics/query.
anchoris exactly one event selector, with its own event-property filters if you need them — a path's nodes are every event of the anchor's own session, so an event predicate belongs on the anchor, never at the top level. Person-property filters, cohorts and environment restrict which subjects can anchor a path, the same way they do for any other kind.directionisforward(what happened after the anchor) orbackward(what led to it).transitionsis 1 to 4 steps.horizon_minutesis 1 to 30; omitted or0normalizes to 30.node_keyisevent(the default) orevent_and_path, which additionally keys a$pageviewnode by its sanitized route — an invalid route keeps an empty page for that node, it never falls back to a different key. Reading page-path node keys needs the content read permission; without it, a request namingevent_and_pathis refused the same way a missing permission refuses anything else.
Paths are person-unit only (QUERY_UNIT_UNSUPPORTED for the account unit) and accept event
filters on the anchor only: a breakdown, a comparison window, a top-level event filter, a
filter_group, or an account filter is refused with QUERY_PATHS_INVALID, as is a missing or
unknown direction/node key, a missing anchor, or zero transitions. More than 4 transitions or 30
horizon minutes is QUERY_PATHS_LIMIT. anectico analytics capabilities (or the equivalent
MCP/REST discovery call) reports the kind with path_directions, path_node_keys, and every
max_path_* bound — a shape it does not list is refused before anything runs.
How the walk decides what happened
A repeat of the node you are already on is absorbed — it is examined, but it is never a
transition, so three page views of the same route in a row are one node, not three. Events that
land at the exact same millisecond and name more than one distinct node cannot be ordered: no
guess is made, and the walk stops there with the terminal ambiguous_order. A tie of otherwise
identical events at the same millisecond — the same node reached twice at once — is not ambiguous;
it is a repeat, absorbed the same way any other repeat is.
Every instance ends in exactly one of six terminals, and the six always sum to the total instance count:
| Terminal | Meaning |
|---|---|
continues_beyond_limit |
The walk used every allowed transition, and the session shows a further transition inside the horizon. |
session_end |
No further event of the session inside the horizon after the last transition. |
horizon |
The session continued inside the horizon, but only repeating the current node — the horizon, not the session, ended the walk. |
ambiguous_order |
A same-millisecond tie of different nodes stopped the walk. |
truncated |
The instance examined the platform's bounded event budget without a decided terminal. |
immature |
A forward instance whose horizon had not closed at the moment the result was measured — never a fabricated session_end. Backward paths, which only read history, are never immature. |
state on the result reflects what could be established: measured (every terminal decided),
partial (at least one instance is immature — its path may still grow when you measure again),
insufficient_evidence (coverage of the scanned span was not sufficient — counts are disclosed as
observed), or unavailable (platform coverage could not be established at all — nothing is
disclosed: no summary, no steps, no edges, no selections).
Read the counts: occurrences, instances, and people are never the same number
Every count in a paths result keeps three things apart, on purpose:
- occurrences — every time an instance made a transition. A loop (A→B→A→B) makes the A→B transition twice, so its occurrences are 2.
- instances — distinct walked paths. The same loop is still one instance.
- people / unresolved — distinct resolved people, and distinct unresolved identities, among those instances, kept separate and never merged.
steps[k] lists the nodes instances reached at walk distance k (k=0 is the anchor itself),
ranked by instances, then event and page. Only the most frequent nodes are shown per step; the rest
are folded into that step's other, which discloses how many distinct nodes were omitted and how
many instances they account for — the displayed nodes plus other always partition the step's
reach exactly.
edges lists the displayed transitions, time-ordered from → to whatever the walk direction,
with occurrences, instances, and people/unresolved kept separate as above. other is the
deduplicated union of every transition not displayed: its occurrences is a sum (loops still
add), but its instances and people count each contributing instance and person once, even
if that instance made two different omitted transitions. The proof page labels this row
"Other · union, deduplicated" for exactly that reason — it is not the sum of the omitted edges'
individual counts.
Page the exact walked instances, with replay evidence
Every displayed edge (and other, when it has omitted edges) declares an instances_selection_id.
Page it — 1 to 50 at a time — with anectico analytics result path-instances RESULT_UUID --selection-id SELECTION_UUID, MCP's list_analytics_path_instances, or GET /api/v1/analytics/results/{id}/path-instances. Each instance is one frozen walked path:
path_instance_id— stable across reads of the same instance, and never a person or participant ID.contributor,session_id,anchor_time, andterminal.events— the walked nodes in walk order (the anchor at step 0, then the first event of each transition), each with its own timestamp.edge_steps— the transition steps at which this selection's edge (or, forother, any omitted edge) occurs in this instance; a loop lists more than one.replay— always present, because every instance has a session ID:availableopens the recording,none_recordedis an honest absence (a session that was never recorded), andwithheldmeans your current credential cannot read session replay. Treatwithheldas a permissions gap, never as proof nothing was recorded — the proof page's instance panel never collapses the two.
An instance selection is a page of walked paths, not a population of people: it cannot become an audience and does not page through the participants endpoint.
People and audiences
Every displayed edge (and other) also declares a people_selection_id: the distinct resolved
people who made that transition, an ordinary resolved-people population. Page it with anectico analytics result participants, the equivalent MCP call (list_analytics_participants), or the REST
participants route, and create an audience from it exactly the way you would from any other kind's
selection (create_analytics_audience, or anectico analytics audiences create).
What paths cannot do
A paths result is a graph of selections, not the one scalar or row stream some other operations need:
- A metric watch refuses a paths definition outright (
UNSUPPORTED_RESULT_SELECTOR). - A Live panel refuses to render a paths result the same way.
- An export of a paths result is refused: its evidence is the instance pages above, which an export does not carry. Page the walked instances to review that evidence.
analytics result contributionhas no drill-down chain for paths either — the instance pages above are the evidence, not a separate contribution read.
A saved insight of a paths definition, and a dashboard widget bound to one, render normally: the widget shows the same state, summary, and step/edge shapes described above.