Deeplinkly

Glossary/Failure modes

Deep link opens the browser instead of the app

Definition

A deep link opens the browser instead of the app when the operating system has not accepted the app as a verified handler for that URL, or when the tap occurred in a context that never offers the app the chance to handle it.

This is the same visible symptom for roughly two dozen distinct causes across both platforms, which is why it is so often debugged by trying things. It does not need to be. Almost every cause announces itself through some other observable — whether it happens on both platforms, whether it happens from every app, whether it started recently — and three or four such observations narrow two dozen causes down to one or two.

Triage: three questions

Answer these before touching any configuration. Each one cuts the space roughly in half, and together they usually identify the cause outright.

What each observation rules in and out.
QuestionIf yesIf no
Does it fail on both iOS and Android?The link itself, or your infrastructure: a redirect, a tracking wrapper, or a URL that matches neither platform's rulesPlatform-specific setup — iOS or Android
Does it fail from every app you tap it in?Association or verification is genuinely brokenCause 5 — the in-app browser you tapped it in
Did it work before?A change: a deploy, a signing change, or a per-device preference. See Universal Links stopped workingIt has never been correctly configured; start at the association file

Do not test by tapping a link on your own website

On iOS, a link to example.com tapped while already on example.com deliberately does not open the app. This is expected behaviour, not a bug, and testing this way produces a false failure that sends people to rebuild configuration that was never broken. Test from a notes app.

The five underlying causes

1. The association or verification layer is broken. The OS never accepted your app as a handler for the domain. On iOS that means the AASA file was not fetched, or the entitlement is missing; on Android it means App Links verification failed, usually a fingerprint mismatch. This is the cause most of the time, and it is the one that fails from every app, on every device, consistently.

Check both platforms' association state
# Android: per-domain verification state. "verified" or nothing else will do.
adb shell pm get-app-links com.example.shop

# iOS, from macOS: association state and the reason for any failure
swcutil show --domain example.com

# Both files, as the platforms fetch them — no redirects followed
curl -sSI --max-redirs 0 https://example.com/.well-known/assetlinks.json
curl -sSI --max-redirs 0 https://example.com/.well-known/apple-app-site-association

2. The URL does not match your path rules. Association is fine and this particular URL is not claimed. On iOS that is the components array, evaluated top to bottom with the first match winning, so an exclude below a broad wildcard is dead code. On Android it is the <data> elements of the intent filter — and an intent filter that declares android:host but no android:pathPrefix claims the whole host, while one with a pathPrefix claims only that subtree. A URL with a query string or a fragment can also fall outside rules that only considered the path.

3. A redirect stands between the tap and your domain. Neither platform resolves redirects before deciding. The tap is evaluated against the URL being navigated to, so a link that points at click.tracker.com and 302s to example.com is a link to the tracker as far as the OS is concerned. Email click tracking, ad network click servers, and most link shorteners insert exactly this hop, which is why the same URL works when pasted into Notes and fails from a campaign.

Whether the app gets a chance to handle the URL, by link shape.
Link shapeiOSAndroid
Direct https://example.com/pathOpens the appOpens the app
https://tracker.com/c/123302 → your domainBrowserBrowser
Your domain → 302 → your domain, different pathOpens the app (the tap matched)Opens the app
JavaScript location.href = 'https://example.com/…'Usually browserUsually opens the app
Link tapped on a page of the same domainBrowser, by designOpens the app
Link inside an in-app webviewBrowser or nothingBrowser or nothing
myapp://path custom scheme from a web pageBlocked in most contextsBlocked in most contexts

4. It is a custom URI scheme, not a verified web link. myapp://product/42 is a URI scheme, and modern browsers on both platforms suppress scheme navigation that is not a direct user gesture — with no error, and no fallback if the app is absent. Custom schemes are still useful app-to-app, but a scheme link in an email, an ad, or a web page in 2026 will mostly do nothing. Universal Links and App Links exist because of exactly this.

