What Deep Linking Does For Your App
Deep linking is a URL that opens your app directly to a specific screen instead of just launching to the home tab. Tap a link in a text message, an email, or a push notification, and instead of a browser tab or a generic home screen, your Expo app opens straight to the exact product, order, or profile the link pointed at. For an app builder, it is the difference between a notification that dumps a user on the home screen and one that takes them exactly where they meant to go.
It matters most anywhere you are sending someone a link from outside the app: marketing emails, shared content between users, password reset flows, and push notifications. Every one of those loses most of its value if it lands the user somewhere generic instead of the specific screen the link was about.
Custom URL Schemes vs Universal Links
Two ways to deep link into an Expo app
| Custom URL Scheme | Universal Links (iOS) / App Links (Android) | |
|---|---|---|
| Format | myapp://path | https://yourdomain.com/path |
| If the app is not installed | Fails silently or shows an error | Falls back to your real webpage |
| Setup | One line in app.json: the scheme field | A verification file hosted on your own domain |
| Trust | Any app can register the same scheme, so it can be hijacked | Tied to a domain you control, so it cannot be spoofed by another app |
| Best for | Quick internal testing and links you generate yourself | Anything you share publicly - marketing, push notifications, shared content |
Setting Up a Custom URL Scheme in Expo
- Add a scheme field to app.json, e.g. "scheme": "myapp".
- Rebuild the app - a scheme change requires a new native build to take effect, a JavaScript-only reload is not enough.
- Test it with the Expo community tool uri-scheme: `npx uri-scheme open myapp://your-path --ios`, which launches the simulator straight into that path.
Setting Up Universal Links and App Links
Universal links (iOS) and App Links (Android) point at a real domain you control, so the operating system can verify the app is actually allowed to open that URL before it does.
- iOS: add an associatedDomains entry under ios in app.json, e.g. ["applinks:yourdomain.com"], and host an apple-app-site-association JSON file at yourdomain.com/.well-known/ over HTTPS.
- Android: host an assetlinks.json file at yourdomain.com/.well-known/, and add the matching intentFilters entry under android in app.json.
- Both require a production or development build made with EAS Build. The verification depends on native entitlements baked into the binary, so it does not work inside Expo Go.
Handling the Incoming Link in Your Code
If you are using Expo Router, most of this is automatic. Every file in the app directory becomes a URL path by default, so a link straight to /product/42 opens app/product/[id].tsx without any extra wiring on your end. You still need the associated-domains configuration above for the OS to trust the link, but the routing itself is handled for you.
If you are not using Expo Router, reach for the expo-linking library directly. Call Linking.getInitialURL() to catch a link that launched the app from a cold start, and Linking.addEventListener('url', handler) to catch links that arrive while the app is already open. Both cases need handling - they hit different code paths and it is easy to wire one and forget the other.
Testing Deep Links Before You Ship
- Custom scheme in the iOS simulator: `npx uri-scheme open myapp://your-path --ios`.
- Universal link in the iOS simulator: `xcrun simctl openurl booted https://yourdomain.com/your-path`.
- Android link from the terminal: `adb shell am start -a android.intent.action.VIEW -d "https://yourdomain.com/your-path"`.
- Test cold start (app fully closed) and warm start (app already open) separately. They hit different handlers, and a link that works from cold start can still break when the app is already running.
Deep Linking From Push Notifications
A push notification with no deep link opens the app to the home screen no matter what the notification was about, which wastes the entire reason you sent it. Wire the notification's data payload to carry a deep link URL, then handle it in the same Linking listener you set up above so tapping the notification lands on the exact screen it referenced - an order, a message, a specific piece of content - instead of forcing the user to go find it themselves.
Join the App Store Launch Club at appstorelaunchclub.com for $9/month for the full build workflow, from first Expo screen to a live app on both stores.
Short, practical drops on app ideas, validating fast, store listings, and passing app review. No spam, unsubscribe anytime.
Frequently asked questions
Do I need a real domain to set up deep linking?
Only for universal links and App Links, which require a verification file hosted on a domain you control. A custom URL scheme does not need a domain, but it is also less trustworthy for production use since any app can register the same scheme and it fails silently if the app is not installed.
Can I test universal links in Expo Go?
No. Universal links depend on native entitlements baked into the compiled binary, so they only work in a development build or a full EAS build, not inside Expo Go.
Does Expo Router handle deep linking automatically?
Yes, for the routing itself - every file in the app directory becomes a URL path automatically. You still need to configure and host the associated-domains verification file separately so the operating system trusts the link in the first place.
What is the most common thing that breaks?
Hosting the apple-app-site-association or assetlinks.json file incorrectly - the wrong content type, a redirect, or missing HTTPS. The OS checks that file directly and gives up silently if it does not load cleanly, so there is no error message pointing you at the problem.
Should I bother with deep linking if my app is simple?
If you ever send a push notification, a marketing email, or let users share content from the app, deep linking is what makes that link actually useful. Without it, every link you send just opens the home screen regardless of what it was about.
Where can I learn the rest of the Expo build workflow?
The App Store Launch Club covers the full path from your first Expo screen to a shipped app on the App Store and Google Play, including push notifications, subscriptions, and deep linking. Join at appstorelaunchclub.com for $9/month.
Last reviewed by David on August 5, 2026


