Skip to content
Bugwise
Menu
Features & Flows

Onboarding

Welcome carousels, setup wizards, tips and permission requests - how first-run onboarding works, what usually breaks, and how to test it after install, update, reinstall and logout.

30 min beginner Mobile & web

You download a new fitness app. Before you can log a single workout, it shows you three slides, asks your name and goal, and wants to send you notifications. That’s onboarding: everything an app shows a new user the first time, to explain its value and set it up.

Onboarding is only seen once (if it works), so it’s easy for a team to forget about it. But it’s also the first impression. If it crashes, loops, or forces a long-time customer through it again after an update, people give up before they ever reach the main app. Many apps lose a large share of new users in the first few minutes, and onboarding bugs are a big reason why.

How it works

Kinds of onboarding

  • Skip

    Welcome carousel

    A few swipeable slides about the benefits. Easy to build, easy to skip.

  • Swipe left to delete

    Interactive tutorial

    The user learns by doing: "Swipe left to delete this sample task."

  • Tap + to log your first workout

    Contextual tips

    Small hints that appear the first time you reach a feature (coach marks, tooltips).

  • No workouts yetLog your first one

    Empty-state onboarding

    An empty screen that teaches: "No workouts yet. Log your first one."

  • STEP 2 OF 3BeginnerIntermediateAdvanced

    Setup wizard

    A few required steps (account, goal, preferences) with progress and Back.

Most apps combine two or three of these. Each one needs its own tests.
  • Welcome carousel. Two to five slides with a picture and a sentence each, plus Skip and Next (see Carousel). The most common, and the most skipped.
  • Interactive tutorial. The user practices on sample data: “Swipe this task to delete it.” Great for apps with gestures people wouldn’t discover alone.
  • Progressive or contextual tips. Small hints (coach marks, tooltips) that appear the first time the user reaches a feature, not all at once at the start.
  • Empty-state onboarding. An empty stateEmpty stateThe screen a user sees when there is no content yet, like an empty cart or no search results.Open in glossary → that teaches: “No workouts yet. Tap + to log your first one.” Free onboarding on screens that would otherwise be blank (see Empty and error states).
  • Account setup wizard. Required steps such as creating an account, choosing a goal or a home address. Unlike a carousel, these collect data the app needs.

The first-run flow

  1. The app starts and checks a flag. Something like onboarding_done = true, stored on the device (and sometimes on the server for the account).
  2. No flag? Show onboarding. Usually the carousel first, then the required setup.
  3. The user moves through the steps. Next, Back, Skip, maybe answering a permission request.
  4. The app saves the answers and the flag. Only when the required parts are really done.
  5. Next launch: straight to Home. The flag says onboarding is done, so the user never sees it again (unless something is deliberately new, like a short “What’s new” screen).

First-run detection: when should onboarding appear?

This is the most common source of onboarding bugs. The right answer depends on where the flag lives, so ask your team and test each row:

SituationUsually expectedWhy it breaks
First launch after installOnboardingNo flag yet
Restart, or phone restartStraight to HomeFlag not saved, or saved too late
App updateHome, maybe a short “What’s new”Flag tied to the app version, or wiped by a data migration
ReinstallOnboarding again (often), or log iniOS Keychain and Android Auto Backup can bring old data back
Log out, then log inLogin screen, then HomeLogout clears the device flag too
Same account on a new phoneLogin, no full tourFlag only stored on the old device

Read Install, update and uninstall for how app data survives (or doesn’t) these events. On Android, Auto BackupAuto BackupAn Android feature that backs up app data to the user's Google account and can restore it on reinstall.Open in glossary → can restore the flag after a reinstall; on iOS, data in the keychainKeychainiOS secure storage for small secrets like tokens and passwords; items can survive uninstalling the app.Open in glossary → can survive an uninstall. Both surprise teams regularly.