5. The tap happened inside an in-app browser. Instagram, TikTok, LinkedIn, Facebook, and most chat apps render links in an embedded webview that never hands the URL to the OS. Your configuration is irrelevant inside one — the link cannot reach the app because nothing ever asks the OS to resolve it. This is the single most common cause of "works when I test it, fails for real users", because engineers test from Notes and users tap from social apps. See deep links in in-app browsers.

The app is not installed

Worth stating plainly because it is sometimes the whole answer: a Universal Link or App Link to a device without the app installed opens the browser. That is the design — the URL is a real web URL and the web page is the fallback. Nothing is broken.

What that surfaces is a product question rather than a bug. The user tapped a link meaning to reach a specific thing, and if they install the app at that point, the destination is lost unless you carry it across the install. That is deferred deep linking, and it is a separate mechanism that has to be built rather than configured.

What the same link does across install state and platform.
Link typeApp installedApp not installed
Universal Link (iOS)Opens the app at the destinationOpens your web page
App Link (Android, verified)Opens the app at the destinationOpens your web page
App Link (Android, unverified)Opens the browserOpens your web page
Custom URI schemeOpens the appNothing happens — no error, no fallback
Deferred deep linkOpens the app at the destinationStore, then the destination on first open

deep link debugger

Enter a domain and it checks both platforms at once — assetlinks.json and apple-app-site-association, redirect chains, content types, fingerprints, and Apple's cached copy — then tells you which of the five causes applies rather than leaving you to guess.

Open the deep link debugger

Frequently asked questions

Why does my deep link open the browser instead of the app?
There are five underlying causes: the association or verification layer was never accepted by the OS, the specific URL does not match your path rules, a redirect sits between the tap and your domain, the link is a custom URI scheme rather than a verified web link, or the tap happened inside an in-app browser that never hands the URL to the OS. Whether it fails on both platforms, from every app, and whether it worked before will identify which.
Why do deep links work when I test them but fail for real users?
Almost always because engineers test by tapping a link in Notes or Messages while users tap links inside Instagram, TikTok, or a chat app. Those render links in an embedded webview that never asks the operating system to resolve the URL, so no amount of correct configuration will open the app from inside one.
Do deep links work through a redirect?
No. Neither iOS nor Android resolves redirects before deciding whether an app can handle a URL. The decision is made against the URL being navigated to, so a link pointing at a click tracker that redirects to your domain is treated as a link to the tracker. Email click tracking and ad network click servers introduce exactly this hop.
Why does my app open on Android but not on iOS?
The two platforms verify differently and fail differently. Android verifies assetlinks.json at install time and the most common failure is a SHA-256 fingerprint from the wrong signing key. iOS fetches the apple-app-site-association file through Apple's CDN and the most common failures are a redirect in front of the file and a missing Associated Domains entitlement. iOS also deliberately declines to open the app for a same-domain tap, which Android does not.
Is it normal for a deep link to open the browser if the app is not installed?
Yes, and it is the intended design. Universal Links and App Links are real web URLs, so the web page is the fallback when there is no app to open. Carrying the intended destination across the install so the user lands in the right place after installing requires deferred deep linking, which is a separate mechanism.
Why do custom URL scheme links not open my app from a web page?
Browsers on both platforms suppress custom scheme navigation that is not a direct user gesture, and they do it silently with no error and no fallback when the app is absent. Custom schemes remain useful for app-to-app handoff, but for links in emails, ads, and web pages you need Universal Links on iOS and App Links on Android.

Related terms

  • Universal Links not opening the appA Universal Link fails to open its app when iOS has no valid association for the domain, when the tapped URL does not match the association's path rules, or when the tap did not originate in a context where iOS honours Universal Links at all.
  • Android App Links not workingAndroid App Links fail when the system cannot verify that a domain and an app belong to the same owner, at which point tapped links open in the browser instead of the app with no error shown to the user.
  • Deep links in in-app browsersAn in-app browser is an embedded webview inside another app that renders links without handing them to the operating system, which prevents Universal Links and App Links from ever reaching the app that claims the domain.