Flow reports
Discover flows and their versions, then report on them: a flow's time series covers every version at once, or a single version when you scope it, which is how an A/B test is measured before it is promoted.
Flows are the branching journeys you build in the dashboard. The Product API does not build them — it exposes them read-only, so an integration can find a flow, enumerate its versions, and report on how it is performing. This page covers both halves: the discovery endpoints that hand you the ids, and the flow report that turns them into numbers.
Everything on this page is governed by a single scope, PROJECT_AUTOMATION_READ.
Finding a flow
The list endpoint is the entry point: it returns the flows of a project, newest first, and the id it gives you is exactly the value the report endpoint takes.
List the project's flows.
Retrieve a single flow.
The listing accepts the standard Query Filter syntax for filtering, sorting and pagination, so you can narrow it to the flows you care about:
GET /project/{project}/flow
?status_eq=enabledidstringThe flow id — the value /project/{project}/analytics/flow/{flow}/series takes.
namestringThe flow's name, as it reads in the dashboard.
statusstringOne of enabled, disabled or archived.
archivedAtstringWhen the flow was archived, or null while it is still active. It also bounds what the report can cover — see Timeframe.
Versions
A flow evolves through versions, and the versions endpoint is where you find the ids the report scopes to. It returns every version of the flow, newest first, archived ones included.
List a flow's versions.
Two fields carry the meaning:
statusis the version's role, and it is permanent for the version's life. A version never changes role: promoting a test version to production produces a new version with its own id rather than rewriting the old one. So a version id is also a stable label for the cohort its traffic belongs to.sequenceis the permanent version number — v1, v2, v3 — assigned when a version first goes live. A0means unnumbered: a draft or a manual preview that has never gone live.
status | What it is | In analytics |
|---|---|---|
live | The production version, running for the full audience. | Counted |
live-test | The A/B cohort running in parallel on a small share of the audience. Real messages to real contacts. | Counted, and included in the flow total |
draft | The single editable work in progress. | Not counted |
test | A manual preview run of the draft. | Not counted |
idstringThe version id — the value filter[version] takes on the flow report.
namestringThe version's name.
sequenceintegerPermanent version number (1, 2, 3 …). 0 for an unnumbered draft or preview.
statusstringThe permanent role: live, live-test, draft or test.
liveAtstringWhen the version first went live, or null if it never did.
archivedAtstringWhen the version was archived, or null while it is still in use.
Manual previews never send to your audience, so draft and test versions produce no analytics traffic. The reports only ever carry data for live and live-test versions.
The flow report
One report covers flows: a series — the statistics you ask for, bucketed over time.
Flow report — time series.
It follows the same grammar as every other family (Building queries) and returns the same series shape (Reading results). The specifics:
| Statistics | The same catalog the automation report exposes — delivery, engagement, conversion, cost and suppression. See Statistics catalog. |
interval | Defaults to day. |
group_by | channel, country — one dimension at a time. |
filter | channel, country, version. |
| Comparison | Not applicable: compare_to is a values-report parameter and flows have no values report. To compare, see Totals versus one version. |
GET /project/{project}/analytics/flow/{flow}/series
?statistics=delivered,clicks_first,conversions,conversion_value
&timeframe=last_30_days
&interval=daygroup_by=channel gives you the per-leg series of a fallback chain, and pairing one group_by with a filter on another dimension cross-cuts the report the same way it does elsewhere — filter[country]=ES with group_by=channel, for example.
Timeframe and freshness
A flow report is always computed on demand — its freshness.source is live, with no cached value to age.
The window is clamped to the flow's own lifetime: from the day the flow was created to the day it was archived. An active flow (no archivedAt) is served exactly as you asked for it. When the clamp trims your window, the response carries a timeframe_clamped_to_entity_lifetime warning and echoes the window it actually used.
Totals versus one version
filter[version] is the parameter flows have and no other family does, and it changes what the whole report means.
Without filter[version], the report is the flow total across every version — the live version and the live-test cohort added together. That is the honest business number: the A/B cohort is real traffic to real contacts, with real deliveries, real clicks and real revenue, so leaving it out would under-report what the flow actually did.
With filter[version]=<versionId>, every statistic is scoped to that single version. Not just the delivery figures: clicks, conversions and revenue are scoped too, because attribution keeps the version alongside the flow on the events it credits. That is what makes the parameter useful — it is how you judge a test version on its own merits before deciding whether to promote it.
GET /project/{project}/analytics/flow/{flow}/series
?statistics=delivered,click_rate,conversions,conversion_value,roas
&timeframe=last_30_days
&filter[version]=66b1f2a4e5a6b7c8d9e0f1b3Comparing two versions
There is no group_by=version and no compare endpoint for flows. You compare by issuing the same request twice, changing only the version id:
List the flow's versions
Call
GET /project/{project}/flow/{id}/versionsand pick theliveversion and thelive-testversion.Report on each one
Issue two identical series requests — same statistics, same timeframe, same interval — differing only in
filter[version].Compare like for like
Read the rates rather than the raw counts. The A/B cohort runs on a small share of the audience, so its volumes are smaller by design;
click_rate,conversion_rateandroasare what put the two versions on the same footing.Optionally, take the total
The same request with no
filter[version]gives you the flow as a whole, both cohorts included — the number to report to the business.