fastmon Docs
Analytics

Checkout funnel and its series

Fehler melden

The cart -> checkout -> success funnel and its series - observed facts only.

Each visitor is counted once per step they reached at least once, in the bucket of their funnel ENTRY. The window totals are therefore exactly the column sums of the series, which is why one query answers all of them.

conversion_rate divides the last step by ALL visitors, not by the first step. Against the cart step the number was unbounded and regularly read above 100%, because the cart stage is URL-derived and a drawer cart, an express checkout or a deep link never produces that URL. Everyone who was on the site is a denominator no shop configuration can undercount, and it is the one every e-commerce benchmark is quoted against. How the funnel itself narrows is still reported, as reach_rate and step_conversion_rate, and those stay unclamped.

The two halves are attributed differently, which shows at the window's edges: the steps count an entry COHORT (a run that entered on the last day counts its success even if that success lands after the window), the denominator counts window TRAFFIC. A visitor who entered the funnel the day before the window and succeeded inside it is therefore in the denominator and not in the numerator. The two edges pull in opposite directions and are bounded by the 24h stitch window either way.

Authentifizierung

bearerAuth
headerAuthentifizierungBearer <token>

API token generated from the fastmon dashboard (Account → API Token) or at organization level (fmo_…, one that outlives its creator). Send as Authorization: Bearer fm_... or paste the full token (including its prefix) into the Authorize dialog.

Pfad-Parameter

org_id*Org Id
Formatuuid

Request-Body

application/json
  1. body

Request for the checkout funnel + its time series.

time_range*

Time range for the query

filters?

Optional filters

identity?|

Identifier to group the funnel by: 'stitch' or 'session'. Null → the application's default (stitch preferred), same resolution as /visitors. The funnel needs a stored identifier; without one there is nothing to follow from cart to success.

granularity?GranularityRequest

Bucket size of the series: 'minute' (windows up to 6h), 'hour', 'day', or 'auto' (default; <=48h windows give hourly, longer daily).

Default"auto"
Value in"auto""minute""hour""day"

Response-Body

Successful Response

application/json
  1. response

Checkout funnel over the window plus its entry-day series.

meta*

Facts about the result

request*

The request as the server resolved it

steps*array<>

Funnel steps in funnel order

visitors_total?Visitors Total

Distinct visitors in the window, funnel or not - the denominator of conversion_rate. Counted over the same identity as the steps, so both halves of the rate describe one population. A visitor with a checkout event weighs one, every other visitor 1000 over the loosest sampling permille of their pageviews, so on a sampled application this is an estimate. Filters that select funnel PAGES (checkout_stage, the cart interaction metric ranges) do not narrow it - they would shrink the denominator towards the numerator - while audience filters (site, country, device, campaign) do. Where checkout events are read this holds the visitors of both tables, so a visitor seen only in the checkout counts here too and conversion_rate stays at or below 1. ABSENT when this half of the query failed (per response_model_exclude_none): the steps are still reported, the rate is not.

conversion_rate?Conversion Rate

Visitors who reached the LAST step, over visitors_total. The classic e-commerce conversion rate: purchases over all traffic, the denominator GA4 ('session key event rate') and Shopify ('sessions converted') use, so a shop can hold it against the usual 1-3% benchmark. Never exceeds 1.0; absent when visitors_total is. NOT a step rate: how the funnel narrows from one step to the next is FunnelStep.step_conversion_rate, and those stay unclamped.

time_to_success_seconds?

Seconds from funnel entry to the first success, over the visitors who reached it. Both ends are observed pageviews, so this is a measurement and not an estimate. count is the sample, so it equals the last step's reached. A p90 pulling away from the p50 is the checkout getting slow or getting in the way.

cart_interactions?Cart Interactions

Visitors with at least one cart interaction (fetch/XHR cart mutation) over the window. A signal BESIDE the funnel steps: it only says an interaction happened, undercounts by design (fetch_xhr coverage), and is therefore not a conversion baseline.

Default0
cart_interaction_rate?Cart Interaction Rate

