A deep link opens your app on the right page, not the browser. Someone taps a link to https://example.com/orders/42 in an email and lands on that order in the app. Phones only allow this if your domain confirms that the app belongs to you, through one small file on your site.
What you need
- The Deep links plugin turned on in your project
- A native build: Android Build (Native), or iOS with native navigation
- One file on your site for Android, and one for iOS
Android: assetlinks.json
Host this file at exactly https://your-domain/.well-known/assetlinks.json. Once you have a build, your project page shows the file filled in with your package name and SHA-256 fingerprint, ready to download.
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["AB:CD:…:EF"]
}
}
]The Android Build (Web) needs this same file for another reason: without it, the app shows an address bar.
iOS: apple-app-site-association
Host this file at https://your-domain/.well-known/apple-app-site-association. It has no extension, and your server must send it as application/json, with no redirect. Your project page gives you the exact file.
{
"applinks": {
"apps": [],
"details": [
{ "appID": "TEAMID.com.example.app", "paths": ["*"] }
]
}
}A wrong appID is the most common trap. The file still looks valid, but links silently open Safari. Use the file from your project page, not a hand-written one.
Check your files
Enter your domain in the deep link validator. It fetches both files as a phone would and tells you what's wrong: wrong address, wrong format, missing fingerprint or a redirect.
How to host the files
| Platform | How |
|---|---|
| Lovable, Bolt, Vite | Put them in public/.well-known/ |
| Next.js | Put them in public/.well-known/, or serve them from a route |
| Webflow, Bubble, Framer | These don't always allow files at that path. Use a proxy or a worker in front of your domain, or a route on a subdomain |
| Your own server | Serve the files as static, with application/json |
Test on a real phone
Install the app
Android checks your file when the app is installed. iOS gets it through Apple's servers, which can take a while after a change.
Tap a link from another app
Use a notes app or a message. Typing the address in the browser's address bar doesn't count: it stays in the browser.
Check the page
The app should open on that exact page. If your site has a sign-in, test it when signed out too.