Mobile deep linking specialist for Universal Links, App Links, deferred deep links, and attribution. Activate on: deep linking, Universal Links, App Links, deferred deep link, app attribution, URL scheme, branch.io, dynamic links, app clip. NOT for: web routing (use frontend-architect), push notification handling (use mobile-push-notification-expert), API URL design (use api-architect).
Expert in implementing deep linking across iOS and Android with Universal Links, App Links, deferred deep links, and attribution tracking.
Decision Points
Attribution Service Selection
Input: App requirements and constraints
├─ Simple link tracking + basic install attribution?
│ └─ YES → Use Branch.io (quick setup, free tier)
│ └─ NO → Continue
├─ Enterprise with complex attribution models?
│ └─ YES → Use Adjust or AppsFlyer (advanced features)
│ └─ NO → Continue
├─ Privacy-first, minimal data collection?
│ └─ YES → Custom solution with SKAdNetwork only
│ └─ NO → Use Branch.io
Deferred Deep Link Method
Target Platform Analysis:
├─ iOS 14+ with ATT restrictions?
│ ├─ HIGH privacy users → Clipboard method (user consent required)
│ └─ LOW privacy users → Fingerprint method (limited accuracy)
├─ Android with Play Install Referrer API?
│ └─ Use Play Install Referrer (most reliable)
├─ Cross-platform consistency needed?
│ └─ Use Branch.io or Adjust SDK (abstracts platform differences)
Link Handling Strategy
App State When Link Clicked:
├─ App not installed?
│ ├─ Marketing campaign → Smart app banner + deferred deep link
│ └─ User sharing → Direct app store link with custom params
├─ App installed but closed?
│ ├─ Universal/App Link configured → Direct app open
│ └─ No Universal Links → Custom URL scheme with fallback
├─ App running in background?
│ └─ Use Linking.addEventListener for immediate navigation
Failure Modes
1. "iOS 14+ Attribution Blackhole"
Symptoms: Links work but attribution shows zero installs/conversions after iOS 14.5
Diagnosis: SKAdNetwork not configured or ATT opt-out rate high
Fix: Implement SKAdNetwork 5.0 + privacy-preserving attribution model
2. "Android Deep Link Lag"
Symptoms: Links open app but navigation takes 3-5 seconds to complete
Diagnosis: App Links verification failed, falling back to intent filters
Fix: Verify Digital Asset Links file and package/signature match
3. "Deferred Link Timeout"
Symptoms: First-install users don't get routed to intended content
Diagnosis: Clipboard method stale or fingerprint match failed
Fix: Switch to SDK-based solution (Branch/Adjust) or extend clipboard TTL
4. "Universal Link Bypass"
Symptoms: Links open mobile Safari instead of app on iOS
Diagnosis: AASA file cached incorrectly or user disabled Universal Links
Fix: Validate AASA with Apple tools + provide manual "Open in App" button
5. "Cold Start Navigation Race"
Symptoms: Deep links work when app running but fail on fresh app launch
Diagnosis: Navigation container not ready when URL processed
Fix: Queue deep link in state, process after NavigationContainer mount
Worked Examples
E-commerce App with Product Deep Links
Scenario: User receives SMS link to product, app not installed
Link Analysis:https://shop.example.com/product/nike-air-max
Expert notices: Uses domain (good for Universal Links)
Novice misses: No UTM parameters for attribution tracking
Attribution Choice Decision:
Requirements: Track SMS campaign performance + deferred deep links
Privacy constraints: Moderate (e-commerce, some user tolerance)
→ Decision: Branch.io (good SMS attribution + easy deferred setup)
Implementation Trade-offs:
High Attribution Granularity: Custom fingerprinting + server-side tracking
Attribution tracking shows test conversion within expected time window
Fallback web page loads for non-installed users with clear app download CTA
Link routing works from email clients (Gmail, Outlook), SMS, social apps
Navigation state persists through app backgrounding/foregrounding cycles
Error handling graceful for malformed or expired deep links
NOT-FOR Boundaries
Web routing between pages → Use frontend-architect for SPA routing
Push notification payload handling → Use mobile-push-notification-expert for notification processing
API endpoint URL design → Use api-architect for REST/GraphQL URL structure
App Store Connect configuration → Use mobile-app-store-expert for app submission settings
OAuth/authentication flows → Use auth-specialist for login redirect handling
1---2name: mobile-deep-linking-specialist3description: Mobile deep linking specialist for Universal Links, App Links, deferred deep links, and attribution. Activate on: deep linking, Universal Links, App Links, deferred deep link, app attribution, URL scheme, branch.io, dynamic links, app clip. NOT for: web routing (use frontend-architect), push notification handling (use mobile-push-notification-expert), API URL design (use api-architect).4license: Apache-2.05---67# Mobile Deep Linking Specialist89Expert in implementing deep linking across iOS and Android with Universal Links, App Links, deferred deep links, and attribution tracking.1011## Decision Points1213### Attribution Service Selection14```15Input: App requirements and constraints16├─ Simple link tracking + basic install attribution?17│ └─ YES → Use Branch.io (quick setup, free tier)18│ └─ NO → Continue19├─ Enterprise with complex attribution models?20│ └─ YES → Use Adjust or AppsFlyer (advanced features)21│ └─ NO → Continue22├─ Privacy-first, minimal data collection?23│ └─ YES → Custom solution with SKAdNetwork only24│ └─ NO → Use Branch.io25```2627### Deferred Deep Link Method28```29Target Platform Analysis:30├─ iOS 14+ with ATT restrictions?31│ ├─ HIGH privacy users → Clipboard method (user consent required)32│ └─ LOW privacy users → Fingerprint method (limited accuracy)33├─ Android with Play Install Referrer API?34│ └─ Use Play Install Referrer (most reliable)35├─ Cross-platform consistency needed?36│ └─ Use Branch.io or Adjust SDK (abstracts platform differences)37```3839### Link Handling Strategy40```41App State When Link Clicked:42├─ App not installed?43│ ├─ Marketing campaign → Smart app banner + deferred deep link44│ └─ User sharing → Direct app store link with custom params45├─ App installed but closed?46│ ├─ Universal/App Link configured → Direct app open47│ └─ No Universal Links → Custom URL scheme with fallback48├─ App running in background?49│ └─ Use Linking.addEventListener for immediate navigation50```5152## Failure Modes5354### 1. "iOS 14+ Attribution Blackhole"55- **Symptoms:** Links work but attribution shows zero installs/conversions after iOS 14.556- **Diagnosis:** SKAdNetwork not configured or ATT opt-out rate high57- **Fix:** Implement SKAdNetwork 5.0 + privacy-preserving attribution model5859### 2. "Android Deep Link Lag"60- **Symptoms:** Links open app but navigation takes 3-5 seconds to complete61- **Diagnosis:** App Links verification failed, falling back to intent filters62- **Fix:** Verify Digital Asset Links file and package/signature match6364### 3. "Deferred Link Timeout"65- **Symptoms:** First-install users don't get routed to intended content66- **Diagnosis:** Clipboard method stale or fingerprint match failed67- **Fix:** Switch to SDK-based solution (Branch/Adjust) or extend clipboard TTL6869### 4. "Universal Link Bypass"70- **Symptoms:** Links open mobile Safari instead of app on iOS71- **Diagnosis:** AASA file cached incorrectly or user disabled Universal Links72- **Fix:** Validate AASA with Apple tools + provide manual "Open in App" button7374### 5. "Cold Start Navigation Race"75- **Symptoms:** Deep links work when app running but fail on fresh app launch76- **Diagnosis:** Navigation container not ready when URL processed77- **Fix:** Queue deep link in state, process after NavigationContainer mount7879## Worked Examples8081### E-commerce App with Product Deep Links8283**Scenario:** User receives SMS link to product, app not installed84851. **Link Analysis:** `https://shop.example.com/product/nike-air-max`86 - Expert notices: Uses domain (good for Universal Links)87 - Novice misses: No UTM parameters for attribution tracking88892. **Attribution Choice Decision:**90 ```91 Requirements: Track SMS campaign performance + deferred deep links92 Privacy constraints: Moderate (e-commerce, some user tolerance)93 → Decision: Branch.io (good SMS attribution + easy deferred setup)94 ```95963. **Implementation Trade-offs:**97 - **High Attribution Granularity:** Custom fingerprinting + server-side tracking98 - Pro: Detailed conversion funnel, cross-device tracking99 - Con: Privacy concerns, iOS 14+ limitations, complex setup100 - **Privacy-First Approach:** SKAdNetwork only with campaign-level attribution101 - Pro: Privacy compliant, Apple-approved102 - Con: Limited granularity, 24-48h delay103 - **Selected:** Branch.io with SKAdNetwork fallback104 - Balanced approach: good attribution when possible, privacy compliance1051064. **Setup Walkthrough:**107 ```typescript108 // 1. AASA file includes Branch domains109 "applinks": {110 "details": [{111 "appIDs": ["TEAMID.com.shop.example"],112 "components": [113 { "/": "/product/*" },114 { "/": "https://shop.app.link/*" } // Branch domain115 ]116 }]117 }118119 // 2. Navigation config with deferred handling120 const linking = {121 prefixes: ['https://shop.example.com', 'https://shop.app.link'],122 config: { screens: { Product: 'product/:id' } },123 async getInitialURL() {124 const branchData = await branch.getFirstReferringParams();125 if (branchData?.'+clicked_branch_link') {126 return `https://shop.example.com${branchData.$deeplink_path}`;127 }128 return await Linking.getInitialURL();129 }130 };131 ```1321335. **Expert Optimization:** Pre-load product data during app install to reduce perceived navigation delay134135## Quality Gates136137- [ ] Universal Links open app directly from Safari, Messages, Mail138- [ ] App Links verified with `adb shell am start -W -a android.intent.action.VIEW -d "https://example.com/test"`139- [ ] Deferred deep links work: uninstall app, click link, reinstall, verify routing140- [ ] Cold start navigation: force-close app, click link, verify content loads correctly141- [ ] AASA file validates at https://search.developer.apple.com/appsearch-validation-tool142- [ ] Attribution tracking shows test conversion within expected time window143- [ ] Fallback web page loads for non-installed users with clear app download CTA144- [ ] Link routing works from email clients (Gmail, Outlook), SMS, social apps145- [ ] Navigation state persists through app backgrounding/foregrounding cycles146- [ ] Error handling graceful for malformed or expired deep links147148## NOT-FOR Boundaries149150- **Web routing between pages** → Use `frontend-architect` for SPA routing151- **Push notification payload handling** → Use `mobile-push-notification-expert` for notification processing152- **API endpoint URL design** → Use `api-architect` for REST/GraphQL URL structure153- **App Store Connect configuration** → Use `mobile-app-store-expert` for app submission settings154- **OAuth/authentication flows** → Use `auth-specialist` for login redirect handling
Run npx skillmds@latest add curiositech/mobile-deep-linking-specialist in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Mobile deep linking specialist for Universal Links, App Links, deferred deep links, and attribution. Activate on: deep linking, Universal Links, App Links, deferred deep link, app attribution, URL scheme, branch.io, dynamic links, app clip. NOT for: web routing (use frontend-architect), push notification handling (use mobile-push-notification-expert), API URL design (use api-architect). It is listed under Web & Frontend on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Independent scanners report: SkillSpector: PASS, Skill Scanner: PASS. Capability flags: makes network calls. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under Apache-2.
curiositech (@curiositech) published this skill. Their other Agent Skills are listed on their SkillMD profile.