cart_interactions over visitors_total - the add-to-cart rate, against a typical shop benchmark of 5-6%. Never exceeds 1.0; absent when visitors_total is. The underlying COUNT undercounts wherever the shop's cart calls are invisible to fetch/XHR collection (WooCommerce classic without the wc-ajax opt-in, OXID, anything posting the document) and never overcounts, so read the rate as a floor.

cart_interaction_error_visitors?Cart Interaction Error Visitors

Visitors whose cart calls FAILED at least once over the window (transport error or an HTTP error status, including status 0). Read against cart_interactions: the share of shoppers who hit a broken cart. It moves before the conversion rate does, which is what makes it worth watching.

Default0
cart_interaction_kinds?

Kind -> visitors with >=1 interaction of that kind, where the shop system's endpoint reveals the kind: add | change | remove | other. 'change' includes Shopify's qty-0 removes; 'other' = the kind only lives in the POST body (never read). Only kinds that occurred appear.

payment_submitted_visitors?Payment Submitted Visitors

Visitors who submitted payment in the checkout, from a Shopify Web Pixel event. A FACT BESIDE THE STEPS, not a fourth step: it is reported for the same run as the steps, and a visitor can carry it and a success at once. It can exceed the checkout step, because a visitor whose begin_checkout was lost still counts here. On Shopify a visitor with this and without a success most likely paid through a wallet (Shop Pay, Apple Pay) whose completion Shopify does not report, so the success step is a lower bound and the gap between the two numbers is where it is lost. ABSENT (per response_model_exclude_none) when no checkout event belongs to a run that ENTERED the funnel inside the requested window - an event of a buyer who entered before it counts for neither this field nor the steps. Also absent when none are collected (not a Shopify application, the events table is not installed, the identity is session, or a filter the event rows cannot honor such as URL, page type, campaign or a metric threshold), or when none occurred. 0 means events were read and nobody submitted payment.

timeseries*array<>

One point per bucket that had a funnel entry OR any traffic. Step counts are bucketed by funnel entry time, visitors by the pageview itself, so a bucket with traffic and no funnel activity appears with zero steps and a real denominator.

POST
/organizations/{org_id}/analytics/funnels/checkout
curl -X POST 'https://api.fastmon.eu/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/analytics/funnels/checkout' \  -H 'Content-Type: application/json' \  -d '{  "time_range": {    "from": "2019-08-24T14:15:22Z",    "to": "2019-08-24T14:15:22Z"  }}'
{  "meta": {    "execution_time_ms": 0,    "total": 0,    "limit": 0,    "offset": 0,    "has_more": true,    "next_cursor": "string",    "sampling": {      "sampling_rate": 0,      "is_sampled": true,      "estimated_metrics": [        "string"      ]    },    "is_identity_mixed": true  },  "request": {    "time_range": {      "from": "2019-08-24T14:15:22Z",      "to": "2019-08-24T14:15:22Z"    },    "comparison_time_range": {      "from": "2019-08-24T14:15:22Z",      "to": "2019-08-24T14:15:22Z"    },    "granularity": "minute",    "identity": "stitch",    "window_seconds": 0,    "filters": {}  },  "steps": [    {      "stage": "cart",      "reached": 0,      "reach_rate": 0,      "step_conversion_rate": 0    }  ],  "visitors_total": 0,  "conversion_rate": 0,  "time_to_success_seconds": {    "p50": 0,    "p75": 0,    "p90": 0,    "p95": 0,    "count": 0  },  "cart_interactions": 0,  "cart_interaction_rate": 0,  "cart_interaction_error_visitors": 0,  "cart_interaction_kinds": {    "property1": 0,    "property2": 0  },  "payment_submitted_visitors": 0,  "timeseries": [    {      "timestamp": "2019-08-24T14:15:22Z",      "visitors": 0,      "reached_by_stage": {        "property1": 0,        "property2": 0      },      "cart_interactions": 0,      "cart_interaction_rate": 0,      "cart_interaction_kinds": {        "property1": 0,        "property2": 0      },      "cart_interaction_error_visitors": 0,      "time_to_success_seconds": {        "p50": 0,        "p75": 0,        "p90": 0,        "p95": 0,        "count": 0      },      "conversion_rate": 0,      "step_conversion_rates": {        "property1": 0,        "property2": 0      }    }  ]}