{"id":972,"date":"2026-05-02T17:00:00","date_gmt":"2026-05-02T22:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=972"},"modified":"2026-03-07T04:46:16","modified_gmt":"2026-03-07T09:46:16","slug":"onboarding-referred-users","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/onboarding-referred-users\/","title":{"rendered":"Onboarding Referred Users: Best Practices"},"content":{"rendered":"\n<p>Referred users already have two advantages over organic signups: they trust the person who referred them, and they often know what the app does. But most apps waste this advantage by sending referred users through the same generic onboarding as everyone else. The referrer&#39;s name never appears, the reward isn&#39;t mentioned until later, and the connection that drove the install is completely ignored.<\/p>\n\n\n\n<p>For general onboarding personalization, see <a href=\"https:\/\/tolinku.com\/blog\/personalized-onboarding-flows\/\">Personalized Onboarding Flows with Deep Link Data<\/a>. For invite-specific flows, see <a href=\"https:\/\/tolinku.com\/blog\/invite-link-onboarding\/\">Invite Link Onboarding: From Invitation to Active User<\/a>. For referral program design, see <a href=\"https:\/\/tolinku.com\/blog\/referral-deep-links\/\">Referral Deep Links: Complete Implementation Guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Referred Users Need Different Onboarding<\/h2>\n\n\n\n<p>Referred users differ from organic users in measurable ways:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Characteristic<\/th>\n<th>Organic User<\/th>\n<th>Referred User<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Trust level<\/td>\n<td>Low (discovering the app)<\/td>\n<td>Medium-high (friend endorsed it)<\/td>\n<\/tr>\n<tr>\n<td>Product awareness<\/td>\n<td>Variable<\/td>\n<td>Usually knows the core value<\/td>\n<\/tr>\n<tr>\n<td>Motivation<\/td>\n<td>Curiosity, ad click<\/td>\n<td>Social proof + reward<\/td>\n<\/tr>\n<tr>\n<td>Expected friction tolerance<\/td>\n<td>Medium<\/td>\n<td>Low (expects a smooth experience)<\/td>\n<\/tr>\n<tr>\n<td>Lifetime value (industry avg)<\/td>\n<td>Baseline<\/td>\n<td>16-25% higher<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>The onboarding flow should leverage these differences, not ignore them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Capturing Referral Context<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Deferred Deep Link Data<\/h3>\n\n\n\n<p>When a referred user installs and opens the app for the first time, the deferred deep link returns the referral context. For a detailed guide on how deferred deep linking works during onboarding, see <a href=\"https:\/\/tolinku.com\/blog\/onboarding-deferred-deep-linking\/\">Onboarding with Deferred Deep Linking<\/a>.<\/p>\n\n\n\n<pre><code class=\"language-javascript\">async function checkReferralOnFirstLaunch() {\n  const deferred = await Tolinku.checkDeferredLink();\n\n  if (deferred === null) return null;\n\n  const params = deferred.params;\n\n  if (params.ref) {\n    return {\n      referrerId: params.ref,\n      referrerName: params.referrer_name,\n      rewardAmount: params.reward || &#39;$10&#39;,\n      campaignId: params.campaign_id,\n      source: &#39;deep_link&#39;,\n    };\n  }\n\n  return null;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Fallback: Manual Referral Code Entry<\/h3>\n\n\n\n<p>For the 20-40% of users where deferred deep linking can&#39;t match the click to the install, provide a manual code entry option:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function ReferralCodeEntry({ onSubmit }) {\n  const [code, setCode] = useState(&#39;&#39;);\n\n  return (\n    &lt;View&gt;\n      &lt;Text&gt;Have a referral code? Enter it here.&lt;\/Text&gt;\n      &lt;Input\n        placeholder=&quot;e.g., SARAH-2024&quot;\n        value={code}\n        onChange={setCode}\n      \/&gt;\n      &lt;Button onPress={() =&gt; onSubmit(code)}&gt;Apply Code&lt;\/Button&gt;\n      &lt;LinkButton onPress={() =&gt; navigation.navigate(&#39;DefaultOnboarding&#39;)}&gt;\n        Skip\n      &lt;\/LinkButton&gt;\n    &lt;\/View&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<p>Place this on the first onboarding screen so users who weren&#39;t matched automatically can still get credit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Referred User Onboarding Flow<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Acknowledge the Referrer<\/h3>\n\n\n\n<p>The first screen should confirm the referral and set expectations:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function ReferralWelcome({ referral }) {\n  return (\n    &lt;Screen&gt;\n      &lt;Avatar source={referral.referrerAvatar} \/&gt;\n      &lt;Heading&gt;\n        {referral.referrerName} invited you to [App]\n      &lt;\/Heading&gt;\n      &lt;RewardBadge amount={referral.rewardAmount} \/&gt;\n      &lt;Text&gt;\n        Sign up and complete your first [action] to claim your\n        {&#39; &#39;}{referral.rewardAmount} reward.\n      &lt;\/Text&gt;\n      &lt;Button onPress={() =&gt; navigation.navigate(&#39;QuickSignUp&#39;)}&gt;\n        Get Started\n      &lt;\/Button&gt;\n    &lt;\/Screen&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<p>Key elements:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Referrer&#39;s name (and avatar if available)<\/li>\n<li>The reward amount and how to claim it<\/li>\n<li>A clear CTA to start the signup<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Streamlined Account Creation<\/h3>\n\n\n\n<p>Referred users are motivated. Keep the signup form minimal:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function ReferralSignUp({ referral }) {\n  return (\n    &lt;Form onSubmit={createAccount}&gt;\n      &lt;Input label=&quot;Email&quot; autoFocus \/&gt;\n      &lt;Input label=&quot;Password&quot; type=&quot;password&quot; \/&gt;\n\n      &lt;RewardReminder&gt;\n        {referral.rewardAmount} will be credited after your first [action].\n      &lt;\/RewardReminder&gt;\n\n      &lt;Button type=&quot;submit&quot;&gt;Create Account&lt;\/Button&gt;\n\n      &lt;SocialSignUp&gt;\n        &lt;GoogleButton \/&gt;\n        &lt;AppleButton \/&gt;\n      &lt;\/SocialSignUp&gt;\n\n      &lt;Terms \/&gt;\n    &lt;\/Form&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<p>What to skip for referred users:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&quot;How did you hear about us?&quot; (you already know)<\/li>\n<li>Feature tours (the referrer already explained the app)<\/li>\n<li>Category\/preference selection (show this later)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Guide to the Qualifying Action<\/h3>\n\n\n\n<p>The referral reward depends on a qualifying action (first purchase, first deposit, first post). The onboarding should point directly to it:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function ReferralActivation({ referral, qualifyingAction }) {\n  return (\n    &lt;Screen&gt;\n      &lt;ProgressIndicator\n        label={`Complete your first ${qualifyingAction.label} to earn ${referral.rewardAmount}`}\n        progress={0}\n      \/&gt;\n\n      &lt;ActionCard\n        title={qualifyingAction.title}\n        description={qualifyingAction.description}\n        ctaText={qualifyingAction.ctaText}\n        onPress={() =&gt; navigation.navigate(qualifyingAction.screen)}\n      \/&gt;\n\n      &lt;Text style={styles.secondary}&gt;\n        Your reward will be credited within 24 hours of completing this step.\n      &lt;\/Text&gt;\n    &lt;\/Screen&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Reward Confirmation<\/h3>\n\n\n\n<p>After the qualifying action, confirm the reward immediately:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function RewardConfirmation({ referral, reward }) {\n  return (\n    &lt;Screen&gt;\n      &lt;SuccessAnimation \/&gt;\n      &lt;Heading&gt;You earned {reward.amount}!&lt;\/Heading&gt;\n      &lt;Text&gt;\n        Thanks to {referral.referrerName}&#39;s referral, {reward.amount} has been\n        added to your account.\n      &lt;\/Text&gt;\n      &lt;Text style={styles.secondary}&gt;\n        {referral.referrerName} earned a reward too.\n      &lt;\/Text&gt;\n      &lt;Button onPress={() =&gt; navigation.navigate(&#39;Home&#39;)}&gt;\n        Start Exploring\n      &lt;\/Button&gt;\n    &lt;\/Screen&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Reward Visibility Throughout Onboarding<\/h2>\n\n\n\n<p>The reward is the referred user&#39;s primary motivator. Keep it visible at every step:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Progress Indicators<\/h3>\n\n\n\n<pre><code class=\"language-javascript\">function ReferralProgress({ currentStep, totalSteps, rewardAmount }) {\n  return (\n    &lt;View style={styles.progressBar}&gt;\n      &lt;View style={styles.steps}&gt;\n        {Array.from({ length: totalSteps }, (_, i) =&gt; (\n          &lt;StepDot key={i} completed={i &lt; currentStep} \/&gt;\n        ))}\n      &lt;\/View&gt;\n      &lt;Text style={styles.rewardText}&gt;\n        {currentStep &lt; totalSteps\n          ? `${rewardAmount} reward after signup`\n          : `${rewardAmount} earned!`}\n      &lt;\/Text&gt;\n    &lt;\/View&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Persistent Banner<\/h3>\n\n\n\n<p>Show a subtle banner during onboarding that reminds the user about the reward:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function ReferralBanner({ referral, dismissed, onDismiss }) {\n  if (dismissed) return null;\n\n  return (\n    &lt;Banner style={styles.referralBanner}&gt;\n      &lt;Text&gt;{referral.rewardAmount} reward waiting for you&lt;\/Text&gt;\n      &lt;CloseButton onPress={onDismiss} \/&gt;\n    &lt;\/Banner&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Handling Edge Cases<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Referrer No Longer Active<\/h3>\n\n\n\n<p>The person who referred the user may have deleted their account or been suspended:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">async function resolveReferrer(referrerId) {\n  const referrer = await getUser(referrerId);\n\n  if (referrer === null || referrer.status === &#39;suspended&#39;) {\n    return {\n      name: &#39;A friend&#39;,\n      avatar: null,\n      rewardStillValid: true, \/\/ Honor the reward regardless\n    };\n  }\n\n  return {\n    name: referrer.firstName,\n    avatar: referrer.avatarUrl,\n    rewardStillValid: true,\n  };\n}\n<\/code><\/pre>\n\n\n\n<p>Always honor the reward even if the referrer&#39;s account is no longer active. The referred user shouldn&#39;t be penalized.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Existing User Taps Referral Link<\/h3>\n\n\n\n<p>A user who already has an account taps a referral link:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function handleReferralLinkForExistingUser(user, referralData) {\n  if (user.referredBy) {\n    \/\/ Already referred by someone\n    showToast(&#39;You already have an account with a referral applied.&#39;);\n    return;\n  }\n\n  \/\/ Allow applying referral to existing account (within grace period)\n  const accountAge = Date.now() - user.createdAt;\n  const GRACE_PERIOD = 7 * 24 * 60 * 60 * 1000; \/\/ 7 days\n\n  if (accountAge &lt; GRACE_PERIOD) {\n    applyReferralToExistingAccount(user.id, referralData.referrerId);\n    showToast(`Referral from ${referralData.referrerName} applied!`);\n  } else {\n    showToast(&#39;Referral codes can only be applied to new accounts.&#39;);\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Reward Program Has Changed<\/h3>\n\n\n\n<p>If the reward terms changed between when the link was shared and when the user signs up:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">async function getApplicableReward(referralData) {\n  const linkReward = referralData.rewardAmount; \/\/ What was promised in the link\n  const currentReward = await getCurrentReferralReward(); \/\/ Current program terms\n\n  \/\/ Honor whichever is more favorable to the user\n  if (parseFloat(linkReward) &gt; parseFloat(currentReward.amount)) {\n    return { amount: linkReward, source: &#39;link_promise&#39; };\n  }\n\n  return { amount: currentReward.amount, source: &#39;current_program&#39; };\n}\n<\/code><\/pre>\n\n\n\n<p>Honoring the promised reward builds trust. If the program changed, the user should never get less than what was advertised in the link they clicked.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referral Onboarding vs. Standard Onboarding<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">What to Keep<\/h3>\n\n\n\n<p>Even for referred users, some onboarding steps are still necessary:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Account creation<\/strong>: Always required (but streamlined)<\/li>\n<li><strong>Permissions<\/strong>: Push notifications, location (if needed for core features)<\/li>\n<li><strong>Legal<\/strong>: Terms of service, privacy policy acceptance<\/li>\n<li><strong>Core setup<\/strong>: Anything required for the app to function (e.g., connecting a bank account for a finance app)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">What to Remove or Defer<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Standard Step<\/th>\n<th>Referred User Treatment<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Feature tour<\/td>\n<td>Skip (referrer provided context)<\/td>\n<\/tr>\n<tr>\n<td>&quot;How did you hear about us?&quot;<\/td>\n<td>Skip (you know it was a referral)<\/td>\n<\/tr>\n<tr>\n<td>Category\/interest selection<\/td>\n<td>Defer to settings<\/td>\n<\/tr>\n<tr>\n<td>Promotional upsell<\/td>\n<td>Skip (they just signed up)<\/td>\n<\/tr>\n<tr>\n<td>Survey\/feedback<\/td>\n<td>Defer to day 7+<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">A\/B Test the Difference<\/h3>\n\n\n\n<pre><code class=\"language-javascript\">function getReferralOnboardingVariant(referralData) {\n  \/\/ Test abbreviated vs. standard for referred users\n  if (isInExperiment(&#39;referral_onboarding_v2&#39;, referralData.referrerId)) {\n    return &#39;abbreviated&#39;; \/\/ 3-step flow\n  }\n  return &#39;standard&#39;; \/\/ Full flow with referral context\n}\n<\/code><\/pre>\n\n\n\n<p>Track completion rates, time-to-qualifying-action, and day-7 retention for each variant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Notifying the Referrer<\/h2>\n\n\n\n<p>When the referred user completes onboarding, notify the person who referred them:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">async function notifyReferrerOfSignup(referrerId, referredUser) {\n  await sendPushNotification(referrerId, {\n    title: `${referredUser.firstName} just joined!`,\n    body: `Your referral signed up. You&#39;ll both earn rewards when they complete their first [action].`,\n    data: {\n      type: &#39;referral_signup&#39;,\n      referredUserId: referredUser.id,\n    },\n  });\n}\n\nasync function notifyReferrerOfReward(referrerId, referredUser, reward) {\n  await sendPushNotification(referrerId, {\n    title: `You earned ${reward.amount}!`,\n    body: `${referredUser.firstName} completed their first [action]. Check your rewards.`,\n    data: {\n      type: &#39;referral_reward&#39;,\n      screen: &#39;\/rewards&#39;,\n    },\n  });\n}\n<\/code><\/pre>\n\n\n\n<p>These notifications serve two purposes: they reward the referrer with social validation, and they bring the referrer back into the app (increasing their engagement).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Measuring Referral Onboarding<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Funnel Comparison<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Stage<\/th>\n<th>Standard<\/th>\n<th>Referred<\/th>\n<th>Delta<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Start onboarding<\/td>\n<td>100%<\/td>\n<td>100%<\/td>\n<td>&#8212;<\/td>\n<\/tr>\n<tr>\n<td>Complete signup<\/td>\n<td>55%<\/td>\n<td>75%<\/td>\n<td>+36%<\/td>\n<\/tr>\n<tr>\n<td>Complete qualifying action<\/td>\n<td>25%<\/td>\n<td>45%<\/td>\n<td>+80%<\/td>\n<\/tr>\n<tr>\n<td>Day 7 active<\/td>\n<td>20%<\/td>\n<td>35%<\/td>\n<td>+75%<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>Referred users should outperform organic users at every stage. If they don&#39;t, the referral onboarding flow needs work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Analytics Events<\/h3>\n\n\n\n<pre><code class=\"language-javascript\">\/\/ Track referral-specific onboarding events\nanalytics.track(&#39;referral_onboarding_start&#39;, {\n  referrerId: referral.referrerId,\n  rewardAmount: referral.rewardAmount,\n  matchMethod: referral.source, \/\/ &#39;deep_link&#39; or &#39;manual_code&#39;\n});\n\nanalytics.track(&#39;referral_qualifying_action&#39;, {\n  referrerId: referral.referrerId,\n  action: &#39;first_purchase&#39;,\n  timeFromSignup: Date.now() - user.createdAt,\n  rewardStatus: &#39;pending&#39;,\n});\n<\/code><\/pre>\n\n\n\n<p>For referral features, see <a href=\"https:\/\/tolinku.com\/features\/referrals\">Tolinku referrals<\/a>. For referral program setup, see the <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/referrals\/\">referral docs<\/a>. For onboarding use cases, see the <a href=\"https:\/\/tolinku.com\/docs\/use-cases\/onboarding\/\">onboarding documentation<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Build onboarding flows tailored for referred users. Acknowledge the referrer, highlight rewards, reduce friction, and maximize referral conversion rates.<\/p>\n","protected":false},"author":2,"featured_media":971,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Onboarding Referred Users: Best Practices","rank_math_description":"Build onboarding flows tailored for referred users. Acknowledge the referrer, highlight rewards, reduce friction, and maximize referral conversion rates.","rank_math_focus_keyword":"onboarding referred users","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-onboarding-referred-users.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-onboarding-referred-users.png","footnotes":""},"categories":[18],"tags":[191,20,21,113,69,27,45,26,33],"class_list":["post-972","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-use-cases","tag-conversions","tag-deep-linking","tag-deferred-deep-linking","tag-growth","tag-mobile-development","tag-onboarding","tag-referrals","tag-user-acquisition","tag-user-experience"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/972","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=972"}],"version-history":[{"count":4,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/972\/revisions"}],"predecessor-version":[{"id":2827,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/972\/revisions\/2827"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/971"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}