Deeplinkly

Glossary/Attribution mechanics

What is deferred deep linking?

Definition

Deferred deep linking is the practice of preserving a link's destination through an app store install, so that a user who did not have the app lands on the intended screen the first time they open it.

An ordinary deep link only works when the app is already installed. If it is not, the tap goes to the store, the destination is discarded, and a user who clicked a specific product opens the app on a generic home screen. Deferred deep linking is the mechanism that carries that destination across the gap — and the two platforms give you completely different amounts of help with it.

What happens across the install

Five steps, and only one of them is under the platform's control. The rest is your link service and your app.

  1. The user taps a link. The app is not installed, so nothing intercepts it and a web request reaches your link service.
  2. The service records the click — destination, campaign fields, a click identifier — and redirects to the correct store, attaching whatever context that store will carry.
  3. The user installs and opens the app for the first time.
  4. On first launch the app asks the service what this install came from, presenting whatever signal survived the trip.
  5. The service returns the original destination and campaign fields, or nothing at all if no signal survived. The app routes accordingly.

Step 5 has two honest outcomes

Either a deterministic signal survived and the install is attributed exactly, or none did and it is not. A system that always returns an answer is guessing — see why-are-my-installs-unattributed for what that guessing costs and why we decline to do it.

Android: the install referrer carries it

Google Play passes a string from the store URL through to the installed app. It is exact, deterministic, and available to any app that asks — which makes Android the easy platform for this.

The store URL, and what comes back
# What your link service redirects an uninstalled Android user to.
# Everything after referrer= is an opaque string you define.
https://play.google.com/store/apps/details\
?id=com.example.shop\
&referrer=utm_source%3Demail%26utm_campaign%3Dspring%26click_id%3Dclk_4b7d2e%26deep_link_value%3D%2Fproducts%2F42

# What the Install Referrer API returns on first launch, decoded:
utm_source=email&utm_campaign=spring&click_id=clk_4b7d2e&deep_link_value=/products/42
Reading it on first launch
val client = InstallReferrerClient.newBuilder(context).build()

client.startConnection(object : InstallReferrerStateListener {
    override fun onInstallReferrerSetupFinished(responseCode: Int) {
        if (responseCode != InstallReferrerClient.InstallReferrerResponse.OK) return

        val details = client.installReferrer
        val referrer = details.installReferrer          // the string above
        val clickTime = details.referrerClickTimestampSeconds
        val installTime = details.installBeginTimestampSeconds

        // clickTime -> installTime is the click-to-install time, which is
        // also the primary signal for detecting click injection.
        Router.resolveDeferred(referrer, clickTime, installTime)
        client.endConnection()
    }

    override fun onInstallReferrerServiceDisconnected() {}
})

Read it once, early, and store the result

The referrer is available for a limited window after install and only for installs that came through Play. Sideloaded builds, some OEM stores and pre-installed images return nothing. Read it on the very first launch, persist what you get, and never re-query it as your source of truth later.

iOS: what actually survives

There is no iOS install referrer. The App Store passes nothing from the click to the installed app, which is why every iOS deferred implementation is a matter of what other signal can be made to survive.

Signals that can carry a destination across an iOS install.
SignalDeterministicRequiresAvailability
App Clip invocation URL in a shared containerYesThe user came through an App ClipNarrow, but exact
A one-time click identifier passed through a supported flowYesThe platform or partner supports the handoffLimited
A code or token the user carries themselvesYesThe user does somethingAlways available; rarely acceptable
SKAdNetwork postbackCampaign level onlyAn ad network installNo per-user destination
Device fingerprintingNo — a probabilistic guessReading device characteristicsWe do not ship it

The last row is a policy decision, not a capability gap. Fingerprinting assembles an identity from screen size, boot time, free disk space and IP address — the same signals Apple designated as required-reason APIs precisely because of this use. When no deterministic signal survives, we return no attribution rather than a guess dressed up as a match.

The pasteboard is not a free pass either

Copying a token to the clipboard at click time and reading it at first launch was a common trick until iOS started showing a banner every time an app reads the pasteboard. It still technically works and it still looks, to the user, exactly like an app snooping on their clipboard.

