How deep links work on Android (intents, schemes, and App Links)
Android has three different ways to open an app from a link, and they behave nothing alike. Here's what actually happens when someone taps one — and why the same link can work for you and fail for them.
On Android, a deep link is a URL routed to an app through the intent system. The app declares in its manifest which links it handles — a custom scheme like myapp://, or a real https address it has verified with an assetlinks.json file (an Android App Link). When the link fires, Android matches it to an intent filter and hands it to the app; if nothing matches, it falls through to the browser.
Tap a link on Android and one of three things happens. Your app opens on the exact right screen. A chooser pops up asking which app to use. Or the browser loads and your app sits there, installed and ignored.
Which one you get comes down to how the link was built and, often, one small file sitting on a web server. Let's pull it apart.
It all runs through intents
Android doesn't really open links — it broadcasts an intent: someone wants to VIEW this URL, who can handle it? Apps raise their hand by declaring intent filters in their manifest, each one saying I handle links that look like this. If your app's filter matches the URL, Android routes the intent to it. No match, and the intent falls through to whatever handles plain web URLs — the browser. That routing step is the whole game.
The custom scheme: quick and fragile
The oldest form is a custom scheme — the app claims something like myapp:// in its manifest, and myapp://product/42 gets routed to it. Fast to set up, and every Android tutorial starts here.
The catch is the usual one: any app can claim any scheme. Two apps registering myapp:// leaves Android guessing, so you get a which app? chooser, and a scheme no installed app claims just errors out. Fine for testing, shaky for the public.
intent:// — the escape hatch
Because raw custom schemes fail silently, Android added a smarter URL form: the intent:// syntax. It packs the target scheme and a fallback URL into one string, so you can say try to open the app; if that fails, go to this web page instead. It's ugly to write by hand, but it's the honest way to get graceful failure out of a custom scheme. Chrome on Android understands it; many in-app browsers do not, which becomes a recurring theme.
Android App Links: the verified https way
The modern answer is an App Link — a normal https URL the app has proven it owns. You host a file at /.well-known/assetlinks.json listing your app's package name and signing fingerprint; Android checks it and, if it verifies, opens your app for those links with no chooser and no prompt. App not installed? It's still https, so the browser just loads the page.
Same URL, clean fallback, no impersonation. This is the Android twin of iOS Universal Links, and it's what you want for anything real.
So why does the same link behave differently for two people?
Three variables. Whether they have the app. Whether the app's App Link is actually verified — a typo in assetlinks.json silently disables it. And where they tapped: a link opened inside another app's webview may never reach Android's intent system at all. That last one is why a link that works from your home screen dies inside Instagram.
The shortcut if you don’t own the app
If you're just trying to get an existing app to open — routing people to YouTube, Amazon, your store — you can't publish assetlinks.json for someone else's package. directinapp handles the per-platform logic for you: one short link that tries the right Android intent, falls through to the Play Store or the mobile site, and copes with the in-app-browser mess, with no SDK in the picture. It won't conjure an app that isn't installed, but it stops the silent-error dead ends.
Found this useful? Tell Google to show you more of it.
Add us as a preferred sourceRelated guides
Put this into practice
Create smart short links that open the right app, with analytics built in. No credit card required.
Start free