Home Blog Deep Link Troubleshooting: The Complete Fix Guide for Apps

Deep Link Troubleshooting: The Complete Fix Guide for Apps

Broken deep links silently kill conversion rates. A user taps a link in an email, a push notification, or a social post – and instead of landing on the right product page inside your app, they hit a 404 screen, get dumped on the home screen, or worse, see nothing at all. Deep link troubleshooting is one of the most underestimated disciplines in mobile app development, yet it directly impacts retention, paid campaign ROI, and user experience.

This guide walks development teams and technical decision-makers through every major failure category, root cause analysis, and fix – platform by platform.

Before diving into technical fixes, the business case is important to understand. According to Branch's Mobile Growth Report, apps with properly functioning deep links achieve 2x higher retention rates and up to 3x better campaign conversion compared to apps that fall back to a generic home screen.

The cost of broken links adds up quickly:

Deep link troubleshooting is therefore not purely a developer concern – it affects product, growth, and finance teams equally.

Deep link errors fall into five broad categories. Understanding which category applies to your issue reduces debugging time significantly.

1. Configuration Errors

These are the most common source of failures and include:

2. Routing Errors

These occur when the link opens the app but routes to the wrong screen:

3. Fallback Errors

When the app is not installed, the link should redirect to the App Store or Play Store – or to a web fallback. Common failures here include:

4. Platform-Specific Failures

iOS and Android each have distinct behaviours that require platform-specific deep link troubleshooting:

5. Third-Party Attribution SDK Conflicts

If you use a Mobile Measurement Partner (MMP) such as Adjust, AppsFlyer, or Singular, the deep link handling chain becomes more complex. SDK version mismatches, misconfigured redirect chains, or missing `onDeepLink` callbacks are frequent culprits.

Android App Links rely on Digital Asset Links verification. Here is a structured debugging workflow:

Step 1 – Verify your assetlinks.json

Navigate to `https://yourdomain.com/.well-known/assetlinks.json` in a browser. The file must:

Use the Google Digital Asset Links API to run an automated verification.

Step 2 – Check intent filters in AndroidManifest.xml

Every deep-linkable screen must have:

xml
<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" android:host="yourdomain.com" />
</intent-filter>

Missing `android:autoVerify="true"` is one of the most common deep link troubleshooting findings in Android apps.

Step 3 – Test with ADB

bash
adb shell am start -W -a android.intent.action.VIEW \
  -d "https://yourdomain.com/product/123" com.yourapp.package

If this opens the app correctly but a real link does not, the issue is likely in the App Links verification flow, not your routing code.

Step 4 – Check verification status on device

bash
adb shell pm get-app-links com.yourapp.package

Look for `verified` status. Any domain showing `none` or `legacy_failure` needs further investigation.

Common Android Fixes

iOS Universal Links use the apple-app-site-association file. Apple caches this file aggressively, which means configuration changes can take time to propagate.

Step 1 – Validate your AASA file

Check `https://yourdomain.com/.well-known/apple-app-site-association` or `https://yourdomain.com/apple-app-site-association`. Use the Apple AASA Validator to identify formatting issues.

A valid AASA structure:

json
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAMID.com.yourapp.bundle",
        "paths": ["/product/*", "/category/*"]
      }
    ]
  }
}

Step 2 – Confirm Associated Domains entitlement

In Xcode, navigate to Signing & Capabilities → Associated Domains. Your domain must appear as `applinks:yourdomain.com`. Provisioning profiles must be regenerated after adding this entitlement.

Step 3 – Implement the correct AppDelegate/SceneDelegate handler

swift
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else { return false }
    return handleDeepLink(url: url)
}

Missing or empty return values here silently break Universal Links on iOS.

Common iOS Fixes

Deferred deep linking preserves context across an app install. If a user does not have the app, they are sent to the store, install the app, and on first launch are routed to the originally intended screen. This mechanism is more complex to troubleshoot.

Key checks:

1. Attribution window: most MMP SDKs have a 24–72 hour attribution window. Links clicked outside this window will not trigger deferred deep link routing

2. Fingerprint matching: some platforms use device fingerprinting as a fallback when IDFA/GAID is unavailable – test on a device with tracking disabled

3. First-open callback: ensure the deferred deep link callback in your SDK integration fires before any navigation logic runs at startup

Test deferred deep linking with a clean install:

A short toolkit every mobile team should have:

Building a Prevention Checklist

Reactive deep link troubleshooting is costly. A proactive pre-release checklist reduces incidents dramatically:

1. Verify assetlinks.json and AASA files on a staging domain before going live

2. Run ADB tests for all deep-linkable routes as part of your CI/CD pipeline

3. Test Universal Links on a physical iOS device – simulators do not process them

4. Validate fallback URLs return HTTP 200 and are mobile-optimised

5. Test on devices with the app not installed to confirm deferred deep link behaviour

6. Test across OS versions – behaviour changed significantly in Android 12+ and iOS 14+

7. Document all deep-linkable routes in a centralised schema registry

Adding automated deep link health checks to your CI/CD pipeline can catch regressions before they reach production. Even a simple cURL test verifying that your assetlinks.json and AASA files return the expected content and headers provides significant coverage.

When to Escalate: Structural vs. Configuration Problems

Some deep link failures point to structural issues in app architecture that cannot be fixed with simple configuration changes:

In these cases, the solution is architectural refactoring, not a config tweak. Identifying this distinction early saves weeks of misdirected debugging effort.

If your team is dealing with recurring deep link failures or planning a major app overhaul, professional guidance can significantly accelerate resolution. Explore more app development best practices on the Pilecode blog or reach out to our team to discuss your specific architecture.

Effective deep link troubleshooting combines platform knowledge, structured diagnostics, and preventive engineering. The key takeaways:

A working deep link infrastructure is not a one-time setup task. It requires ongoing monitoring, especially after OS updates, signing certificate rotations, and domain changes. Teams that invest in systematic deep link troubleshooting consistently outperform those that treat it as an afterthought.


Ready to resolve persistent deep link issues in your app?

Schedule a free initial consultation →


Have questions about this topic? Get in Touch.