How to migrate deep links to a new MMP without breaking them
Move deep links to a new MMP without dead links: AASA and assetlinks.json rules, keeping your link domain, vendor domain limits and a safe cutover order.
A link domain can serve only one apple-app-site-association file, so it can point at one link provider at a time. Inventory every live link first, decide whether to keep the domain or start a new one, ship the app update before you touch DNS, and allow up to 7 days for Android 15+ devices to pick up assetlinks.json changes.
What is a deep link migration?
A deep link migration is the move of every live link domain, link path and deferred deep link from one link provider to another, without sending users who tap an old link to an error page or the wrong screen.
It is usually the riskiest part of an MMP switch, because links live in places you no longer control: printed QR codes, old emails, creator bios and ads that still run. The migration planner puts link work in its own track for that reason.
Associated domain file: the apple-app-site-association (AASA) file on iOS, or assetlinks.json on Android, that proves an app may open links on a domain.
Why can one domain only point at one provider?
Because each domain serves exactly one AASA file and one assetlinks.json file, from whoever hosts the domain. Two link providers cannot both answer for the same hostname at the same time.
Apple and Google set the rules:
- iOS: the AASA file lives at
https://<domain>/.well-known/apple-app-site-association, served over https with a valid certificate and no redirects. Each subdomain needs its own Associated Domains entry and must serve its own file. - iOS caching: since iOS 14, devices fetch the AASA file through an Apple-managed CDN, not directly from your server.
- Android: for each hostname in your intent filters, the system checks
https://<hostname>/.well-known/assetlinks.json. - Android timing: on Android 15+, assetlinks.json changes can take up to seven days to reach all devices. On Android 14 and lower, updates are usually picked up only when the app is installed or updated (Android docs).
The deeplinkdoctor guide to the AASA file covers the file format and common validation errors.
Keep the domain or move to a new one?
There are two paths, and each has a cost.
Keep the existing domain
- Old links keep the same hostname, so printed QR codes and creator bios still reach your infrastructure.
- You repoint DNS to the new provider, which then serves the AASA and assetlinks.json files.
- The new provider does not know your old link paths. Every old path must be recreated on the new provider, or it will resolve to nothing.
- Branch's Firebase Dynamic Links guide describes this pattern: keep a custom domain by recreating links with the same alias, with brief downtime when the CNAME switches.
Start a new domain
- Old and new domains run side by side, so there is no DNS cutover moment.
- Both domains must be in your app's Associated Domains and intent filters for as long as old links are live.
- Old links keep working only while the old provider still hosts the old domain. What happens after the account ends is not published by any of the vendors below.
What each vendor says about its link domains
Vendors set up custom link domains in different ways, and some limit what you can change later.
| Vendor | How the custom domain is set up | Who serves AASA and assetlinks.json | Changing or removing it |
|---|---|---|---|
| Adjust | A record to an Adjust IP (global 185.151.204.100) | Adjust | Not editable by the customer; via support |
| AppsFlyer | CNAME to a OneLink subdomain, mapped within 7 days | Not published | Only unmapped branded domains can be deleted |
| Branch | CNAME to custom.bnc.lt | Branch hosts the AASA file | Changing the domain can break links; app.link subdomain changeable once |
| Linkrunner | Branded short links on custom domains | Not published | Not published |
| Singular | CNAME, then Validate | Not published | Not published |
Two details matter most. Branch says changing NS or CNAME records makes Branch the authoritative host and you "will lose access" to that subdomain, and advises against using your main website domain (Branch docs). Adjust says its Enterprise domain cannot be edited or deleted by the customer once configured, and that changes go through support (Adjust docs).
If you are leaving Branch in particular, the Branch exit notes cover its domain rules in more detail.
Inventory every live link first
You cannot migrate links you do not know about. Before any DNS change, list:
- Paid ads: every tracking or deep link in active campaigns, by network.
- QR codes: packaging, posters, event signage and print ads. These cannot be edited once printed.
- Owned channels: email templates, push campaigns, SMS, in-app banners and your website.
- Creator and influencer bios: links in profiles and pinned posts, which you often cannot edit yourself.
- Partner placements: affiliate links and referral programmes.
- Paths and parameters: the deep link path and any parameters each link passes, so the new link can open the same screen.
Export the link list from the old provider while you still have dashboard access.
Do not forget deferred deep links
Deferred deep link: a link that sends a new user to the store, then opens the intended screen after the first install and launch.
- A deferred deep link depends on the SDK that owns the link being in the build the user installs.
- Removing the old SDK while old links are still live means installs from those links lose their deferred destination.
- Plain App Links and Universal Links do not do deferred deep linking at all, according to Google's own migration guide.
- Test deferred routes for each link type on both platforms before you retire the old SDK, which the parallel SDK guide covers.
A safe cutover order
- Inventory every live link, path and parameter, as above.
- Set up links on the new provider: the new domain, or the recreated paths ready for the kept domain.
- Ship an app update that lists every domain you will use in Associated Domains and intent filters. Android 14 and lower devices only re-check assetlinks.json on install or update, so this release must go out first.
- Wait for adoption of that release. How long typically depends on your release cycle and how quickly users update.
- Switch DNS (kept domain) or start publishing new links (new domain).
- Allow up to seven days for Android 15+ devices to pick up assetlinks.json changes before judging failures.
- Replace links you control: ads, emails, push, website. Ask creators and partners to update bios and placements.
- Retire the old SDK and domain only when traffic to old links has dropped to what you can accept losing.
The full switch checklist puts these steps alongside the SDK, network and SKAN work.
This short explainer on deferred deep linking defines the moving parts on both platforms.
Questions
Can two MMPs serve deep links on the same domain at once?
No. A domain serves one AASA file and one assetlinks.json file from whoever hosts it, so only one provider can answer for it at a time. Use a second domain if you need both providers live together.
How long do Android devices take to notice an assetlinks.json change?
On Android 15+, changes can take up to seven days to reach all devices. On Android 14 and lower, the file is usually re-checked only when the app is installed or updated.
What happens to my old links when the old MMP contract ends?
None of the vendors checked (Adjust, AppsFlyer, Branch, Singular) publish what happens to live links after an account ends. Assume they stop working and replace or redirect them before the end date.
Do I need to recreate every old link path?
If you keep the domain and move DNS to the new provider, yes, because the new provider does not know the old paths. If you move to a new domain, old links rely on the old provider until you replace them.
How long does it take to switch MMP?
This site's planner pencils in about 7 to 12 weeks from contract check to retiring the old setup, most of it a 2 to 4 week parallel run. No vendor publishes a standard length; your release cycle, renewal notice and ad-network learning phases set the real pace.
Can I run two MMP SDKs at the same time?
Yes, for a while. AppsFlyer and Singular both publish guides for measuring with two MMPs, but SKAN postbacks go to only one MMP, TikTok supports one MMP at a time and X Ads does not support two.
More guides
- How long does an MMP switch take?An MMP switch runs in seven phases, from contract notice to decommission. See realistic ranges, vendor renewal notice periods and ad network learning phases.
- How to run two MMP SDKs in parallelRunning two MMP SDKs in parallel lets you compare numbers before cutover. What AppsFlyer and Singular document, where it double counts, and when to stop.
- How to keep historical attribution data when you switch MMPKeep historical attribution data when you switch MMP: export windows per vendor, what each deletes after the contract ends, how to import, and warehouse tips.
- How to tell ad networks and partners you changed MMPWhat to change at Meta, Google Ads, TikTok, Snapchat, Apple Ads and with affiliates when you switch MMP, plus a notification checklist to work through.
- How to remap SKAN conversion values when you switch MMPOnly one SDK may set SKAN conversion values. How to hand over the schema, reconnect Meta and Google, and time the cutover around the 0 to 35 day windows.
- How to move off Firebase Dynamic Links after the shutdownFirebase Dynamic Links shut down on 25 August 2025 and old links now return 404. What still works, how to export link data and the replacement options.
- How to choose where to move when you leave your MMPCompare MMPs on what matters when you switch: published pricing, export limits, renewal notice and data after termination, with a ranked list and key questions.