Deep Linking for Onboarding
Deferred deep links can carry context through the app store install flow, enabling you to personalize the onboarding experience based on how the user arrived. This reduces friction and increases activation.
How it works
Section titled “How it works”- A marketing campaign links to
https://myapp.tolinku.com/onboard/fitness?plan=premium. - The user does not have the app. They see a landing page and install from the app store.
- On first open, the SDK claims the deferred deep link.
- Your app receives the path (
/onboard/fitness) and query parameters (plan=premium). - Instead of the generic onboarding flow, the app shows a fitness-themed welcome with the premium plan pre-selected.
Use cases
Section titled “Use cases”Skip onboarding steps
Section titled “Skip onboarding steps”If the user came from a campaign that already explained the app, skip the introductory slides:
if let link = try await Tolinku.shared?.deferred.claimBySignals( appspaceId: "your_appspace_id") { if link.deep_link_path.contains("onboard") { skipIntroAndGoToSignup() }}Pre-fill user preferences
Section titled “Pre-fill user preferences”Pass context via the deep link path or query parameters:
https://myapp.tolinku.com/onboard/cooking?diet=vegan&skill=beginnerAfter claiming the deferred link, parse the parameters and pre-fill the user’s profile:
val uri = Uri.parse("https://myapp.tolinku.com${link.deepLinkPath}")val diet = uri.getQueryParameter("diet") // "vegan"val skill = uri.getQueryParameter("skill") // "beginner"setUserPreferences(diet, skill)Apply promo codes
Section titled “Apply promo codes”Include a promo code in the link that is automatically applied during signup:
https://myapp.tolinku.com/signup?promo=WELCOME20Channel-specific onboarding
Section titled “Channel-specific onboarding”Show different onboarding flows based on the acquisition channel:
// From Instagram adhttps://myapp.tolinku.com/onboard?source=instagram
// From email invitehttps://myapp.tolinku.com/onboard?source=email_invite
// From friend referralhttps://myapp.tolinku.com/ref/ABC123Setting up personalized onboarding
Section titled “Setting up personalized onboarding”1. Create an onboarding route
Section titled “1. Create an onboarding route”- Prefix:
onboard - Link type: Dynamic (to support path segments and query params)
- Fallback: Your default onboarding web page
2. Handle the deferred link on first open
Section titled “2. Handle the deferred link on first open”// React Nativeconst link = await Tolinku.deferred.claimBySignals({ appspaceId: 'your_appspace_id'});
if (link) { const url = new URL(`https://myapp.com${link.deep_link_path}`); const source = url.searchParams.get('source'); const promo = url.searchParams.get('promo');
if (promo) applyPromoCode(promo); if (source === 'instagram') showVisualOnboarding(); else showStandardOnboarding();} else { showStandardOnboarding();}3. Track onboarding completion
Section titled “3. Track onboarding completion”Use custom events to measure how personalized onboarding affects activation:
Tolinku.track('custom.onboarding_complete', { source: acquisitionSource, personalized: wasPersonalized ? 'yes' : 'no'});Compare completion rates between personalized and standard onboarding in your analytics dashboard.
Best practices
Section titled “Best practices”- Claim the deferred link early. Call
claimBySignalsorclaimByTokenbefore navigating the user, ideally in your app’s initialization code. - Always have a fallback. Not every install will have a deferred link (e.g. organic installs). Handle the
nullcase gracefully with the default onboarding flow. - Keep context simple. Pass a few key parameters (source, plan, promo code), not the entire user profile. Complex state should be fetched from your server after signup.
- Measure the impact. A/B test personalized onboarding against the default flow to validate that it improves activation.