Deep link troubleshooting is one of the most frustrating tasks in mobile development – and one of the most costly to ignore. When a deep link breaks, users land on an error screen, a home page, or nowhere at all. Conversion rates drop, campaigns underperform, and your engineering team spends hours chasing a problem that often has a five-minute fix once you know where to look.
This guide covers every major failure mode in deep link troubleshooting for both iOS Universal Links and Android App Links. You will get concrete diagnostic steps, real-world examples, and actionable recommendations you can apply today – whether you are a CTO reviewing your mobile architecture or a developer staring at a failing redirect.
Why Deep Link Troubleshooting Matters for Business
A broken deep link is not just a technical inconvenience. Marketing campaigns, email onboarding flows, push notifications, and QR code promotions all rely on deep links working correctly. According to Branch.io's mobile growth benchmarks, apps with functioning deep links see up to 2x higher retention compared to apps that drop users on the home screen.
For SMBs running paid acquisition campaigns, a broken deep link can mean paying for clicks that never convert. A €5,000 campaign with a 10% deep link failure rate effectively wastes €500 in acquisition budget – before you even consider the downstream churn impact.
The three business-critical consequences of broken deep links are:
- Lost conversions from paid and organic channels
- Degraded user experience leading to higher uninstall rates
- Inaccurate attribution data that distorts your marketing analytics
Understanding the root cause – rather than just the symptom – is the core skill in effective deep link troubleshooting.
The Deep Link Troubleshooting Taxonomy: Four Failure Categories
Not all deep link failures are equal. Before reaching for a fix, classify the failure correctly. Deep link troubleshooting becomes dramatically faster when you match the symptom to the category.
Category 1: The Link Does Not Open the App at All
The user taps the link and the browser opens instead of the app. This is the most common scenario and usually indicates one of three root causes:
1. AASA file misconfiguration (iOS) – The Apple App Site Association file is missing, malformed, or served with the wrong Content-Type header.
2. Digital Asset Links misconfiguration (Android) – The `assetlinks.json` file at `/.well-known/assetlinks.json` is unreachable or contains an incorrect SHA-256 fingerprint.
3. App not installed – The OS falls back to the browser because the app is not present on the device.
Category 2: The App Opens but Lands on the Wrong Screen
The deep link triggers the app correctly but the user lands on the home screen or an unrelated view. This is a routing or intent-handling failure. Common causes include:
- Missing or incorrectly scoped URL patterns in the app's intent filters (Android) or `applinks` entitlement (iOS)
- The incoming URL scheme is handled by a different module than expected
- The deep link handler parses the path incorrectly after a URL encoding issue
Category 3: The Link Works in Testing but Fails in Production
This intermittent pattern frustrates developers most. The causes are typically environmental:
- CDN caching of an old AASA or `assetlinks.json` file
- Environment mismatch – the bundle ID or package name used in development differs from production
- App version mismatch – a code-push update changed routing logic without updating the link configuration
Category 4: Deferred Deep Links Fail After Install
The user has never installed the app, clicks a deep link, installs the app from the store, and then lands on the home screen instead of the intended content. This is a deferred deep link failure and requires a dedicated attribution SDK (Branch, AppsFlyer, Adjust) to be configured correctly.
Step-by-Step Deep Link Troubleshooting for iOS Universal Links
iOS Universal Links depend on the Apple App Site Association (AASA) file being correctly hosted and the app being properly configured with the `applinks` entitlement. Follow these steps in order.
Step 1: Validate the AASA File
Navigate to `https://yourdomain.com/.well-known/apple-app-site-association` in a browser. Confirm:
- The file returns HTTP 200
- The `Content-Type` header is `application/json` (not `text/plain`)
- The JSON is valid and the `applinks.details` array contains your correct app ID in the format `TEAMID.BUNDLEID`
- Paths are scoped correctly – overly broad patterns like `"paths": ["*"]` can conflict with other entitlements
Use Apple's AASA Validator or the official `swcutil` tool on macOS to verify the file programmatically.
Step 2: Check the Entitlement Configuration
In Xcode, open your target's Signing & Capabilities tab. Confirm:
- The `Associated Domains` capability is enabled
- The domain is listed as `applinks:yourdomain.com` without a trailing slash
- The provisioning profile used for the production build includes the Associated Domains entitlement
A common mistake is enabling the entitlement in the development profile but forgetting to update the production or AdHoc distribution profile.
Step 3: Force an AASA Re-fetch
iOS caches the AASA file aggressively. After making changes, you cannot simply test immediately. Use the following methods to force a re-fetch:
- Reset device and reinstall the app
- Use Apple's CDN debug endpoint: `https://app-site-association.cdn-apple.com/a/v1/yourdomain.com`
- On iOS 16+, use the `swcutil` developer mode commands in the iOS Simulator
Bold reminder: iOS fetches the AASA file from Apple's CDN, not directly from your server. Apple caches the file – a server-side fix may take up to 24 hours to propagate unless you force invalidation.
Step-by-Step Deep Link Troubleshooting for Android App Links
Android App Links rely on the Digital Asset Links protocol. The verification process runs at install time and can be re-triggered manually.
Step 1: Validate the assetlinks.json File
Navigate to `https://yourdomain.com/.well-known/assetlinks.json`. Confirm:
- The file returns HTTP 200 over HTTPS (HTTP is rejected)
- The `package_name` matches your app's exact package name (case-sensitive)
- The `sha256_cert_fingerprints` array contains the release signing key fingerprint, not the debug key
To retrieve your release key's SHA-256 fingerprint, run:
keytool -list -v -keystore release.keystore -alias yourAlias
Step 2: Use the Digital Asset Links API for Verification
Google provides a public verification endpoint:
https://digitalassetlinks.googleapis.com/v1/statements:list
?source.web.site=https://yourdomain.com
&relation=delegate_permission/common.handle_all_urls
If the response returns an empty `statements` array, Android will not verify the link and will fall back to the browser.
Step 3: Check Intent Filter Configuration
In your `AndroidManifest.xml`, every deep link URL pattern must be declared in an `<intent-filter>` with `android:autoVerify="true"`. Verify:
- `android:scheme` is set to `https` (not `http`)
- `android:host` matches your domain exactly
- `android:pathPrefix` or `android:pathPattern` covers the intended URL paths
A missing `autoVerify` attribute is one of the most frequently overlooked causes of App Link failures – the link will open the app but only as a standard deep link, not a verified App Link, which changes fallback behavior.
Common Cross-Platform Deep Link Troubleshooting Mistakes
Whether you are working on iOS or Android, these mistakes appear repeatedly across codebases:
- Using HTTP instead of HTTPS – Both platforms require HTTPS for verified App Links
- Redirects before the link handler – A 301 redirect chain can cause Universal Links to fall through to Safari
- URL encoding errors – Special characters in parameters must be percent-encoded; failure to do so breaks path matching
- Incorrect bundle ID after rebranding – Companies that rebrand often update the app display name but forget to update bundle IDs in their AASA or assetlinks.json files
- Testing only on simulators – Universal Links do not work in the iOS Simulator; always test on a physical device
Deep Link Troubleshooting Tools and Resources
Investing ten minutes in the right tool saves hours of manual inspection. These are the tools most useful for deep link troubleshooting:
- Branch AASA Validator – Parses and validates your AASA file with detailed error messages
- Android Studio's App Links Assistant – Built-in wizard that validates intent filters, generates `assetlinks.json`, and tests link routing
- Charles Proxy / mitmproxy – Intercept network traffic to verify which requests the OS sends during link verification
- adb shell – Run `adb shell am start -a android.intent.action.VIEW -d "https://yourdomain.com/path"` to simulate an App Link on a connected device
- Apple's Console app – Filter by your bundle ID to catch Universal Link failure messages at the OS level
Building a Deep Link Monitoring Strategy
Fixing a broken deep link reactively costs more than catching it proactively. A systematic monitoring strategy catches failures before users do.
Implement these four practices in your team:
1. Automated link health checks – Run a nightly script that fetches your AASA and `assetlinks.json` and alerts on non-200 responses or schema changes
2. End-to-end deep link tests in your CI/CD pipeline using Appium or Detox
3. Attribution mismatch alerts – Configure your analytics platform to flag sessions where the deep link parameter is present but the landing screen is the home screen
4. Change management for signing certificates – Establish a checklist requiring `assetlinks.json` updates whenever a signing certificate is rotated or a new build flavor is introduced
These practices reduce mean time to detection (MTTD) for deep link failures from days to minutes – a significant operational improvement for any app-driven business.
When to Bring in External Expertise
Deep link troubleshooting becomes genuinely complex when your app uses multiple domains, supports several markets with localized subdomains, integrates third-party attribution SDKs, or has a mixed native/hybrid architecture. At that level, a single misconfiguration cascades into multiple failure modes simultaneously.
If your team has spent more than a day on a deep link failure without a clear diagnosis, the cost of continued internal investigation likely exceeds the cost of a focused external audit. Experienced mobile engineers can typically identify and resolve persistent deep link failures within a few hours because they have seen the same patterns across dozens of apps.
For companies planning new campaigns, product launches, or major app updates, a proactive deep link audit – rather than a reactive troubleshooting session – is the more cost-effective approach.
Deep link troubleshooting does not need to be a black box. With the right taxonomy, the right tools, and a systematic process, most failures can be diagnosed and resolved in under an hour. The investment in a robust deep link infrastructure pays dividends every time a user lands exactly where your campaign intended.
If your app's deep links are underperforming or you want a professional audit before your next major release, Schedule a free initial consultation →
You can also explore more technical guides and strategic advice on our Pilecode blog →
Have questions about this topic? Get in Touch.