Websites · Compared
Deep link vs universal link
A deep link is any link that opens a specific screen inside an app. The older kind uses a custom scheme such as myapp://booking/42. A universal link, Apple's name, and an App Link, Android's, are ordinary https links that the phone opens in the app when the app is installed and verified for that domain, and in the browser when it is not.
Both kinds take people past the home screen to the exact booking, product or post. The difference is what happens when the app is missing, and who can claim the link.
Indunil Asanka · Co-founder
4 min read · Published
| Question | Custom scheme deep link | Universal Link (iOS) or App Link (Android) |
|---|---|---|
| Looks like | saltbush://hire/42 | https://saltbush.example/hire/42 |
| Verified ownership | No; any app can register the scheme | Yes; the domain publishes a file naming the app |
| If the app is not installed | The link fails or shows an error | The link opens the website instead |
| Verification file | None | apple-app-site-association (iOS), assetlinks.json (Android) in /.well-known/ |
| Good for | Links between your own apps, development | Emails, QR codes, social posts, anything public |
What each one is
Deep linking means linking to content inside an app rather than just launching it. The first method was the custom URL scheme: an app registers a prefix such as saltbush:// and the system opens it for any link starting that way. Because nothing stops another app registering the same scheme, and because the link is useless without the app, Apple introduced Universal Links and Google introduced Android App Links. Both use normal https addresses on a domain you own. Expo's linking documentation covers both kinds and how Expo Router maps a link to a screen.
How verification works
For Universal Links, the domain serves a file named apple-app-site-association from its /.well-known/ folder, listing the app's team and bundle identifiers and which paths belong to it, and the app declares the domain in its associated domains entitlement. For Android App Links, the domain serves assetlinks.json with the app's package name and signing certificate fingerprint, and the app declares the domain with autoVerify. The phone checks the file, and from then on taps on matching links open the app directly. If the app is not installed, the link opens the website at the same address.
When it matters
Deep links matter whenever a message points to something specific: a booking confirmation, an order shipped email, a password reset, a QR code on a table, a shared post. Sending people to the app's home screen and asking them to find the item loses many of them. Verified https links are the better choice for anything public, because the same link works for people with and without the app, and nobody else's app can intercept it.
Common mistakes
Using a custom scheme in emails, so people without the app get an error. Serving the verification file with a redirect or the wrong content type. Forgetting that Android verification uses the signing certificate fingerprint of the store build, which differs from the test build. Linking to paths the website does not have, so the fallback shows a not found page. Wrapping links in email click tracking that changes the domain. And never testing a cold start, where the app opens from a link while not running.
Where it shows up in OneCraft
Phone apps built with OneCraft are Expo projects using Expo Router, so every screen has a route path that links can point to. Apps are written in their own repository, preview in phone and tablet frames, and download as a zip with app.json filled. Android and iPhone builds run through Expo on paid plans as a test build or a store build at 5 credits each, and the owner submits to the stores from their own accounts.
Questions people ask
Is a universal link the same as a deep link?
A universal link is one kind of deep link. Deep link is the general term for any link that opens content inside an app. Universal Links are Apple's verified https version, App Links are Android's, and custom scheme links are the older, unverified kind.
Why does my universal link open Safari instead of the app?
Common causes are a missing or invalid apple-app-site-association file, a path not listed in it, an app build without the associated domains entitlement, or the person previously chose to open the site in Safari. Links typed into Safari's address bar also open in the browser by design.
Do I still need a custom URL scheme?
Often yes, as a fallback for links between your own apps and for development, and some authentication flows use one. For anything shared publicly, prefer https links verified as Universal Links and App Links, since they work with and without the app installed.
What is a deferred deep link?
A link that remembers its destination through an app install. Someone without the app taps it, goes to the store, installs, and on first launch lands on the linked screen. It needs extra tooling or a service, because the phone itself does not carry the link through the install.
Can a QR code open my app?
Yes. Encode a verified https link in the QR code. Phones with the app open the right screen; phones without it open the website at the same address, which can offer a store link. Avoid encoding custom schemes in printed codes, since they fail for anyone without the app.
Make one with websites
The button opens the generator with this use case already described. Change the wording to match your own.
Create a website with OneCraftRelated questions
- What is Expo Router?What is Expo Router? The file based router for Expo and React Native apps: files become screens, folders become stacks and tabs, and every screen gets a link.
- What is an over the air update?What is an over the air update? Shipping new JavaScript and assets to an installed app without a store build, how Expo does it and the store rules.
- What is a bundle ID?What is a bundle ID? The unique reverse domain identifier for an app, like com.yourbusiness.app, used by Apple and Google. Format, rules and why it stays.
- What is a splash screen?What is a splash screen? The screen an app shows while it starts. iPhone launch screens, the Android 12 splash screen API and Expo's splash settings compared.
Written and checked by the OneCraft team. Last checked .