Skip to main contentOverview
Launch ships with a lightweight onboarding flow that helps you capture the
minimum profile data needed to personalize the app, then request permissions
only when they are relevant. The default flow collects a name, optionally
verifies a phone number via SMS OTP, and asks for push notification
permissions.
Onboarding is the moment to build trust, set expectations, and gather the data
that improves first-run UX. The current flow is intentionally short so you can
expand it based on your product needs.
Prerequisites
- Auth flow enabled
- Onboarding routes available in
apps/mobile/app/onboarding
Current flow
The onboarding screens live in apps/mobile/app/onboarding/:
welcome.tsx collects the user’s name
phone.tsx collects a phone number for SMS OTP
verify-otp.tsx verifies the OTP
push-notifications.tsx requests push permissions
The flow is controlled by the feature registry and can skip SMS entirely if you
do not want to set up Twilio yet.
Push notifications in onboarding currently store the user’s preference, but do
not enable real notifications until you complete the push notification setup
later in the docs.
Flow control
Routing and step selection are handled in:
apps/mobile/app/_layout.tsx
apps/mobile/lib/hooks/useAppNavigation.ts
Feature registry (SMS / OTP)
The SMS OTP step is gated by the oneSignal feature flag in
apps/mobile/features/feature-registry.tsx. When the flag is disabled, the
flow skips phone.tsx and verify-otp.tsx so onboarding becomes:
- Name
- Push notifications
This lets you ship without SMS while keeping the flow intact.
OneSignal and SMS OTP
OneSignal and SMS OTP configuration are covered in
OneSignal and SMS OTP. If you are not using SMS in your
onboarding flow, disable the feature registry flag and skip the phone and OTP
steps.
How the backend supports onboarding
The API exposes user endpoints that save onboarding data and track completion.
They live in apps/api/src/routers/user.ts and include:
user.saveName
user.savePhoneNumber
user.sendPhoneOtp
user.verifyPhoneOtp
user.registerDeviceToken
user.markOnboardingComplete
user.onboardingStatus
These endpoints update the user profile and onboarding flags in the database.
Data model references
Onboarding fields are stored on the User model in
apps/api/prisma/schema.prisma, including name, phone number, and onboarding
completion flags. Push notification device tokens are stored in the
DeviceToken model.
Extending onboarding
To add steps:
- Create a new file in
apps/mobile/app/onboarding/.
- Add routing logic in
useAppNavigation.ts if the step should be required.
- Link from the prior step using the router.
Common additions include:
- A short goal or preferences questionnaire
- A paywall before the main app (if your product is subscription-first)
- An account personalization step (avatar, username, interests)
If you add new onboarding data, create a matching endpoint in
apps/api/src/routers/user.ts and persist it on the User model in
apps/api/prisma/schema.prisma.
Code references
- Root Layout:
apps/mobile/app/_layout.tsx
- Onboarding Screens:
apps/mobile/app/onboarding/*.tsx
- Navigation Logic:
apps/mobile/lib/hooks/useAppNavigation.ts
- User Endpoints:
apps/api/src/routers/user.ts
- Database Schema:
apps/api/prisma/schema.prisma
Best practices
- Keep early steps short and low-friction.
- Ask for permissions only after explaining the benefit.
- Add a paywall only if it matches your product’s activation strategy.
- Track each step so you can measure drop-off and improve completion.