Deep Linking QA Playbook

Practical, battle-tested checks to ship reliable Universal Links (iOS), App Links (Android), and deferred deep linking. Less theory — more steps, commands, and acceptance criteria.

1) Lab setup

  • Devices: at least one recent iPhone + one Android (Pixel/Samsung) with latest stable OS; add a second Android with older OS if possible.
  • Networks: WIFI + cellular; VPN to test different regions.
  • Clean states: ability to reinstall apps quickly; clear default handlers/chooser on Android.
  • Test links: one link per use case (product, referral, promo), each with UTM parameters.
  • Domains ready: {YOUR_ID}.sddl.me and/or your custom domain connected in SDDL.

2) iOS — Universal Links

Goals: open app without Safari prompts, correct routing, and valid AASA.

# Sanity commands
xcrun simctl openurl booted "https://YOUR_DOMAIN/path"
curl -i https://YOUR_DOMAIN/.well-known/apple-app-site-association
# Quick field tests
• Tap link from Safari (fresh install)
• Tap from Notes/iMessage
• Long-press (peek) → Open in app
• After changing entitlements: delete & reinstall
  • AASA must be served with no redirects and a JSON content type.
  • Associated Domains verified in Xcode (no warnings).
  • Cold-start restore in place (see “Deferred & cold start”).

3) Android — App Links

Goals: verified domain (no chooser), correct routing, valid assetlinks.json.

# Verification
adb shell pm verify-app-links your.package.name
curl -i https://YOUR_DOMAIN/.well-known/assetlinks.json
# Launch via intent
adb shell am start -W -a android.intent.action.VIEW \
  -d "https://YOUR_DOMAIN/path" your.package.name
  • android:autoVerify="true" on your intent-filter.
  • Package + SHA256 fingerprints added in SDDL; assetlinks.json is auto-published.
  • Clear defaults if a chooser appears; re-verify after app updates.

4) Deferred & cold start

  1. Uninstall the app.
  2. Tap a deep link with UTM/context.
  3. Install app from store; open first time.
  4. App should call the SDDL resolve helper on launch and receive payload → route to target screen.

No special store parameters are required: SDDL keeps intent across install and returns payload on cold start via the SDKs.

5) Web fallback & previews

  • Fallback page returns 200 with proper OG/Twitter meta for share previews.
  • Shorteners must preserve the query string (UTMs, tokens).
  • SEO: correct canonical/hreflang for localized fallback pages.
<meta property="og:title" content="Your Promo">
<meta property="og:description" content="Limited time">
<meta property="og:image" content="https://cdn.example.com/og/promo.png">
<meta name="twitter:card" content="summary_large_image">

6) Ads, email & social

# Ads sanity
• One ad per network (Meta, Google, TikTok) → open on iOS/Android
• UTMs present after redirects
• App open vs store fallback is consistent
# Email/messengers
• Apple Mail/Gmail app clicks
• WhatsApp/Telegram/Slack preview image shows
• No extra redirects added by ESP

If previews don’t render: fetch as the network’s crawler UA and confirm it receives a 200 with OG tags.

7) Locales & geo

  • Links resolve to the right store locale (if you localize store pages) or to a universal store URL.
  • Fallback pages respect language routing and return the correct hreflang.
  • UTMs retained across locale redirects.

8) Monitoring & rollback

  • Monitor: link opens, store visits, first launches (deferred resolved), in-app routes.
  • Alert on spikes of fallback page views (could indicate verification issues).
  • Rollback: keep 302 redirects from legacy promo domains; you can flip traffic instantly if needed.

Acceptance checklist

[ ] iOS: tap from Safari/iMessage/Notes opens app w/o prompts
[ ] iOS: AASA reachable (no redirects), Associated Domains verified
[ ] Android: no chooser, autoVerify OK, assetlinks.json valid
[ ] Deferred: uninstall → click → install → first launch restores payload
[ ] Routing: correct screen for each link type (product, promo, referral)
[ ] UTMs preserved end-to-end (ads/email to app payload)
[ ] Web fallback returns 200 with OG/Twitter preview
[ ] Email/Messengers: previews render; links open the app
[ ] Locales/geo: correct store/fallback language; UTMs intact
[ ] Monitoring: opens/installs/routes visible; alerts configured
[ ] Rollback plan tested (legacy domain → 302 → new links)

FAQ

Do I need to host AASA/assetlinks?

No. SDDL publishes both automatically from your app settings.

How do I verify on a real device quickly?

Use the commands above, then tap from Safari/Notes (iOS) and share sheet/apps (Android). Reinstall after entitlement changes.

What breaks previews?

Redirects before OG, blocked bots, or missing og:image/og:description. Ensure crawler gets 200 with full tags.

Related guides

Continue exploring