Deferred deep linking: send new users to the right screen after install
Someone taps a link, installs your app, and still lands on the product, invite, or creator page the link pointed at. Smler does it on iOS and Android, and the first 25,000 attributed installs each month are free.
10% off applied
Tap the link
In a creator’s story, an ad, or an email.
App Store
App missing, so Smler routes to the store.
Install
Smler holds the click while they wait.
First open
The app opens on the product, credited to Maya.
- click
- c_91f3
- ref
- maya
- path
- /products/summer-tote
- promo
- SUMMER10
What is deferred deep linking?
Deferred deep linking remembers which link someone tapped before installing your app, then opens that screen on the first launch. A deep link only works when the app is already installed. A deferred deep link survives the store and still routes and attributes the new user on iOS and Android.
- Platforms
- iOS and Android
- Android method
- Play Install Referrer
- iOS method
- Clipboard, then a scored match
- Needs IDFA / ATT
- No
- Free allowance
- 25,000 attributed installs a month
01
How deferred deep linking works
A normal link can open the store, and then the context is gone. The person installs, lands on a generic home screen, and you can’t tell which campaign, creator, or friend sent them. Deferred deep linking stores the click across that gap and hands it back on the first open.
The path is the same on both platforms, even though the mechanism that survives the store differs. If the app is already installed, a Universal Link or App Link opens the screen immediately. If it isn’t, Smler sends the person to the right store and keeps the click.
01
Click
The link lives in paid social, a creator bio, an email, an SMS, or a QR code. Smler records the click, a click id, and any payload you attached, like a creator handle or a product id.
02
Store
Device routing sends iOS to the App Store and Android to Google Play. Desktop can fall through to the web page for the same content. This hop is where a plain deep link loses the destination.
03
Install
Nothing in the store UI has to show the link. The click is held outside the store: in the Play referrer on Android, or on the clipboard and a server-side match on iOS.
04
First open
The app asks for the deferred data once. Run the check on first launch and remember you ran it, so later opens are ordinary deep links and aren’t counted as new installs.
05
Route and attribute
Resolve the short link, open the in-app path, and report the open. The first open from a Smler link after install is the attributed install. Later opens are free.
If the app is already on the phone, you skip the store entirely. That visit is a plain deep link, covered on the deep linking use cases page. Deferred deep linking is the extra promise for people who still need to install.
02
Android Install Referrer vs iOS clipboard
The click has to wait somewhere between the store and the first open. Android writes it into the Play Install Referrer. iOS copies it to the clipboard. Both end on the same screen. Here is what each one logs along the way.
- tap go.tote.co/summer
- play.google.com/store/apps/details?id=co.tote&referrer=click%3Dc_91f3%26ref%3Dmaya
- install (Play stores the referrer with it)
- first open
- getInstallReferrerAndroid()
- click=c_91f3 ref=maya path=/products/summer-tote
- routed to /products/summer-tote
Google Play hands the referrer back for 90 days. No clipboard, IP address, or advertising id involved.
- tap go.tote.co/summer
- Get the App → copied go.tote.co/summer
- apps.apple.com/app/tote-co
- install, then first open
- getInstallReferrerIos({ deepLinks: ['go.tote.co'] })
- clipboard=go.tote.co/summer (paste allowed)
- routed to /products/summer-tote
Paste declined or skipped? getProbabilisticMatch() compares the first open with recent clicks and returns a score from 0 to 1.
03
Android: Play Install Referrer
Android deferred deep linking uses the Play Install Referrer API. When Smler sends someone to Google Play, the store URL carries a referrer parameter. Play stores that referrer with the install and gives it back the first time the app asks. The match doesn’t depend on the clipboard, an IP address, or the advertising id. If Play returns a referrer, it belongs to this install.
The referrer string is URL-encoded query data: a click id, UTM parameters, a short code, a creator handle, or a nested deep link. The Android Install Referrer guide shows the shape Smler writes and how to decode it. With the React Native SDK you call getInstallReferrerAndroid() and then parseReferrerParams(). The raw string and the click and install timestamps come back together.
Writing Kotlin yourself? Add com.android.installreferrer:installreferrer:2.2. The React Native and Flutter packages already bundle it. Connect on first launch, read installReferrer when the response code is OK, then close the connection. Handle FEATURE_NOT_SUPPORTED and SERVICE_UNAVAILABLE so a build that can’t answer doesn’t block startup.
Google keeps the referrer available for 90 days, and it doesn’t change unless the app is reinstalled. If the first read fails, retry while the install is inside that window. After you route once, store a flag and stop asking. Re-engagement opens after that use Universal Links and App Links, a different path from the install referrer.
Step-by-step: integrate deferred deep linking on Android. The SDK-specific read is the React Native Install Referrer page.
04
iOS: clipboard matching and a scored fallback
iOS can’t ask the App Store for an install referrer, so Smler uses two methods in order. Clipboard matching is deterministic. Probabilistic matching is the fallback, and it always returns a confidence score so you can decide whether to trust it.
Clipboard matching
When an iOS visitor without the app opens the link, Smler can show a short page with two actions. Get the App copies the deep link, then opens the App Store. Get the App without Copying opens the store and leaves the clipboard alone. After install, the app reads the clipboard on first launch and checks it against the domains you allow. A match is the same link the person tapped.
This path doesn’t use the IP address, so iCloud Private Relay doesn’t break it. It does depend on the copy having happened and on the person allowing the paste. If they decline, or chose the button that doesn’t copy, the read returns nothing and you fall through. Pass the domains you own into getInstallReferrerIos, both the bare domain and the https form. The iOS deferred deep linking walkthrough follows that setup from the landing page through the first open.
Probabilistic fallback and the confidence score
If the clipboard doesn’t match, the SDK can ask Smler to compare this first open with recent clicks on your domain, using device signals like manufacturer, model, and OS version. The response is a matched flag, a score from 0.0 to 1.0, and the short code and original URL when there’s a match.
- 0.0 – 0.5
- Weak. Don’t treat it as a referrer.
- 0.5 – 0.8
- Medium. Fine as a hint, check before a reward.
- 0.8 – 1.0
- High. Safe for routing and attribution.
A practical cutoff from the probabilistic matching guide is 0.65. The method doesn’t throw. A validation problem, an HTTP error, or a network failure comes back on the error field with matched set to false.
Privacy notes
Clipboard matching reads data the person just copied from your own link page and only compares it with domains you listed. Tell people why the paste prompt appears, and keep the skip path. Probabilistic matching is less precise on shared Wi-Fi, VPNs, and corporate networks, because many devices look alike from the server.
Neither method reads Apple’s advertising identifier, which is why deferred deep linking still runs when App Tracking Transparency is denied. Your reward logic, if you have any, stays in your backend. Smler returns the referrer. It doesn’t run a rewards engine or a fraud score.
05
Deep link vs deferred deep link
Both open a screen inside the app, which is why teams mix up the names. The split is what happens when the app isn’t installed yet. The long version is the post deep link vs deferred deep link.
Deep link
App not installed yet
Home screen
Product lost at the store
Deferred deep link
App not installed yet
Summer tote
Install credited to the link
| Behavior | Deep link | Deferred deep link |
|---|---|---|
| App already installed | Opens the linked screen | Opens the linked screen |
| App not installed | Store or web, destination usually lost | Store, then the same screen on first open |
| How it opens an installed app | Universal Link, App Link, or URI scheme | Same, after the deferred payload is read |
| Install attribution | No new install to credit | The install is credited to the click |
| What survives the store | Nothing, unless you build a workaround | Referrer, clipboard, or a scored match |
| Typical payload | Path on the link | Path plus referrer id, creator, promo, product |
Use a deep link for people who already have the app. Use a deferred deep link whenever the click might be what causes the install: creator campaigns, referral invites, paid social, and QR codes on packaging. Most Smler links do both from one URL.
06
What you can pass through the install
The useful part of a deferred deep link is the payload that’s still there after the store. A link that only opens the home screen wasted the install. A contextual deep link carries enough to open a specific screen and to say who sent the person.
Referrer id and click id. The id of the click, so your backend can credit the inviter once a conversion is real. You report the conversion. Smler doesn’t pay out rewards.
Creator handle. Campaigns issue one link per creator as ?ref=<handle>. The Influencers leaderboard shows clicks, sales, revenue, and days to purchase for that handle. Setup is in Campaigns.
Promo code. Pass it if you want it pre-filled after install. It’s data on the link, not a substitute for the click id, because codes get shared.
Product id and in-app path. A product, article, playlist, or onboarding step. Resolve the short link and route on the original URL path, like an ordinary deep link.
{
"click_id": "c_91f3",
"ref": "maya",
"promo": "SUMMER10",
"path": "/products/summer-tote",
"utm_source": "instagram"
}On Android the fields ride inside the Play referrer. On iOS they ride on the copied link, or on the matched click when you accept the confidence score. Web purchases that happen later can still attach to the same creator through the 400-day first-party cookie and the server-side sale API. Shopify, WooCommerce, Stripe, and Polar connectors send those sales without a custom pixel.
When you need a deferred payload and when a plain deep link is enough is covered field by field in the deep link vs deferred deep link guide. The deferred deep linking guide walks the same idea from the campaign side.
07
Use cases
Anywhere the click happens before the install, a deferred deep link keeps the screen and the credit. Journeys for people who already have the app are on deep linking use cases.
Influencer links
Give each creator a ?ref= handle. The install and any later sale stay on that creator in the Influencers leaderboard, including purchases weeks afterward via the 400-day cookie.
Campaigns docsReferral invites
A per-user link carries the referrer id through the store. On first open you read that id and your backend credits the invite. Links never expire. Bring your own reward rules.
Referral and deferred deep linkingPaid social
The ad click and the install are split by the store and an in-app browser. The deferred payload still names the campaign, the creative, and the screen the ad promised.
Channel attribution guideEmail and SMS
A message can point at one product or one onboarding step. After install, the first open continues that message instead of dropping the person on a generic home screen.
Mobile app URLs on iOS and AndroidQR codes
Packaging, posters, and events are all pre-install clicks. A QR code that is a deferred deep link opens the right screen for new installs and for people who already have the app.
QR code deep linking
08
Implement in minutes
Create the link with deferred deep linking on, ship one of these first-open reads, and route on the result. React Native uses @smler/deferred-link. Flutter uses smler_deferred_link. Native Android talks to Play Install Referrer directly.
import { Platform } from 'react-native';
import { SmlerDeferredLink, HelperReferrer } from '@smler/deferred-link';
async function onFirstOpen() {
if (Platform.OS === 'android') {
const info = await SmlerDeferredLink.getInstallReferrerAndroid();
const params = SmlerDeferredLink.parseReferrerParams(info);
// Route from params, then remember that the first open ran.
return params;
}
const clipboard = await SmlerDeferredLink.getInstallReferrerIos({
deepLinks: ['https://go.yourdomain.com', 'go.yourdomain.com'],
});
if (clipboard) {
return SmlerDeferredLink.resolveDeepLink(clipboard.fullDeepLink, {
triggerWebhook: true,
});
}
const match = await HelperReferrer.getProbabilisticMatch({
domain: 'go.yourdomain.com',
});
if (match.matched && (match.score ?? 0) > 0.65) {
return match;
}
return null;
}import 'dart:io';
import 'package:smler_deferred_link/smler_deferred_link.dart';
Future<void> onFirstOpen() async {
if (Platform.isAndroid) {
final info = await SmlerDeferredLink.getInstallReferrerAndroid();
final clickId = info.getParam('clickId');
if (clickId.isNotEmpty) {
await info.trackClick();
}
return;
}
final res = await SmlerDeferredLink.getInstallReferrerIos(
deepLinks: ['go.yourdomain.com'],
);
final clickId = res?.getParam('clickId');
if (clickId != null && clickId.isNotEmpty) {
await res!.trackClick();
}
}dependencies {
implementation("com.android.installreferrer:installreferrer:2.2")
}
referrerClient = InstallReferrerClient.newBuilder(this).build()
referrerClient.startConnection(object : InstallReferrerStateListener {
override fun onInstallReferrerSetupFinished(responseCode: Int) {
if (responseCode == InstallReferrerClient.InstallReferrerResponse.OK) {
val referrer = referrerClient.installReferrer.installReferrer
// Decode the referrer, route, attribute, then stop retrying.
referrerClient.endConnection()
}
}
override fun onInstallReferrerServiceDisconnected() {}
})Navigation, the first-launch flag, and webhook setup are in the deferred deep linking guide, the React Native install guide, and the deep linking introduction. Creating the link itself is covered in how to generate deferred deep links.
09
Test it
A deferred deep link fails quietly when the association files are wrong: the store path still “works” and the first open simply has nothing to route. Check the files before you test on a device, then install from a real store build, not a sideload. Play Install Referrer and the iOS clipboard page both depend on the store hop.
- 1
Validate the Apple App Site Association file
Content type, JSON shape, and that the path matches the Universal Link you ship. Smler can host this file for your domain.
- 2
Validate assetlinks.json
The delegate_permission/common.handle_all_urls relation and the SHA-256 fingerprints.
- 3
Install through the store
Android: an internal testing track, so Play is the installer. iOS: TestFlight. Try both the copy and the skip button, and confirm a denied paste falls through to the score.
- 4
Check which click got the credit
Once the test install shows up, confirm the click id in analytics.
10
Pricing
25,000
attributed installs free, every month
Unlimited
opens of an app that’s already installed
Never
do links expire, on any plan
The free allowance resets every month and doesn’t need a card. An attributed install is the first open after install that came from a Smler link. Organic installs that never touched your link aren’t counted.
Paid plans are flat. You aren’t billed per monthly active user, and you aren’t billed again when the same person opens a deep link next week. Pass the allowance and links keep working. The numbers, the overage, and what each plan adds are on pricing.
11
Migrating from Firebase Dynamic Links or Branch
Firebase Dynamic Links shut down. If your deferred deep links lived on a page.link domain, they need a new host, a new association file, and a new first-open read. Smler hosts the AASA and assetlinks files, keeps links from expiring, and includes deferred deep linking on the free plan. The migration map is Smler vs Firebase Dynamic Links, and the longer field guide is migrate Firebase Dynamic Links to Smler.
Branch prices deferred deep linking on monthly active users, usually through a sales conversation. Smler prices on attributed installs, 25,000 of them free every month, and re-engagement opens aren’t metered. See Smler vs Branch, and the same comparison for Linkrunner and for Dub, which is built for web attribution rather than the install hop.
A practical migration: add the iOS bundle id and Android package, point the association files at Smler, recreate the links in the dashboard or the API, then swap the old SDK read for the first-open snippet above. Keep the old links answering until the new domain is verified. The Firebase Dynamic Links alternatives post compares the free tiers while you choose.
Frequently asked questions
What is deferred deep linking?
Deferred deep linking is routing a person to a specific screen in your app after they install it. They tap a link while the app is missing, install from the App Store or Play Store, and the first open still knows which link they came from. The app opens that screen and the install is attributed to the link.
Is deferred deep linking possible on iOS?
Yes. iOS has no Play Install Referrer equivalent. Smler copies the link before the App Store when the person chooses Get the App, and the app reads that clipboard value on first launch. If the clipboard is empty or paste is declined, probabilistic matching compares the first open with recent clicks and returns a confidence score from 0 to 1. The person can also continue to the App Store without copying the link.
Does deferred deep linking need an SDK?
An SDK is the short path, and it is optional. On Android you can read the Play Install Referrer yourself. On iOS you can read the copied link from the clipboard and resolve it with Smler. The React Native package @smler/deferred-link and the Flutter package smler_deferred_link wrap those reads, plus the probabilistic fallback. The deferred deep linking guide shows both the SDK and the native calls.
How accurate is deferred deep linking?
Android Install Referrer is deterministic: Play returns the referrer that was attached to that install. iOS clipboard matching is deterministic when the link was copied and the person allows the paste. If that match is missing, probabilistic matching returns a score from 0 to 1. The React Native guide treats a score above 0.65 as high enough to act on, 0.8 to 1.0 as high confidence, and below 0.5 as low confidence. Shared Wi-Fi, VPNs, and corporate networks make the fallback less reliable. Smler does not publish one match-rate percentage, because the rate depends on which method ran.
How long is the deferred deep linking attribution window?
Smler counts an attributed install the first time the app opens from a Smler link after install. Opens of an app that is already installed are unlimited and are not counted. On Android, the Play Install Referrer stays available for 90 days and does not change unless the app is reinstalled. The native guide uses that same 90-day window when it retries a missed read. On iOS, clipboard matching happens on first launch. The probabilistic fallback compares that launch with recent clicks and returns a score. The docs do not publish a separate fixed number of days for the fallback. A later web purchase can still be tied to a creator for 400 days with the first-party cookie.
Does deferred deep linking work with App Tracking Transparency?
Yes. These methods do not read the IDFA, so they do not depend on the App Tracking Transparency prompt. Android uses the Play Install Referrer. iOS uses a clipboard match the person can decline, then a probabilistic fallback based on device and click signals plus a confidence score. Denying ATT does not switch those methods off. Reading the clipboard still follows Apple paste permission on recent iOS versions.
What is the difference between a deep link and a deferred deep link?
A deep link opens a screen when the app is already installed, using a Universal Link, an Android App Link, or a custom URI scheme. A deferred deep link does that too, and it also keeps the destination when the person has to install first. After install, the first open routes to the same screen and attributes the install. The comparison is written up in the deep link vs deferred deep link guide.
Is deferred deep linking free?
Yes. Deferred deep linking is included on every Smler plan, including Free, up to 25,000 attributed installs a month. The allowance resets every month. Links never expire. Deep link opens of an already-installed app are not metered. Plans above that are flat. See pricing for the current numbers.