Your referral dashboard says a customer shared an invite. The app store says another install happened. Your backend says a new account converted. Yet nobody can prove that all three events belong to the same journey, so the advocate gets no reward—or the wrong person gets one. A reliable app referral flow closes that gap without making a raw referral code the source of truth.
This guide maps the system from share to qualified conversion. It shows product and engineering teams what to track, where referral context disappears, how deferred deep links restore it, and how to make rewards auditable rather than hopeful.
What is app referral tracking?
App referral tracking connects a unique invitation to the referred user’s click, app open or install, account creation, qualifying action, and reward. A production implementation uses a deep link for routing and context, then relies on a server-side referral record to validate ownership and issue the reward exactly once.
That distinction matters. A referral link is the transport mechanism; a referral program is the business system around it. The latter also needs eligibility rules, reward state, fraud controls, attribution precedence, analytics, and a support trail.
An app referral journey usually has two people:
- The referrer or advocate shares an invitation tied to their account.
- The referred user or friend follows it and completes the action that qualifies the referral.
The valuable outcome is rarely the click or install alone. It may be a verified signup, first order, completed ride, paid subscription, funded account, or another activation event that has real value to the business.
Why app referral links break at the install step
When the app is already installed, an HTTPS link can open it and pass routing data. Apple explains that Universal Links establish a secure relationship between a website and its app; Android uses verified App Links for the equivalent installed-app handoff.
The uninstalled path is different. The operating system can send the visitor to a website or app store, but the newly installed app does not automatically receive every parameter from the original browser tap. That discontinuity is the install gap.
| Visitor state | Desired result | What the link layer must do |
|---|---|---|
| App installed | Open the intended invite or signup screen | Route with a Universal Link or Android App Link |
| App not installed | Send the user to the correct store, then restore the invite after first open | Capture referral context before the store and resolve it after install |
| Desktop click | Explain the offer and move the user to mobile | Provide a web fallback, QR code, or account-based handoff |
| Link cannot be resolved | Let the user continue without a dead end | Open a safe landing page and offer manual code entry |
On Android, the Google Play Install Referrer API can return the referrer URL and click and installation timestamps. It is a useful deterministic signal for Play installs, but it is not a complete cross-platform referral backend. iOS, desktop-to-mobile journeys, existing users, non-Play distribution, late signups, reward accounting, and support disputes still need explicit application logic.
A deferred deep link bridges the store handoff: it records the click context, redirects to the store, and lets the app resolve eligible context on first open. For a deeper implementation view, see the deferred deep link implementation and testing guide.
Map the complete app referral lifecycle first
Do not start by choosing a reward amount or adding a Share button. Start with a state machine that both product and engineering agree on.
- Eligible advocate: a signed-in user becomes allowed to refer.
- Link issued: the backend creates or returns an opaque referral token.
- Invite shared: the app invokes the native share sheet with a clear message and HTTPS link.
- Link clicked: the redirect service records the token, time, campaign, and permitted technical context.
- Destination resolved: an installed app opens directly; otherwise the visitor receives the correct store or web fallback.
- Referral claimed: after first open or signup, the app submits the resolved token to the backend.
- User qualified: the referred account completes the defined business event.
- Reward decided: the backend approves, holds, blocks, reverses, or pays the reward.
- Revenue measured: downstream events remain connected to the referral record.
Each transition should create an event with a stable identifier. If the analytics tool reports a referral_click while the rewards database has no matching claim, that should be diagnosable—not silently written off as attribution loss.
Use event names that describe facts, not aspirations:
| Event | Minimum useful properties |
|---|---|
referral_link_created | advocate ID, referral token ID, program version |
referral_invite_shared | token ID, share channel if available, timestamp |
referral_link_clicked | click ID, token ID, landing platform, timestamp |
referral_claimed | referral ID, referred account ID, attribution source |
referral_qualified | referral ID, qualification event ID, value, timestamp |
referral_reward_changed | referral ID, previous state, new state, reason |
Avoid putting email addresses, phone numbers, or sequential customer IDs directly in the public URL. Use a random, non-guessable token that the backend maps to the advocate and program version.
Choose a reward trigger that reflects customer value
Paying at install is fast, but it is also easy to exploit and poorly aligned with retention. A better first rule is usually “reward after the referred user completes one verified action.” The right action sits far enough down the funnel to represent value, but early enough that both participants understand the connection.
Examples include:
- Ecommerce: first non-refunded order above a minimum amount.
- Subscription: first successful payment after any trial.
- Fintech: identity verification plus first funded transaction, subject to legal review.
- Marketplace: first completed booking or service, not merely a reservation.
- Learning: first completed lesson or paid plan activation.
Keep the reward pending until the action is final enough for your business. Store the exact rule version on every referral so that changing the program next month does not retroactively change old promises.
Referral incentives must remain separate from store manipulation. Google Play prohibits manipulation of ratings, reviews, and install counts, including incentivized reviews and ratings. Apple’s App Review Guidelines also prohibit manipulating reviews, rankings, discovery, or referrals. Reward genuine in-app value, never a positive rating, review, or artificial install.
If creators, ambassadors, or customers receive something of value for an endorsement, disclosure can also matter. The US Federal Trade Commission says a material connection that could affect how people evaluate an endorsement should be disclosed clearly and conspicuously. Apply the rules for every geography where the program operates and involve counsel when incentives or regulated products raise risk.

