Funnel Analysis
Funnels let you measure how users progress through a sequence of steps - like a signup flow, checkout process, or onboarding sequence. See where users drop off and identify opportunities to improve conversion.
How funnels work
A funnel is an ordered sequence of events (pageviews or custom events). Moneat calculates how many visitors completed each step and what percentage dropped off between steps.
Step 1: Visit /pricing → 1,200 visitors (100%)
Step 2: Click "Start Trial" → 840 visitors (70%)
Step 3: Complete Signup → 504 visitors (42%)
Step 4: First Service Created → 302 visitors (25.2%)
Key concepts
- Strict ordering - Steps must occur in the defined order within a single session
- Session-scoped - All steps must happen within the same visitor session
- No time limit between steps - Steps can occur at any point during the session
- Pageviews and custom events - Mix both types freely in a funnel
Creating a funnel
Via the dashboard
- Navigate to Analytics → Funnels tab
- Click New Funnel
- Add steps by selecting event names or page paths
- Click Analyze to see results
Via the API
GET /v1/analytics/{projectId}/funnel?steps[]=pageview:/pricing&steps[]=Signup Start&steps[]=Signup Complete&period=30dEach steps[] parameter defines one funnel step:
| Format | Type | Example |
|---|---|---|
pageview:/path | Pageview on a specific path | pageview:/pricing |
EventName | Custom event | Signup Complete |
Reading funnel results
The funnel response contains:
{
"steps": [
{
"name": "pageview:/pricing",
"visitors": 1200,
"conversionRate": 100.0,
"dropoffRate": 0.0
},
{
"name": "Start Trial",
"visitors": 840,
"conversionRate": 70.0,
"dropoffRate": 30.0
},
{
"name": "Signup Complete",
"visitors": 504,
"conversionRate": 42.0,
"dropoffRate": 28.0
}
],
"overallConversionRate": 42.0
}| Field | Description |
|---|---|
visitors | Number of unique visitors who reached this step |
conversionRate | Percentage of step-1 visitors who reached this step |
dropoffRate | Percentage of previous-step visitors who did not reach this step |
overallConversionRate | Percentage of step-1 visitors who completed the final step |
Funnel examples
Signup flow
Step 1: pageview:/pricing
Step 2: Start Signup
Step 3: Complete Signup
Measures: How many pricing page visitors convert to signups.
E-commerce checkout
Step 1: Add to Cart
Step 2: pageview:/checkout
Step 3: Enter Payment
Step 4: Purchase Complete
Measures: Cart-to-purchase conversion rate and where buyers abandon.
Onboarding completion
Step 1: Complete Signup
Step 2: Create Service
Step 3: Install SDK
Step 4: First Event Received
Measures: How effectively new users complete onboarding.
Content-to-conversion
Step 1: pageview:/blog/getting-started
Step 2: pageview:/pricing
Step 3: Start Trial
Measures: How blog content drives trial signups.
Following people across sign-in
Product events that your backend sends always carry a user_id, and the product funnels, saved
funnels, feature flag comparisons, and retention grids count people by it (group_by=user_id).
A person who starts signed out sends events under an anonymous user_id, then under their
account's once they sign up or sign in. Moneat counts them as one person when a signed-in event
names the anonymous user_id it replaces in the anonymous.id_hash property:
{
"name": "signup.completed",
"user_id": "acct_8f2c",
"props": { "anonymous.id_hash": "anon_41d9" }
}Every event sent under anon_41d9 then counts as acct_8f2c's. Grouping by session is unchanged.
- Linking events - Any event whose
anonymous.id_hashis set and differs from its ownuser_idlinks the two. Sending it on every signed-in event is simplest; one is enough. - Several devices - Each device's anonymous id links to the same account, so the person counts once.
- Shared devices - An anonymous id linked to several accounts belongs to the first account seen with it. Later accounts keep their own signed-in events, and no event counts twice.
- Lookback - Links are read from the queried range and the 30 days before it, so "first" means first in that span, and a person who signed in shortly before the range still resolves. Links made after the range never count, even when a retention period reads returns past it.
- Services - A
user_idbelongs to its service. The same account id in two services counts as two people when a query covers both. - No chaining - An anonymous id resolves to the account that named it, never further.
- Feature flag comparisons - A flag evaluated for an anonymous id counts toward its account. A person assigned more than one variant counts in the latest one. Evaluations in the same millisecond go to the greatest targeting key, so a tie resolves the same way every time.
Combining with filters
Apply any filter alongside a funnel to segment results:
GET /v1/analytics/{projectId}/funnel
?steps[]=pageview:/pricing
&steps[]=Signup Complete
&period=30d
&filters[]=country_code:is:US
&filters[]=device_type:is:DesktopThis shows the funnel conversion rate for US desktop visitors only.
Best practices
- Start broad, then narrow - Begin with 2–3 steps and add detail once you understand the high-level flow
- Use meaningful step names - Name custom events clearly so funnels are self-documenting
- Compare segments - Run the same funnel with different filters to find which audience segments convert best
- Track both intent and completion - Pair "started" events with "completed" events (e.g.,
Start Checkout→Complete Purchase) - Monitor over time - Check funnel conversion rates weekly to catch regressions after product changes