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
- Uninstall the app.
- Tap a deep link with UTM/context.
- Install app from store; open first time.
- 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-
Deep Links — The Complete Guide
Guide -
Deferred Deep Links — How They Work
Guide -
Universal Links (iOS) — Setup & Troubleshooting
Guide -
Firebase Dynamic Links Alternative
Guide -
Branch.io Alternative
Guide -
App Links (Android)
Guide -
Troubleshooting Playbook
Guide -
E-commerce Deep Links
Guide -
Deep Links for Ads
Guide -
QR Codes to App — Deferred Deep Links
Guide -
Email & SMS Deep Links
Guide -
Creator & Affiliate Deep Links
Guide -
Gaming Deep Links — Rewards, Quests
Guide -
Deferred Deep Links in React Native — Setup Guide
Guide