What funnel analytics tells you
A funnel is a list of steps that should lead to an outcome you care about: a signup, a paid plan, a booked demo. Funnel analysis counts how many people reach each step and how many leave between steps. The step with the biggest drop is usually the best place to work next.
In Orwel, conversion funnels are called journeys. A journey has a name, the question it answers ("How many trials turn into paying accounts?"), a list of milestones and a final conversion. Orwel reports:
| Metric | What it means |
|---|---|
| Entered | Visitors who reached any milestone in the period |
| Converted | Visitors who reached the final conversion |
| Conversion rate | Converted visitors as a share of those who entered |
| Reach per milestone | Unique visitors at each step |
| Biggest drop | The pair of steps where the most visitors are lost |
The report also lists recent visitors who triggered any step and marks who converted, so you can open a real person's history.
Milestones in any order
Most funnel analysis tools count steps in a fixed order. If a user skips step 2 or does it after step 3, they fall out of every step after it. That is a fine model for a checkout page. It is a poor model for a product.
Real user funnels are messy:
- Someone invites a teammate before they create their first project.
- Someone reads the pricing page after signing up, not before.
- Someone connects an integration on day one and finishes onboarding on day four.
An ordered funnel reports all of them as drop-offs, even though they made real progress, and the leak you go fix is not where people actually get stuck.
Orwel journeys count milestones in any order within the period. A visitor who reaches step 3 before step 2 still counts for both. Because of that, a later step can sometimes have more reach than an earlier one, and the report shows which steps gain reach and which lose it.
The trade off is that milestones have to mean real progress. Use events like workspace_created or invite_sent, not page_view or click, which anyone can trigger without moving forward.
Every journey ends in a conversion
A journey is not just a list of screens. It closes on the outcome you want, either a conversion recorded with orwel.conversion() or a catalog event. That keeps the funnel tied to business results and connects it to the rest of Orwel: the same conversion creates a scored lead and carries the campaign that brought the visitor, so you can follow a drop from the funnel back to its source.
How to set up a journey
Journeys are configured in the dashboard, in Journeys setup.
- Start from a blueprint or from scratch. Blueprints are grouped by acquisition, activation, onboarding, revenue and retention. Pick one and adapt it.
- Name it and write the question it answers. One question per journey keeps reports readable.
- Add milestones from the catalog. Orwel's semantic catalog has 257 events with a note on when each should fire. If you need your own code, register it as a custom event.
- Pick the final conversion.
- Add filters only if you need them. Filters match flat event properties such as
plan: "pro". Use them sparingly, they make reports slower. - Implement. The Implement tab gives you the code in four formats: an agent prompt for Claude Code or Cursor, a copy and paste snippet, a typed TypeScript module, or the JSON configuration.
- Check the status. Each code shows as Receiving, Tested, No data yet, Not registered or Rejected. A journey is fully measured when every code is Receiving.
Test with the development key first. Dev mode shows each request as it arrives and tells you when a code is not in your catalog, before real data depends on it.
Example: a SaaS signup funnel
Say you run a B2B SaaS with a free trial. The question is "How many people who see pricing end up paying?"
| Step | Event code | Fires when |
|---|---|---|
| 1 | pricing_viewed |
The pricing page or plans modal is shown |
| 2 | user_signed_up |
The account is created |
| 3 | workspace_created |
The API creates the workspace |
| 4 | project_created |
The API confirms the first project was saved |
| Goal | subscription_started |
The first payment succeeds |
Fire each event right after the action succeeds, from your service or data layer rather than from button handlers, and send it once per action:
import orwel from 'orwel';
async function createProject(input) {
const project = await api.projects.create(input);
orwel.track('project_created', { template: input.template });
return project;
}
async function onPaymentSucceeded({ email, plan, amount }) {
await orwel.conversion('subscription_started', { email, plan, amount, currency: 'USD' });
}
If many trials create a workspace but never a project, the biggest drop sits between steps 3 and 4. That points at the empty state, templates or onboarding, not at pricing. And because steps count in any order, someone who explored pricing after signing up still shows up at step 1.
Funnels next to feature adoption
Funnels show where people stop. Feature adoption shows what the people who stayed actually use. Orwel measures both from the same events.