Skip, Back and progress

  • Skip should skip only what’s optional. Skipping the welcome slides is fine; skipping the account setup leaves the app without the data it needs. If something is required, Skip must not jump over it, or the app must handle the missing data gracefully.
  • Back should go one step back and keep what the user already chose. Losing your answers because you pressed Back is one of the most annoying bugs there is.
  • Progress indicators (dots, “Step 2 of 3”, a bar) must match the real number of steps. A fifth dot that never fills makes people think they’re stuck.
  • The system Back button and back gesture on Android must behave like the on-screen Back, and must not close the app in the middle of setup without warning.

Permission priming: ask in context

For every permission type, the system dialogs and what happens after each answer, see App Permissions.

Many onboarding flows ask for permissions: notifications, location, camera, Health data. Both iOS and Android only let an app show the system permission dialog a limited number of times (on iOS just once). If the user says no, the app can’t ask again; only system Settings can change it.

That’s why good apps use permission primingPermission primingExplaining in the app why a permission is needed, at the right moment, before the system dialog.Open in glossary →: they first explain why in their own screen (or a modalModalA window that appears on top of the page and blocks the content behind it until it is closed.Open in glossary →, see Modal), at the moment it makes sense, and only then trigger the system dialog.

System dialog on the first screen

Welcome to Pulse

Track every workout

“Pulse” Would Like to Send You Notifications

Notifications may include alerts, sounds, and icon badges.

Don’t AllowAllow

The user doesn’t know the app yet and has no reason to say yes. Many tap Don’t Allow, and the app has lost its only chance to ask.

Explain first, in context

Stay on track

We'll remind you on Mon, Wed and Fri at 7:00. No ads, nothing else. You can change this any time.

Turn on remindersNot now

Right after the user picked workout days, the benefit is obvious. Only Turn on reminders triggers the system dialog. Not now leaves it for later.

Things to test around permissions:

  • The system dialog appears only after the explanation, never on launch.
  • Not now doesn’t trigger the system dialog, so the app can still ask later.
  • After Don’t Allow, the app keeps working, and offers a way back: a short explanation plus a button that opens the app’s page in system Settings.
  • The app notices when the user turns the permission on in Settings and comes back.

The Push notifications lesson covers the notification permission in detail.

Personalization steps

Setup wizards often ask questions that shape the app: goal, level, interests, home city, preferred language. Test that:

  • Every answer is really used afterwards (the plan matches the goal, the feed matches the interests).
  • Answers can be changed later in Settings, and changing them has the same effect.
  • Required questions are validated (no empty name, at least one day), and optional ones can really be left empty.
  • Answers are saved to the account, so they’re still there on a new phone or after a reinstall and login.

Onboarding on the web

Websites use the same ideas: a welcome modal, a product tour with tooltips that point at buttons (“This is where you create a project”), checklists like “3 of 5 steps done”, and empty states. The “already seen” flag is usually stored in a cookieCookieA small piece of data a website stores in your browser, for example to keep you logged in.Open in glossary → or local storageLocal storageBrowser storage where websites keep data that survives closing the tab, like settings or a cart.Open in glossary →, or on the server for logged-in users. So test:

  • A private/incognito window and clearing site data: does the tour come back? (Fine for visitors, annoying for logged-in users if the flag should be on the account.)
  • A second browser or computer with the same account.
  • Tooltips on small screens: does the tour point at a button that’s hidden in a menu on mobile? Does it go off-screen?
  • Keyboard and screen readers: can you reach Next and Close with Tab, and does Esc close the tour?

Example requirements

What usually goes wrong

#BugWhat you seeTypical severity
1Onboarding comes backShown on every launch, or again after an update for existing usersHigh
2Skip skips too muchRequired setup skipped, app in a broken state (“Hi, undefined”)High
3Back loses dataBack jumps to the start and clears all choicesMedium
4Wrong progress4 dots for 3 slides, “Step 3 of 2”Low
5Permission asked too earlySystem dialog before any explanation; no recovery after “Don’t Allow”High (business)
6Text cut offSlides unreadable with large text or in GermanMedium–High
7Interruption breaks the flowA phone call or rotation sends the user back to step 1Medium
8Answers not usedChose “Beginner”, got an advanced planMedium
9Missing or duplicate analyticsonboarding_completed never fires, or fires twiceMedium
10Not accessibleCarousel only works by swiping; screen reader can’t reach SkipHigh (for affected users)

