fastmon Docs
Analytics

Checkout stages per bucket, by hit time

Fehler melden

Visitors who reached each checkout stage, per bucket, at the time they reached it.

The trend and the tile the analytics page draws beside its pageview numbers, from both sources: the URL-derived checkout_stage on a pageview and the Shopify pixel's events. events_read says whether the second half was counted.

NOT the funnel's timeseries.reached_by_stage. That one counts an entry COHORT over a window widened by 24h, so a purchase at 14:00 by a visitor who entered at 09:00 lands in the 09:00 bucket and the window edges move as soon as events are read. Here the requested range applies to the row's own time, and the window totals are distinct visitors over the window rather than the column sums of the series.

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 stage series, bucketed by the hit itself.

time_range*

Time range for the query

filters?

Optional filters

identity?|

Identifier to count distinct visitors by: 'stitch' or 'session'. Null -> the application's default (stitch preferred), same resolution as /visitors. 'session' answers from pageviews alone, because a pixel event carries no session id (see events_read).

granularity?GranularityRequest

Bucket size of the series: 'minute' (windows up to 6h), 'hour', 'day', or 'auto' (default; <=48h windows give hourly, longer daily). The comparison window is bucketed at the resolved size too, so both series sit on one grid.

Default"auto"
Value in"auto""minute""hour""day"
compare_to?|

Also report the same numbers for an earlier window: previous_period, previous_day, previous_week or previous_month. The window is the one /analytics/query derives for the same mode, so a tile here and a tile there compare against the same days.

Response-Body

Successful Response

application/json
  1. response

Visitors per checkout stage per bucket, counted at the time of the hit.

Deliberately not the funnel's timeseries.reached. That one buckets a visitor by their funnel ENTRY over a window widened by 24h, so it answers "what did the cohort that entered on Monday do". This one applies the requested range to the row's own time: a hit inside the window counts in the window, whatever the run's entry, and the window edges do not move when the events are read.

meta*

Facts about the result

request*

The request as the server resolved it

events_read*Events Read

Whether checkout events were counted. The stages come from events alone where a site in scope derives stage events from its pageviews, and from the pageview stages plus the pixel's events otherwise. False for identity 'session' (an event carries no session id), for a filter with no column on events (URL, page type, campaign, a metric threshold), and where the events table is not installed. False therefore means the pageview answer alone, which is 0 for success on a shop whose checkout runs off-site.

totals*

Stage name -> distinct visitors who reached it anywhere in the window. NOT the column sum of series: a visitor who reached the checkout on three days is one visitor here and three bucket entries there. Approximate above ~65k visitors (HLL, ~0.5% relative error). On the pageview fallback each visitor is counted per stored rate and scaled by it, as the visitors metric of /analytics/query is.

series*array<>

One point per bucket that had at least one stage hit. A bucket with none is absent rather than zero-filled, as in /analytics/query.

comparison?

Absent unless compare_to was set (per response_model_exclude_none). The compared window can predate the checkout events: the table fills from the day the Shopify pixel is installed, so an earlier window holds the pageview stages alone although events_read is true for both. success then rises from 0 for a shop whose checkout runs off-site, and that rise is the installation, not the shop.

POST
/organizations/{org_id}/analytics/funnels/checkout/stages
curl -X POST 'https://api.fastmon.eu/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/analytics/funnels/checkout/stages' \  -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": {}  },  "events_read": true,  "totals": {    "property1": 0,    "property2": 0  },  "series": [    {      "timestamp": "2019-08-24T14:15:22Z",      "reached_by_stage": {        "property1": 0,        "property2": 0      }    }  ],  "comparison": {    "time_range": {      "from": "2019-08-24T14:15:22Z",      "to": "2019-08-24T14:15:22Z"    },    "totals": {      "property1": 0,      "property2": 0    },    "series": [      {        "timestamp": "2019-08-24T14:15:22Z",        "reached_by_stage": {          "property1": 0,          "property2": 0        }      }    ]  }}