·6 min read

Flutter Onboarding Tracking: Measure Where Users Drop Off

Flutter gives you one codebase for iOS and Android. Your onboarding analytics should give you one funnel that shows drop-off on both. Here's how to set it up.

What you're trying to measure

The goal isn't tracking. The goal is answering: which step in my onboarding flow causes the most users to quit?

To answer that, you need:

  1. An event fired at each meaningful step (not page view - completed action)
  2. A funnel that sequences those events
  3. Per-step conversion rates, split by platform if needed

Install the Flutter SDK

Add the OnRamp SDK to your pubspec.yaml:

yaml
dependencies:
  onramp_sdk: ^0.2.0

Then run:

bash
flutter pub get

Initialise in main()

dart
import 'package:onramp_sdk/onramp_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await OnRamp.init(apiKey: 'onr_your_key_here');

  runApp(const MyApp());
}

Tip

Call OnRamp.init() once before runApp(). Calling it again on hot reload or widget rebuild is safe but unnecessary - the SDK ignores duplicate inits.

Track each onboarding step

dart
import 'package:onramp_sdk/onramp_sdk.dart';

class SignupScreen extends StatefulWidget {
  // ...
}

class _SignupScreenState extends State<SignupScreen> {
  Future<void> _handleSignup(String email, String password) async {
    await AuthService.createAccount(email, password);

    // Fire after the action succeeds
    await OnRamp.step('account_created');

    if (mounted) {
      Navigator.pushNamed(context, '/verify-email');
    }
  }
}

Add properties for segment analysis

dart
await OnRamp.step('account_created', properties: {
  'plan': 'trial',
  'signup_method': 'google',
  'platform': Platform.isIOS ? 'ios' : 'android',
});

Properties let you split the funnel: if iOS users complete onboarding at 70% and Android at 45%, you've found a platform-specific problem to fix.

Recommended step map for Flutter onboarding

StepEvent nameWhen to fire
App first openedapp_openedAfter main() init
Signup startedsignup_startedWhen user taps signup button
Account createdaccount_createdAfter account creation succeeds
Profile completedprofile_completedAfter profile form submitted
Permissions grantedpermissions_grantedAfter user accepts notifications
First action takenfirst_actionAfter user creates first item

! Note

Don't fire steps in initState(). If the widget mounts before the user does anything, you'll count visits as completions and your funnel data will be wrong.

Build the funnel

1

Open the OnRamp dashboard → Funnel → New funnel

Name it to match the flow: "Core onboarding", "Payment flow", etc.

2

Add steps in order

Enter each step name exactly as you pass to OnRamp.step(). The funnel uses exact string matching - account_createdAccountCreated.

3

Set conversion window to 7 days

Flutter apps on mobile often see users who install, don't open for a day or two, then complete onboarding. A 24h window undercounts them.

Reading the funnel

Step completion rate

Completion = users who completed step N ÷ users who entered step N

Example: 190 ÷ 400 = 47.5% completed the 'account_created' step

What to act on first: the step with the highest count of abandoned users, not necessarily the highest abandonment rate.

Flutter-specific things to watch for

Permission prompt timing. If you ask for push notification permissions during onboarding, many users deny it and immediately close the app. Track permissions_granted and permissions_denied separately so you can distinguish permission refusal from genuine onboarding failure.

iOS vs Android differences. Flutter renders identically but the platform behaves differently. Background app refresh, keyboard behavior, and system permission dialogs all differ. If iOS and Android show different drop-off at the same step, it's almost always a platform-specific behavior - not the design.

Deep link re-entry. If your flow includes email verification with a deep link back into the app, the deep link handler needs to fire the corresponding step. This is a common gap - users click the link, the app opens, but the step never fires.


Flutter onboarding analytics

See your Flutter funnel in minutes

Install the Dart SDK, call OnRamp.step() at each milestone, and your onboarding funnel populates automatically - iOS and Android side by side.

Start free trial →