Funnels
Define multi-step funnels to measure user conversion and drop-off across your app.
Funnels let you define an ordered sequence of steps that users should complete, then measure how many users reach each step and where they drop off. They are useful for tracking conversion flows like onboarding, checkout, or signup.
Add OwlMetry funnel tracking to this project.
Run `owlmetry skills` to find the SDK and CLI skill files.
- Identify 2-3 key user journeys worth measuring conversion on
(e.g., onboarding, checkout, activation).
- For each journey, define the funnel on the server via CLI with
3-6 ordered steps, then add Owl.track("step-name") calls at
each progression point in the code.
- Each step must be a point every user passes through — don't
include optional side-paths or engagement actions as steps.
- Split alternative paths into separate funnels (e.g., screenshot
export vs video export).Funnel Definitions
A funnel definition is a project-scoped record with an ordered list of steps. Each definition includes:
| Field | Description |
|---|---|
name | Human-readable name (e.g., "Onboarding Flow") |
slug | URL-safe identifier (e.g., onboarding-flow) -- must match /^[a-z0-9-]+$/ |
description | Optional explanation of what this funnel measures |
steps | Ordered array of step definitions (max 20) |
Funnels are managed through the dashboard, the CLI, or the API.
Steps
Each step has a name and an event_filter that determines which events count as completing that step:
{
"name": "Viewed Pricing",
"event_filter": {
"step_name": "viewed-pricing",
"screen_name": "PricingScreen"
}
}The event_filter can match on step_name, screen_name, or both. When both are provided, an event must match both fields to satisfy the step.
A funnel can have up to 20 steps.
Tracking Funnel Steps
SDKs provide a track() method that emits an event matching the step name in your funnel definition:
track("viewed-pricing") → matches event_filter { "step_name": "viewed-pricing" }
track("started-trial") → matches event_filter { "step_name": "started-trial" }The step name you pass to track() must match the step_name in the funnel definition's event_filter. For SDK-specific usage, see the Swift SDK or Node SDK guides.
You can also define steps that match on screen_name instead of or in addition to step_name. A step filter matching screen_name: "CheckoutScreen" would count any event from that screen.
Analysis Modes
Funnel queries support two modes that change how step completion is evaluated:
Open Mode (Default)
Each step is evaluated independently. A user counts toward a step if they completed it at any point during the time range, regardless of whether they completed earlier steps.
Open mode answers: "How many users performed each action?"
Closed Mode
Steps are evaluated sequentially. A user only counts toward step N if they also completed all preceding steps (1 through N-1), and in the correct order based on event timestamps.
Closed mode answers: "How many users completed the full progression from step 1 through step N?"
Analytics Results
A funnel query returns per-step analytics:
| Field | Description |
|---|---|
step_name | Name of the step |
unique_users | Number of distinct users who completed this step |
percentage | Percentage of total users who completed this step |
drop_off_count | Users who completed the previous step but not this one |
drop_off_percentage | Drop-off as a percentage of the previous step |
The total_users at the top level represents the total number of users in the funnel (all users who completed at least step 1 in closed mode, or any step in open mode).
Grouping and Segmentation
Funnel queries support a group_by parameter to break down results by a dimension:
| Group By | Description |
|---|---|
environment | Segment by runtime platform (ios, android, web, etc.) |
app_version | Segment by app version |
experiment:<name> | Segment by A/B experiment variant |
Experiment grouping is particularly useful for measuring how different A/B variants affect conversion through a funnel.
Filtering
Funnel queries accept optional filters to narrow the data:
since/until-- date rangeapp_id-- restrict to a specific appapp_version-- restrict to a specific versionenvironment-- restrict to a runtime platformexperiment-- filter to a specific experiment variant (format:name:variant)mode--openorcloseddata_mode--production,development, orall(see Data Mode)
Storage
Funnel events are stored in a dedicated funnel_events table, partitioned monthly by timestamp, with structured rows containing step_name, user_id, screen_name, and experiments.
For API details, see the funnels API reference.
