Workflow funnel
/v1/workflows/{id}/statsSecret key — sk_… or sk_test_… · Base URL https://api.volanea.com
The enrolment funnel for one workflow: entered → delivered → opened → clicked → converted, each with the drop from the stage before it.
The funnel counts distinct contacts; totals counts messages. A three-email drip sends three messages to one person, so a funnel counted in messages would report more delivered than entered and stop being a funnel at all. The two numbers differ for that reason, not by mistake.
Conversion is whatever you say it is. Volanea stores no conversion of its own — what counts as one is a property of your product. Name any event you already send to POST /v1/events as conversionEvent and it becomes the last stage. Only conversions that happened at or after the contact entered are counted; attributing a purchase that predates the enrolment would flatter every funnel aimed at people who already buy. Omit the parameter and the stage is absent rather than zero, because "no goal set" and "nobody converted" are different answers.
Engagement is aggregated from the send log on read rather than kept as counters on the workflow, so these numbers are real for workflows that ran long before this endpoint existed.
Path parameters
idstringrequiredWorkflow id.
Query parameters
daysintegerWindow length in days (1–365, default 30).
conversionEventstringOne of your own event names, e.g. `order.placed`. Adds the `converted` stage.
Response
The funnel.
workflowIdstringnamestringstatusstringwindowobjectdaysintegerfromdate-timetodate-time
testModebooleanfunnelobject[]Stages in order, in distinct contacts.
stageenumentereddeliveredopenedclickedconvertedcountintegerrateOfEnterednumberPercentage of the contacts that entered.
dropFromPreviousinteger | nullContacts lost since the previous stage; null on the first.
totalsobjectMessages, not people.
messagesintegerunsubscribedintegerbyStatusobject
executionsobjectEnrolment counts by execution status.
conversionEventstringEchoed back when one was named.
Errors
Every failure returns the standard envelope — branch on `code`, never on the wording of `error`.
401Missing or invalid API key.404Not found.422Request validation failed (code `validation_error`, 422).
Request
curl https://api.volanea.com/v1/workflows/id_123/stats?days=30&conversionEvent=value \
-H "Authorization: Bearer sk_..."Response
200 · application/json
{
"success": true,
"data": {
"workflowId": "wf_7d31",
"name": "Welcome",
"status": "<status>",
"window": {
"days": 1,
"from": "hello@yourdomain.com",
"to": "ada@example.com"
},
"testMode": true,
"funnel": [
{
"stage": "entered",
"count": 1,
"rateOfEntered": 1,
"dropFromPrevious": 1
}
],
"totals": {
"messages": 1,
"unsubscribed": 1,
"byStatus": {}
},
"executions": {},
"conversionEvent": "<conversionEvent>"
}
}92 endpoints · OpenAPI document