Short answer: Universal links and App Links only work when the app is already installed. A new user who taps a link goes to the website or store, installs, and opens the app with no link at all. Restoring that destination on first open is called deferred deep linking.
What is happening
Deferred deep linking: routing a user to specific in-app content on the first open after they install the app from a link. Neither Apple nor Google defines the term; this is the industry meaning.
Apple says: "If the person hasn't installed your app, the system opens the URL in their default web browser." The app only receives the URL when the link itself launches it. Android App Links behave the same way: an absent or unverified app falls back to the browser.
- Your AASA and assetlinks files can be perfect and this still happens.
- It hits paid and referral campaigns hardest, since most clicks come from people without the app.
Why does this happen?
The store sits between the link and the first open, and the first open is not launched by the link, so the app receives no URL. Apple documents no first-party way to carry a URL through an App Store install.
- iOS: no install referrer equivalent in Apple's documentation.
- Android: Google offers the Play Install Referrer API, which can return "the referrer URL of the installed package".
How to confirm it
- Uninstall the app from a test device.
- Tap a deep link to a specific screen.
- Install from the store and open the app.
- If you land on the home screen, there is no deferred handling.
- With the app installed, tap the same link to confirm normal routing works, for example from Notes on iOS or with
adb shell am start -W -a android.intent.action.VIEW -d "https://example.com/product/1" com.example.app.
How to fix it
- Android: use the Play Install Referrer library (
com.android.installreferrer:installreferrer:2.2). Google's API returns the referrer URL of the install; teams commonly put the destination in thereferrerparameter of the Play Store link and read it back on first open. - Google says referrer details are available for 90 days and asks you to "invoke the API only once during the first execution after install".
- iOS: Apple's documentation has no install referrer, so deferred deep linking relies on third-party matching methods. Ask any provider how their matching works.
- Route the first open to the restored destination, and fall back to the home screen if nothing is found.
// build.gradle (Android)
implementation("com.android.installreferrer:installreferrer:2.2")
Hosted options: providers that handle deferred deep linking on both platforms include Linkrunner, Branch, Airbridge and Adjust.
The deferred deep linking guide explains each approach. Make sure the installed-app path works first: follow the universal links setup guide and the Android App Links setup guide, and confirm both with swcutil and adb shell pm get-app-links.