ASOhack
Back to Blog
Methodology

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.

ASOhack TeamMay 19, 20265 min read

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.

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

  1. Create AASA file (Apple App Site Association): https://yoursite.com/.well-known/apple-app-site-association.
  2. Add Associated Domains in Xcode → Capabilities.
  3. Sign the AASA file correctly (no extension, valid JSON).
  4. Implement application:continueUserActivity: in your AppDelegate / SceneDelegate.
  5. Test in TestFlight — Universal Links don't work in Simulator.
  1. Create assetlinks.json: https://yoursite.com/.well-known/assetlinks.json.
  2. Add intent filter to your AndroidManifest with autoVerify="true".
  3. Sign assetlinks.json with your app's SHA-256 fingerprint.
  4. Implement intent handling in your Activity.
  5. Test with adb shell am start -W -a android.intent.action.VIEW -d "https://yoursite.com/...".

Common pitfalls

  • AASA file not served as application/json content-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.

See referral program design.

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.
  • 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.
  • 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 adb to 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.

Try the tools

Ready to Optimize Your App Store Listing?

Try our free ASO tools — no signup required.