Find the bug

Pulse, a fitness app, has a first-run onboarding with six bugs. Use the device controls to restart, update, reinstall and log out, and watch what the app stores on the device. Try this:

  • Read the system dialog that appears at launch. Was it explained? Deny it, then look for a way back.
  • Count the slides and the dots.
  • Tap Skip (then Reinstall to start over).
  • Fill in setup, go forward to step 3, then press Back.
  • Finish onboarding, then Restart, Update and Log out.
  • Turn on Larger text and look at every screen.

🐞 Bug hunt: Pulse onboarding

This demo has 6 hidden bugs. Explore it like a tester, then check your findings.

Found0/6
9:41

Track every workout

Log runs, rides and gym sessions in one place. Pulse adds up your weekly minutes for you.

“Pulse” Would Like to Send You Notifications

Notifications may include alerts, sounds, and icon badges. These can be configured in Settings.

Device

Larger text (accessibility)

App storage on device

  • app_version = 2.3.0
  • session = —
  • notification permission = not asked yet

From the spec

  • Onboarding shows once, on the first launch after install.
  • Skip skips the intro slides. Setup (name, goal, level, days) is required.
  • Explain reminders before asking for notification permission.
  • Text must stay readable with the largest text sizes.
  1. 1

    Hint: Finish onboarding, tap Restart (fine), then tap Update app.

  2. 2

    Hint: On a fresh install, tap Skip on the first slide.

  3. 3

    Hint: Tap Next until the last slide and look at the dots.

  4. 4

    Hint: Fill in steps 1 and 2, go to step 3, then press Back.

  5. 5

    Hint: Look at the very first screen after install. Tap "Don't Allow", finish setup, then tap "Turn on reminders".

  6. 6

    Hint: Turn on Larger text and look at the welcome slides.

Test scenarios

Functional

  • Fresh install: onboarding appears, every slide and step can be completed, and the user lands on Home.
  • Next, Back and Skip do exactly what the spec says on every screen.
  • Every answer from setup is saved and used (plan, name, reminders).
  • Completing onboarding sets the flag: restarting goes to Home.
  • Permission is asked in context, and both Allow and Don’t Allow lead to a working app.

Install, update, reinstall and logout

This is where onboarding bugs hide, so it deserves its own group. It’s also part of upgrade testingUpgrade testingChecking that updating from an older app version keeps the user's data and settings working.Open in glossary →:

  • Restart the app and the phone after finishing onboarding: no onboarding.
  • Update from the previous version (install the old build, finish onboarding, then install the new build over it): no onboarding.
  • Kill the app halfway through onboarding, then open it: it continues or restarts cleanly, never half-broken.
  • Reinstall: check what the team expects (onboarding or login), especially with iOS Keychain and Android Auto Backup.
  • Log out and log in, and log in as a different user on the same device.
  • Same account on a second device.

Negative

Edge cases and interruptions

UI & usability

Accessibility

Analytics

Product teams measure onboarding closely (“how many people finish step 2?”). Check with your developers or an analytics debug view that:

  • Each event (onboarding_started, onboarding_step_viewed, onboarding_skipped, onboarding_completed) fires once, at the right moment, with the right step number.
  • No personal data (like the name the user typed) is sent in the events.

Example test cases

TC-ONB-001Onboarding appears on first launch and not after restart

Preconditions

  • App freshly installed

Steps

  1. Open the app
  2. Complete the slides and setup
  3. Force quit and reopen the app

Test data

Name: Sam / Goal: Build strength / Level: Beginner / Days: Mon, Wed, Fri

Expected result

Onboarding appears only on the first launch. After reopening, Home shows "Hi, Sam" and the chosen plan.

TC-ONB-002No onboarding after updating the app

Preconditions

  • Previous version 2.3.0 installed, onboarding completed, user logged in

Steps

  1. Install version 2.4.0 over the old one
  2. Open the app

Expected result