Build a reliable app referral architecture
A robust implementation separates routing, attribution, referral ownership, and rewards. Combining all four in a client-side callback makes happy-path demos easy and production disputes inevitable.
1. Generate an opaque link on the backend
Create a referral token after authenticating the advocate. Store the token hash or protected value with advocate_user_id, program_version, created_at, expires_at, and status. Return a branded HTTPS URL such as https://go.example.com/r/7Jk2....
Decide whether one advocate has one durable link or a new token per share. A durable link simplifies support; per-share tokens allow finer channel analysis. Either model works if the public token is unguessable and the database remains authoritative.
2. Configure installed-app routing
Associate the branded domain with the iOS app and Android package. Route /r/* to a stable referral entry point, not directly to a fragile onboarding step. Apple requires the domain’s association file and the app’s associated-domains entitlement; the link must still have a useful web fallback when the app is absent.
Test warm starts, cold starts, signed-out users, and links opened from messaging apps or embedded browsers. If iOS Universal Links behave unexpectedly, the Universal Links troubleshooting guide covers association files, redirects, caching, and user-choice behavior.
3. Capture the click before redirecting
At the redirect edge, validate the token, create a unique click ID, record consent-compatible context, and select the destination. Do not award anything here. A click proves only that a link was opened.
Return quickly. Keep marketing parameters separate from the durable referral token, and strip untrusted values before they reach in-app routing. The landing page should explain the offer and provide a manual code path when automatic resolution is unavailable.
4. Resolve context on open, then claim on the server
For installed users, the link handler can read the referral token immediately. For a new install, a deferred deep-link service or supported store signal resolves eligible click context on first open. Treat the result as a claim to verify, not permission to credit a wallet.
The app sends the token, authenticated referred-user ID, and a client request ID to the referral API. The backend checks that the advocate exists, the accounts differ, the token is active, the referred user is eligible, and no conflicting claim has already won.
5. Qualify and reward with idempotent server events
When the business event occurs, the system evaluates the stored rule version. Give the qualification event a stable ID and enforce a unique constraint such as (program_id, qualification_event_id). A retry should return the prior result, not issue a second reward.
Use a reward ledger rather than a mutable balance alone. Ledger entries should record amount or benefit, currency or unit, state, reason, referral ID, event ID, and reversal relationship. This makes refunds, chargebacks, manual corrections, and audits tractable.
Deeplinkly can handle the branded deep link, deferred post-install routing, and install attribution layer while your backend keeps ownership of eligibility and rewards. Its developer-first SDKs and raw event delivery are a practical fit when the team wants referral context across iOS and Android without relying on device fingerprinting; confirm the required platform signals and edge cases during a proof of concept.
Set attribution rules before two links claim one user
Referral link tracking becomes contentious when a friend taps multiple invites, enters a code manually, or arrives through a paid campaign. Write a precedence policy before launch.
A defensible policy might be:
- A manually entered code wins if submitted before the qualifying event and not already locked.
- Otherwise, the most recent eligible deterministic referral claim wins within the referral window.
- A user can belong to only one advocate for a given program.
- Once the qualification event is final, attribution locks except for an audited support correction.
- Paid-media attribution and referral ownership remain separate fields; one answers channel credit, the other answers who receives the referral reward.
That last point prevents analytics taxonomy from rewriting business obligations. Your MMP may attribute an install to an ad while the referral service records that a known advocate influenced the signup. Decide how reporting presents overlap, but do not overwrite one record with the other simply because both use the word “attribution.”
Choose the referral window from actual decision latency. A seven-day window may fit a quick consumer signup; a considered subscription or financial product may need longer. Publish the rule in program terms and store claimed_at, qualifies_by, and locked_at so support can explain outcomes.
Prevent referral fraud without punishing real customers
Referral abuse ranges from casual self-referral to organized account farms. Blocking every shared IP or household will also block families, campuses, offices, and carrier networks, so use layered signals and graduated states.
Start with these controls:
- Reject the same authenticated account on both sides.
- Limit rewards per advocate, referred account, payment instrument, and time period.
- Delay cash-like rewards until payment clears or the return window closes.
- Detect repeated device, account, payment, and network patterns without treating one signal as proof.
- Hold suspicious referrals for review instead of silently deleting them.
- Reverse both sides consistently when the qualifying event is refunded or fraudulent.
- Keep rules and thresholds server-side so an app update is not required to tune them.
Minimize data collection. Keep only the signals needed for attribution, security, support, and documented retention obligations. Avoid fabricating certainty with opaque fingerprinting: when no supported deterministic signal connects a click to an install, mark the journey unattributed and preserve a manual code fallback.
Support needs a single referral timeline showing link issuance, clicks, claims, qualifying events, reward decisions, and reasons. Give agents safe correction tools with role-based access and an audit log; do not make them edit balances directly.
Test the app referral flow as a system
One successful fresh install on a developer’s phone proves very little. Build a release matrix that exercises user state, platform, channel, timing, and failure recovery.
| Test case | Expected result |
|---|---|
| Installed app, cold start | Correct referral entry point opens and token is claimed once |
| Installed app, warm start | Existing session receives the link without duplicate navigation |
| Fresh iOS install | Store path completes; eligible context resolves or fallback remains usable |
| Fresh Android Play install | Install referrer or provider context is consumed once and timestamps are recorded |
| Desktop click followed by mobile | Landing page offers a controlled account, QR, or manual-code handoff |
| Expired or disabled token | User sees a safe explanation and can continue without a reward promise |
| Advocate opens own link | Self-referral is rejected without blocking normal app use |
| Two competing referral claims | Written precedence rule selects one and logs the conflict |
| Repeated qualification webhook | Idempotency returns the original reward decision |
| Refund or chargeback | Ledger posts a linked reversal and updates both user views |
| Offline first open | Resolver retries safely without duplicate claims |
| App update and reinstall | Existing referral ownership is not incorrectly recreated |
Automate API invariants: one referred user per program, one reward per qualification event, no reward before eligibility, and every balance change backed by a ledger entry. In analytics, compare counts at each step daily so a routing regression appears as a funnel break before support tickets accumulate.
Measure referrals from invite to revenue
Install count alone cannot tell you whether an app referral program is healthy. Measure both the sharing loop and referred-user quality.
Track:
- Share rate: eligible advocates who share divided by eligible advocates exposed.
- Click-through rate: unique referral clicks divided by recorded shares.
- Install or open rate: attributed installs or first opens divided by eligible clicks.
- Claim rate: accepted referral claims divided by resolved referral opens.
- Qualification rate: qualified referred users divided by accepted claims.
- Reward approval rate and median time to reward.
- Fraud-hold and reversal rates.
- Referred-user retention, revenue, and payback versus other acquisition cohorts.
- Support contacts per 1,000 accepted referrals.
Slice the funnel by platform, app version, share channel, program version, destination, and advocate cohort. A drop in Android first opens after a release points to a different problem than a drop in qualification after a reward change.
Also report unresolved and unattributed journeys. A dashboard that silently discards them will overstate conversion quality and hide platform-specific loss. Reconcile link clicks, first opens, backend claims, qualifying events, and ledger entries using stable IDs rather than aggregate totals alone.
Replace legacy Firebase referral links deliberately
Firebase Dynamic Links shut down on August 25, 2025, and Google states that hosted links stopped working after that date in its Dynamic Links deprecation FAQ. A referral program still using a page.link dependency needs more than a domain swap.
Inventory every issued referral URL, domain, route, app version, and downstream reward dependency. Preserve old-to-new token mappings where possible; migrate iOS and Android association files; update the SDK and link handlers; and keep old app versions in the test matrix. Because an already-shared link may live in a message for months, decide what legacy users see when the original route can no longer resolve.
Treat migration as a data and obligation project. Export what remains available, establish a branded domain the business controls, run both paths during a measured cutover where possible, and reconcile referral claims before retiring any old reward logic.
Frequently asked questions
What is an app referral?
An app referral is an invitation from an existing user, customer, creator, or partner that encourages another person to install or use an app. A trackable referral connects the invitation to the referred account and a defined qualifying action so the program can measure results and issue any promised reward.
How does an app referral link work if the app is not installed?
A deferred deep link captures the referral context before sending the visitor to the app store, then makes eligible context available when the new app is opened. The app submits that context to a backend, which validates the referral and waits for the qualifying action before rewarding anyone.
Do iOS and Android need different referral links?
Users can share one branded HTTPS link, but the platform handling differs underneath. iOS Universal Links and Android App Links need separate domain-to-app association configuration, and post-install resolution uses platform-supported signals or a deferred deep-link provider.
When should an app referral reward be issued?
Issue the reward after a verified action that represents customer value, such as a cleared first payment or completed booking, rather than at click or install. Use a pending state when refunds, trials, or fraud review can still invalidate the action.
How do you prevent app referral fraud?
Validate referrals on the server, reject self-referrals, enforce unique claims and idempotent qualification events, cap rewards, delay cash-like payouts, and review clusters of suspicious account, device, payment, or network behavior. Use multiple signals and an auditable hold state rather than blocking a legitimate household on one shared attribute.
What should replace Firebase Dynamic Links for referrals?
Use verified Universal Links and Android App Links for installed-app routing plus a maintained deferred deep-link and attribution layer for the post-install journey. Choose a branded domain you control, preserve token mappings, test old app versions, and keep reward eligibility in your own backend.
Conclusion
A dependable referral program is not a Share button attached to a coupon. It is a chain of evidence: opaque invite, recorded click, correct route, validated claim, valuable action, idempotent reward, and reconcilable revenue.
Start with one program version, one qualifying event, one reward ledger, and a written attribution policy. Run the full test matrix on iOS and Android before increasing the incentive; if the team cannot explain one referral from link creation to ledger entry, it is not ready to scale.