Mobile App Deep Linking Guide (2026)
Universal Links, App Links, deep linking strategies, and the practical setup that gets users from web/email/social into the right screen of your app.
Deep linking is the plumbing that connects everything outside your app to specific screens inside your app. Done well, it powers referrals, web → install funnels, email campaigns, and shareable in-app content. Done badly, it breaks at every step.
This is the working playbook.
The three types of links
Universal Links (iOS) / App Links (Android)
Standard https:// URLs that:
- Open in your app if installed.
- Open in browser if not installed.
- Route to a specific screen via URL path.
This is the gold standard. No myapp:// custom schemes; HTTPS URLs that "just work."
Custom URL schemes
myapp://-style schemes. Older mechanism, mostly replaced by Universal Links / App Links.
Use only for:
- Inter-app communication (one app opening another).
- Backward compatibility.
Deferred deep linking
For users who don't have the app yet:
- User clicks a link.
- Goes to App Store / Play Store.
- After install, app opens to the originally-intended screen.
Requires SDK (Branch, AppsFlyer, Adjust, Firebase Dynamic Links) because the install + open events are separated.
Setup essentials
iOS Universal Links
- Create AASA file (Apple App Site Association):
https://yoursite.com/.well-known/apple-app-site-association. - Add Associated Domains in Xcode → Capabilities.
- Sign the AASA file correctly (no extension, valid JSON).
- Implement
application:continueUserActivity:in your AppDelegate / SceneDelegate. - Test in TestFlight — Universal Links don't work in Simulator.
Android App Links
- Create assetlinks.json:
https://yoursite.com/.well-known/assetlinks.json. - Add intent filter to your AndroidManifest with
autoVerify="true". - Sign assetlinks.json with your app's SHA-256 fingerprint.
- Implement intent handling in your Activity.
- Test with
adb shell am start -W -a android.intent.action.VIEW -d "https://yoursite.com/...".
Common pitfalls
- AASA file not served as
application/jsoncontent-type. - AASA file with wrong app ID format (must be
<TEAMID>.<BUNDLEID>). - assetlinks.json not at exactly
.well-known/assetlinks.json. - SHA-256 fingerprint from debug build vs release build.
Use cases worth implementing
1. Referral attribution
User shares a link → recipient clicks → installs → app opens to a "referred by [user]" experience. Required for referral programs.
2. Email + push campaign clicks
Email/push contains a deep link → tapping opens the right screen, not the home screen.
3. Social sharing
User shares "this article" or "this product" from your app → friends tap → installs (if needed) → opens to that exact item.
4. Web → app handoff
User reads your blog → bottom CTA opens app to relevant feature → installs if needed.
5. Cross-promotion between your own apps
User of App A → install App B → open to a personalized screen.
Tools
You can build all of this yourself with standard Universal Links + App Links + a custom server-side install tracker. But most teams use a tool:
Branch.io
- Free tier: 10k clicks/month.
- Strong attribution + reporting.
- Mature SDK.
- Free tier covers most indie scale.
AppsFlyer OneLink
- Bundled with AppsFlyer MMP.
- Justifies cost only if you already use AppsFlyer.
Adjust deep linking
- Similar to AppsFlyer — only worth it if you use Adjust as MMP.
Firebase Dynamic Links
- Was free, integrated with Firebase.
- Sunsetting in August 2025 — Google announced phase-out. Migrate before then.
Self-hosted
Universal Links + App Links + a simple server-side click tracker. Free, but takes a few days to implement deferred deep linking.
Decision matrix
Need / scale Recommend
----------------------------------------
Just need Universal Links Self-implement (free)
Referral attribution Branch free tier
Already use AppsFlyer AppsFlyer OneLink
Already use Adjust Adjust deep linking
Heavy Firebase usage Self-implement (after Dynamic Links sunset)
Enterprise scale AppsFlyer / Branch paid tier
What deep linking can't fix
- A weak listing. Deep links route traffic; conversion is downstream.
- A confusing onboarding. Deep-linked install + bad onboarding = high churn.
- Bad timing of share prompts. Generic share buttons spam users; thoughtful share UX matters.
Testing deep linking
You must test on real devices for both platforms:
- iOS: install via TestFlight, click link from Notes or Mail, confirm it opens app.
- Android: install signed APK, use
adbto send link, confirm intent handling. - For deferred deep linking: uninstall, click link, install, confirm context preserved.
Common mistakes
- Custom URL schemes only. Don't support non-app surfaces.
- No fallback to App Store. Link breaks if user doesn't have app.
- AASA / assetlinks.json misconfigured. Most common deep linking bug.
- No deferred deep linking. Loses context after install.
- Skipping testing. Real devices reveal bugs sim/emulator hides.
- Treating deep linking as marketing-only. Engineering, design, and growth all touch this.
Run an ASO audit alongside
Deep links drive users to specific screens. Your listing should reflect what users land on. Mismatch → bad reviews. Run free ASO audit for cross-checks.
Related reading
- Mobile App Referral Program Design
- Mobile App Attribution and SKAdNetwork Explained
- MMP Comparison: Adjust vs AppsFlyer vs Singular
- Push Notification Best Practices
- Mobile App Onboarding Optimization
- Mobile App Pricing Psychology
Try the tools
Ready to Optimize Your App Store Listing?
Try our free ASO tools — no signup required.