Home opens with the existing plan. Onboarding is not shown (a "What's new" screen is allowed).

TC-ONB-003Skip does not skip required setup

Preconditions

  • App freshly installed

Steps

  1. Open the app
  2. Tap Skip on the first slide

Expected result

The setup wizard (Step 1 of 3) opens. Home is not reachable until required answers are given.

TC-ONB-004Back keeps answers

Steps

  1. Fill in step 1 and step 2
  2. On step 3, select Mon and Fri
  3. Tap Back twice
  4. Tap Continue twice

Expected result

Back goes 3 → 2 → 1. All answers (name, goal, level, days) are still selected on the way back and forward.

TC-ONB-005Notification permission is asked in context

Preconditions

  • App freshly installed

Steps

  1. Open the app and go through the slides and setup
  2. On the Reminders step, read the explanation
  3. Tap "Turn on reminders"

Expected result

No system dialog appears before the Reminders step. The dialog appears only after tapping "Turn on reminders".

TC-ONB-006Recovery after denying notifications

Preconditions

  • Notifications were denied in the system dialog

Steps

  1. Finish onboarding
  2. Open Settings › Reminders in the app

Expected result

The app explains reminders are off and offers a button that opens the app's page in system Settings. Turning them on there is detected when the user returns.

TC-ONB-007Onboarding with the largest text size

Preconditions

  • iOS: Settings › Accessibility › Display & Text Size › Larger Text at the maximum (or Android font size at max)

Steps

  1. Reinstall and open the app
  2. Go through every slide and step

Expected result

All text is fully readable (wrapping or scrolling), nothing is cut off, all buttons are reachable.

TC-ONB-008Interruption during setup keeps progress

Steps

  1. Fill in step 1 and go to step 2
  2. Receive a phone call (or switch to another app for 1 minute)
  3. Return to the app
  4. Rotate the phone

Expected result

Step 2 is still shown and the step 1 answers are kept, also after rotation.

Tip: click a test case to expand it.

Mobile vs web

  • Where the flag lives: on iOS, simple settings are deleted on uninstall, but the Keychain can survive. Android stores them in app data, which Auto Backup may restore after a reinstall. Test reinstall on both, and ask the team what’s expected.
    Dev note
    iOS stores simple settings in UserDefaults.
  • Updates: install the previous build from TestFlight, Firebase App Distribution or the store, complete onboarding, then update. Repeat for a jump of several versions.
  • Permissions: iOS shows each system dialog once; Android 11+ stops asking after two denials (see App Permissions). Test Allow, Don’t Allow and “Allow once” (location and camera on newer OS versions).
  • System Back (Android): must go one step back in setup, not quit the app or skip ahead.
  • Text size and display size: iOS Dynamic Type including the extra accessibility sizes; Android font size and display size.
  • Tablets and foldables: the carousel images and buttons still look right in landscape and on large screens.

Checklist

Onboarding checklist

0 of 12 checked

Check your understanding

Quick quiz

0/5 answered · 0 correct

  1. 1.After updating the app, existing users see the welcome slides again. What is the most likely cause?

  2. 2.Which is the best moment to ask for notification permission in a fitness app?

  3. 3.The user taps Skip on the welcome carousel and lands on Home with "Hi, undefined". What kind of bug is it?

  4. 4.On iOS the user tapped "Don't Allow" for notifications. What should the app do when they later tap "Turn on reminders"?

  5. 5.Which of these is NOT a typical onboarding test?

Key takeaways

  • Onboarding is the first impression: carousels, interactive tutorials, contextual tips, empty states and setup wizards.
  • The biggest risk is first-run detection: test install, restart, update, reinstall, logout and a second device.
  • Skip must never skip required setup; Back must keep answers; progress indicators must match the real steps.
  • Ask for permissions in context after an explanation, and always offer a way back after a denial.
  • Test with interruptions, rotation, large text, screen readers and other languages, and check the analytics events.

Finished this page?Nice work, this page is complete!

Mark it as done to track your progress. It's saved in this browser, no account needed.

Its review cards are now in Bites ⚡
Esc

Type to search the whole site.