The payload your app resolves

Whatever the platform, first launch ends with one call and one response. Designing that response to be explicit about *how* it was matched is what keeps downstream reporting honest.

First-launch resolution response
{
  "matched": true,
  "match_type": "deterministic",
  "match_signal": "play_install_referrer",
  "click_id": "clk_4b7d2e",
  "clicked_at": "2026-08-17T09:14:02Z",
  "installed_at": "2026-08-17T09:19:58Z",
  "deep_link": "https://example.com/products/42",
  "deep_link_value": "/products/42",
  "campaign": { "source": "email", "medium": "newsletter", "name": "spring" }
}

// And the honest negative case, which iOS produces regularly:
{
  "matched": false,
  "match_type": null,
  "match_signal": null,
  "deep_link": null
}
Direct versus deferred deep linking.
Direct deep linkDeferred deep link
App installed at click timeYesNo
Destination carried byThe URL itselfThe referrer, or a first-launch match
Resolved byThe OSYour service, on first launch
LatencyInstantStore install plus one network call
Can fail silentlyOpens the web pageLands on the home screen
Primary useRe-engagementAcquisition and install attribution

Both are needed: direct links for users you already have, deferred for the ones you are acquiring. When the deferred half returns nothing and you expected an answer, the ordered checklist is in deferred-deep-link-not-working.

UTM builder

Build the tagged campaign URL that sits at the front of the flow. Consistent utm_source, utm_medium and utm_campaign values are what make the install referrer readable on the other side of the store — that string is the only context Android carries through an install, so its contents are worth getting right first.

Open the utm builder

Frequently asked questions

What is deferred deep linking?
Deferred deep linking carries a link's destination through the app install. When someone taps a link without the app installed, the intended destination is stored, the user goes to the App Store or Play Store, and on first app open they land on that exact screen instead of a generic home screen.
How does deferred deep linking work?
When the link is clicked, the SDK records the destination along with signals about the click. After install, the SDK asks the server for any pending destination for that device and matches the two. On Android, the Play Install Referrer passes the data through directly; on iOS, matching relies on a combination of install-time signals since there is no equivalent referrer.
How accurate is deferred deep link matching?
A deferred deep link is matched only when a supported deterministic signal survives the install. On Android, the Play Install Referrer can carry the original parameters. On iOS, a supported Deeplinkly click identifier must survive the install flow. Deeplinkly does not use device fingerprinting as a fallback, so an install without a deterministic signal remains unattributed.
Can I do deferred deep linking without a third-party service?
On Android you can get close using the Play Install Referrer API yourself. On iOS it is impractical: there is no referrer, so you would have to build and operate the click-to-install matching infrastructure. This is the main reason teams use an attribution platform rather than building it.
Does deferred deep linking still work after the Firebase Dynamic Links shutdown?
Yes — the technique is unaffected; only Google's implementation of it went away. Firebase Dynamic Links shut down on 25 August 2025 and every page.link URL stopped resolving, so teams that relied on it need to migrate to another provider, but deferred deep linking itself works exactly as before.
Is deferred deep linking the same as install attribution?
They are related but distinct. Deferred deep linking uses the click-to-install match to route the user to the right screen; install attribution uses the same match to record which campaign, channel, or partner produced the install. Most platforms provide both because they depend on the same underlying matching.

Related terms

  • Deferred deep link not workingA deferred deep link fails when the signal meant to carry the pre-install destination across the app store — an install referrer, a stored token, or a server-side match — is absent, expired, or never read on first launch.
  • Unattributed installsAn install is unattributed when no signal linking it to a prior ad click or link tap survived the journey through the app store, which can mean the install was organic or that the signal existed and was lost.
  • Link Fallback ChainA link fallback chain is the ordered set of destinations a single link resolves to — the app, the app store, or a web page — depending on the user's platform and whether the app is installed.
  • App ClipAn App Clip is a lightweight portion of an iOS app that a user can launch from a URL, code, or NFC tag without installing the full app from the App Store.