What Deep Linking Is, and How to Check That a Link Opens the App

Two files on your website decide whether a tap reaches your app or the browser. See what Apple and Android fetch, when they check, and how to read it.

Neeraj JivnaniFounderSeptember 5, 2026 · 17 min read
Share

A deep link is a web address that opens one named screen inside a mobile app instead of the app's front page, or the matching page in a browser when the app is not there.

The phrase carries a second, older meaning: a link pointing at an interior page of a website rather than its home page.

Everything below is about the app sense.

Whether a deep link works is not settled inside the app. A file published on your website settles it, together with whether the platform has fetched that file and agreed the app is yours.

What Happens Between the Tap and the Screen

Between the tap and the screen, the operating system makes one decision, and it makes that decision before your app is involved. Android publishes the decision as an ordered list.

Android's documentation names the order plainly. Open the user's default app for the address if one was designated, otherwise open the only available app that can handle it, otherwise show a disambiguation dialog and let the user choose.

Read that order backwards and the design goal is clear.

A verified link never reaches the third step, because the system already knows whose address it is.

When the App Is Already Installed

With the app installed and the domain approved, the tap goes straight to the screen the path names. Nothing appears in between, no chooser and no browser.

That is the whole promise, and it holds only while the approval holds. The same tap on a phone where the domain was never verified takes a different branch.

On Android 12 and higher, the difference is invisible to the person tapping. Android's documentation states that a generic web intent resolves to an activity in your app only if the app is approved for that domain.

If it is not approved, the intent resolves to the user's default browser app instead.

No dialog, no error, no signal that anything else was meant to happen. The link opens a web page, and everyone assumes that was the plan.

When the App Is Not Installed

Without the app, an ordinary web address still works, because it is an ordinary web address.

The browser opens the page and the visit continues.

A custom scheme address has no such fallback. Nothing on the phone claims it, so the tap fails or lands on an error, which is one reason plain web addresses became the sensible default.

The harder case is the person who taps, installs the app, and opens it for the first time on a blank home screen. Carrying them to the screen they asked for takes a separate mechanism.

The Two Files That Decide Whether Any of It Works

Two files decide whether any of this works, one for each platform, and both live on your website rather than in the app. The app names a domain, the domain names the app back, and the platform checks that the two agree.

Apple's file is called apple-app-site-association and has no extension. Android's is called assetlinks.json.

Both are served from the /.well-known/ directory at the root of the domain.

Apple publishes three hosting rules, and each is a way to fail. You must host the file using https:// with a valid certificate and with no redirects.

Android's documentation states the address it queries rather than the rules, and that address is also an https one under /.well-known/.

Where the two platforms genuinely differ is timing, and that difference decides how long you wait to find out whether a change worked.

What Apple Fetches, and When

Apple's phones no longer ask your web server for the file. Apple's documentation says that starting with macOS 11 and iOS 14, apps no longer send requests for apple-app-site-association files directly to your web server.

They send those requests instead to an Apple-managed content delivery network (CDN) dedicated to associated domains.

That single change explains most of the confusion about why an edit did not take effect. Your server logs do not show the phones, because the phones are not asking your server.

Apple publishes both intervals. Its content delivery network requests the file for your domain within 24 hours, and devices check for updates approximately once per week after app installation.

So a corrected file is not live when you upload it.

It is live when Apple has fetched it and the phone has next looked, and neither event is yours to trigger.

There is one escape hatch, and it is for development only. Apple's alternate mode lets an app bypass the network and connect directly to a private domain while the web server is unreachable from the public internet.

Subdomains do not come free either.

Apple's documentation says a site using several subdomains needs a separate entitlement entry for each one, and each must serve its own association file.

What Android Checks, and When

Android verifies on install, and it tells you how long to wait. Its documentation says that when android:autoVerify="true" is present in at least one of the app's intent filters, installing the app triggers verification automatically.

That holds on any device running Android 6.0 or higher. The system then queries each hostname for the Digital Asset Links file at https://hostname/.well-known/assetlinks.json.

Verification is asynchronous, which is why the documentation gives a number. Wait at least 20 seconds for the process to complete before checking the result.

One older behavior is worth knowing if you own several domains. On Android 11 and lower, the system makes your app the default handler only if it finds a matching file for every host in the manifest.

So on those versions one broken domain took the rest down with it.

A corrected file has two different answers on Android, and the split is the Android version.

Android's documentation says that on Android 14 and lower the system does not perform periodic background re-verification, and that updates to the file are typically only picked up when the app is installed or updated.

On Android 15 and higher the system re-verifies domains in the background, and Android's documentation says changes can take up to seven days to propagate to all end-user devices.

So on the older versions the wait is not a wait. Nothing lands until the app is installed again.

Diagram comparing when each mobile platform reads the association file it verifies a deep link against, showing Apple's content delivery network requesting the apple-app-site-association file for a domain within 24 hours and devices re-checking approximately once per week after app installation, beside Android's assetlinks.json being queried on install and verified asynchronously with a documented wait of at least 20 seconds, and then the separate clock for a file that changes later, where Android 15 and higher re-verifies in the background with changes taking up to seven days to propagate while Android 14 and lower picks up an update only when the app is installed or updated, with the shared hosting rules of HTTPS, a valid certificate and no redirects named once for both.
Neeraj Jivnani · Apple Developer documentation, Supporting associated domains, and Android Developers, Verify Android App Links, both read September 2026
Use this chart — embed code and citation
Embed on your site
<a href="https://neerajjivnani.com/blog/deep-linking/"><img src="https://neerajjivnani.com/infographics/deep-linking/two-clocks.png" alt="Diagram comparing when each mobile platform reads the association file it verifies a deep link against, showing Apple's content delivery network requesting the apple-app-site-association file for a domain within 24 hours and devices re-checking approximately once per week after app installation, beside Android's assetlinks.json being queried on install and verified asynchronously with a documented wait of at least 20 seconds, and then the separate clock for a file that changes later, where Android 15 and higher re-verifies in the background with changes taking up to seven days to propagate while Android 14 and lower picks up an update only when the app is installed or updated, with the shared hosting rules of HTTPS, a valid certificate and no redirects named once for both." width="1200"></a> <p>Chart: <a href="https://neerajjivnani.com/blog/deep-linking/">Neeraj Jivnani</a></p>
Cite it
Neeraj Jivnani, "What Deep Linking Is, and How to Check That a Link Opens the App", neerajjivnani.com, https://neerajjivnani.com/blog/deep-linking/

Free to republish with a link back to this page.

The Decisions That Sit With Marketing, Not Engineering

Four decisions here are not engineering decisions, and they are the ones that stall a deep linking project. Engineering can build any of the four answers and cannot choose between them.

  1. Which addresses matter. Deep linking every page is rarely the goal, and the honest list is usually the handful of destinations campaigns point at.
  2. What happens with no app installed. The web page is one answer and the app store is the other, and one of them costs you the visit you already had.
  3. The content match Google imposes. Deciding that an app screen and a web page carry the same content is an editorial judgment, made page by page.
  4. Who owns the file. The file lives on the website, so the web team holds it, while the thing it breaks belongs to the app team, and the failure is invisible to both.

That last one is why these projects go quiet.

The check is cheap and the state is published. Run it after every app release, and after any change on the website that could touch the file, such as a new redirect rule or a certificate renewal.