Skip to content

Funnels

A funnel is a saved sequence of steps β€” pages visited or custom events fired β€” that shows how many visitors made it from step 1 to the end, and exactly where the rest dropped off. Unlike most privacy-first analytics tools, Mitr's funnels can span more than one connected app in your workspace, so a step on your marketing site and a step inside your Flutter app can be part of the same funnel.

What it's for

  • Signup-to-activation. Step 1: visited /pricing. Step 2: signup_completed event. Step 3: onboarding_finished event inside your app. See the conversion rate and drop-off at each stage.
  • Cross-app journeys. A visitor reads your website, then converts inside your Flutter app days later. Because both are connected apps in the same workspace, a funnel step can require either β€” as long as the visitor was identified (see below).
  • Checkout drop-off. /cart β†’ checkout_started β†’ purchase_completed, to see exactly which step is losing people.

How a step is defined

Each step matches on exactly one of:

  • path β€” an exact page path, e.g. /pricing
  • event_type β€” an exact custom event name, e.g. purchase_completed

There's no regex or wildcard matching in v1 β€” steps match exactly, which keeps funnel definitions predictable and fast to compute. A step can optionally be pinned to one specific connected app, or left open to match that step in any app in the workspace.

Cross-app steps and anonymous visitors

Funnel steps are evaluated by matching the same visitor's hashed identifier (user_hash) across events. For an anonymous visitor, that hash is scoped to a single connected app by design β€” the same privacy boundary documented on /trust β€” so a funnel step can only correlate across apps for visitors who called identify() and have cross-app identity enabled for the workspace. A purely anonymous cross-app funnel isn't possible, and isn't meant to be: that's the same anonymity guarantee, not a limitation specific to funnels.

Setting one up

From the dashboard: Funnels β†’ New funnel. Name it, add steps in order, and save. Results are computed live over whatever date range you select β€” there's no waiting for a scheduled report.

Ready-to-use templates

Clicking New funnel now offers a template picker before the blank editor β€” a shortcut past the "which steps do I even need" question, not a replacement for the editor. Every template pre-fills step labels and a plausible event name, which apps they likely belong to, and is fully editable before you save.

TemplateSteps
SaaS signup β†’ activation Landing page view β†’ Signup completed β†’ Activation event β†’ Upgraded/purchased
E-commerce checkout Product viewed β†’ Added to cart β†’ Checkout started β†’ Purchase completed
Lead gen Landing page view β†’ Form submitted β†’ Demo booked
Mobile onboarding First open β†’ Signup completed β†’ Key action
Free tool β†’ paid customer Free tool used β†’ Email captured β†’ Signup completed β†’ Purchase completed
Email campaign (coming soon) Email opened β†’ Email clicked β†’ Landed on site β†’ Signup completed β†’ Purchase completed

The email-campaign template is listed but not selectable yet β€” it needs a recipient-identity feature we haven't shipped, so a customer can't pick it and get a funnel that silently shows zero conversions. It'll unlock without you doing anything once that ships.

API

MethodPathPurpose
POST/api/v1/funnelsCreate a funnel
GET/api/v1/funnelsList funnels in your workspace
GET/api/v1/funnels/{id}Get one funnel's definition
PUT/api/v1/funnels/{id}Replace a funnel's name/steps
DELETE/api/v1/funnels/{id}Delete a funnel
GET/api/v1/funnels/{id}/resultsComputed results for a date range

Any team member in your workspace can create, view, edit, or delete a funnel β€” a funnel is just a saved analytics view, the same trust level as viewing the dashboard itself.

Example results shape

{
  "steps": [
    { "label": "Visited pricing", "enteredCount": 4200,
      "convertedCount": 4200, "conversionRate": 1.0,
      "dropOffFromPrevious": 0 },
    { "label": "Signed up", "enteredCount": 4200,
      "convertedCount": 860, "conversionRate": 0.205,
      "dropOffFromPrevious": 3340 },
    { "label": "Finished onboarding", "enteredCount": 860,
      "convertedCount": 611, "conversionRate": 0.710,
      "dropOffFromPrevious": 249 }
  ]
}

Have questions about integration or security? Drop us a line directly.