---
title: "Workflow funnel"
method: GET
path: "/v1/workflows/{id}/stats"
tags: ["Stats"]
---

# Workflow funnel

`GET /v1/workflows/{id}/stats`

## Request

- Base URL: `https://api.volanea.com`
- URL: `https://api.volanea.com/v1/workflows/{id}/stats`
- Auth: HTTP bearer

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

- `id` string, required

## Query parameters

- `days` integer
- `conversionEvent` string

## Response `200`

The funnel.

- object
  - `workflowId` string
  - `name` string
  - `status` string
  - `window` object
    - `days` integer
    - `from` string, date-time
    - `to` string, date-time
  - `testMode` boolean
  - `funnel` object[]: Stages in order, in distinct contacts.
    - `stage` 'entered' | 'delivered' | 'opened' | 'clicked' | 'converted'
    - `count` integer
    - `rateOfEntered` number: Percentage of the contacts that entered.
    - `dropFromPrevious` integer, nullable: Contacts lost since the previous stage; null on the first.
  - `totals` object: Messages, not people.
    - `messages` integer
    - `unsubscribed` integer
    - `byStatus` object
  - `executions` object: Enrolment counts by execution status.
  - `conversionEvent` string: Echoed back when one was named.

## Other responses

- `401`: Missing or invalid API key.
- `404`: Not found.
- `422`: Request validation failed (code `validation_error`, 422).

---

[API](https://skmtc.dev/volanea/apis/volanea-api.md) · [All operations](https://skmtc.dev/volanea/apis/volanea-api/llms.txt) · [OpenAPI document](https://skmtc.dev/volanea/apis/volanea-api/revisions/9e187ae84fda?raw)
