Skip to content
Tolinku
Tolinku
Sign In Start Free
Comparisons · · 6 min read

Migration Risk Mitigation: Avoiding Pitfalls

By Tolinku Staff
|
Tolinku platform comparisons dashboard screenshot for comparisons blog posts

Deep linking platform migration carries real risk. Links that millions of users rely on can break. Attribution data that drives marketing spend decisions can be lost. App verification that took weeks to set up can fail silently. The stakes are high because deep links touch every part of the user acquisition and engagement funnel.

This guide identifies the most common migration pitfalls and provides concrete mitigation strategies. For the overall timeline, see migration timeline planning. For analytics continuity, see analytics data migration.

The Problem

Your existing links (in emails, QR codes, social posts, ad campaigns, partner websites, print materials) point to the old platform's domain. When you switch platforms, those links stop working unless you set up redirects.

Mitigation

Set up redirects before migration:

If the old platform supports redirect rules, configure a catch-all redirect to the new platform:

Old link: https://old-platform.link/abc123
  → Redirect to: https://new-platform.link/equivalent-route

Use your own domain:

If your deep links use a custom domain (e.g., links.yourapp.com), you control the DNS. Point the domain to the new platform's servers. The links continue to work with no changes needed:

Before: links.yourapp.com → old platform servers
After:  links.yourapp.com → new platform servers (Tolinku)

This is the strongest mitigation. If you are not already using a custom domain for your deep links, set one up on the new platform. It makes future migrations trivial.

Audit high-traffic links:

Not all links are equal. Identify the links with the most traffic and ensure they work on the new platform first:

// Export top links by click volume from old platform
const topLinks = await oldPlatform.getLinks({ orderBy: 'clicks', limit: 100 });
for (const link of topLinks) {
  await verifyRedirect(link.url, expectedDestination);
}

Rollback Plan

If links break during migration:

  1. Revert DNS for your custom domain to the old platform.
  2. This restores all existing links immediately (DNS propagation aside).
  3. Investigate and fix the issue on the new platform before trying again.

Risk 2: Broken App Verification

The Problem

App Links (Android) and Universal Links (iOS) require verification files hosted on your domain:

  • /.well-known/assetlinks.json (Android)
  • /.well-known/apple-app-site-association (iOS)

If these files are not served correctly during or after migration, deep links stop opening the app and fall back to the browser.

Mitigation

Verify before switching:

Before pointing your domain to the new platform, verify that the new platform serves the correct verification files:

# Test the new platform's verification files (before DNS switch)
curl -I https://new-platform-staging.com/.well-known/assetlinks.json
curl -I https://new-platform-staging.com/.well-known/apple-app-site-association

Verify:

  • HTTP 200 status code
  • Correct Content-Type header (application/json)
  • File contains your app's package name / bundle ID
  • File contains your signing certificates

Keep the old files accessible during transition:

If the new platform serves the verification files, ensure they include all the same app identifiers as the old files. Missing a single SHA-256 fingerprint or Team ID will break verification.

Monitor after switching:

Set up monitoring that checks the verification files hourly for the first week after migration:

# Simple monitoring script
curl -s https://links.yourapp.com/.well-known/assetlinks.json | \
  jq '.[].target.package_name' | \
  grep -q 'com.yourapp.android' || alert "assetlinks.json missing package name"

Rollback Plan

If verification breaks:

  1. Manually serve the correct verification files from your web server (override the platform).
  2. Apple caches apple-app-site-association for up to 24 hours. Android re-verifies periodically.
  3. On Android, you can force re-verification: adb shell pm verify-app-links --re-verify com.yourapp.android

Risk 3: Lost Attribution During Transition

The Problem

During migration, some users are on the old SDK and some are on the new SDK. Install attributions may be:

  • Counted by both platforms (double-counting).
  • Counted by neither platform (undercounting).
  • Attributed to the wrong campaign (misattribution).

Mitigation

Run both SDKs in parallel during rollout:

class AnalyticsManager {
    private val oldSDK = OldPlatformSDK()
    private val newSDK = NewPlatformSDK()

    fun trackInstall(attributes: Map<String, String>) {
        oldSDK.trackInstall(attributes)
        newSDK.trackInstall(attributes)
    }

    fun trackEvent(name: String, properties: Map<String, Any>) {
        oldSDK.trackEvent(name, properties)
        newSDK.trackEvent(name, properties)
    }
}

Establish baselines:

Record key metrics from the old platform for the 30 days before migration. Compare with the new platform's numbers during and after migration. A 5-10% variance is normal; larger variances indicate a configuration issue.

Use a single source of truth:

If you track conversions in a third-party analytics platform (Google Analytics, Amplitude), use that as the source of truth during migration. Both deep linking platforms feed into it, and the third-party platform de-duplicates.

Risk 4: SDK Conflicts

The Problem

Running two deep linking SDKs simultaneously can cause conflicts:

  • Both SDKs try to handle incoming deep links.
  • Both SDKs intercept the same system callbacks (AppDelegate methods, intent handlers).
  • Both SDKs try to register for the same URL schemes.

Mitigation

Configure SDK initialization order:

Initialize the new SDK first, then the old SDK in a read-only/passive mode:

// iOS: initialize new SDK first
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // New SDK handles all deep link routing
    TolinkuSDK.initialize(config: tolinkuConfig)

    // Old SDK: disable deep link handling, enable attribution only
    OldSDK.configure(handleDeepLinks: false, trackAttribution: true)

    return true
}

Isolate URL handling:

On iOS, use the new SDK's callback for Universal Links and the old SDK's callback for attribution only:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    // New SDK handles the deep link
    if TolinkuSDK.handleUniversalLink(userActivity) {
        return true
    }

    // Fallback: old SDK for backward compatibility
    return OldSDK.handleUniversalLink(userActivity)
}

Risk 5: Performance Regression

The Problem

The new SDK might affect app startup time, memory usage, or network performance differently than the old one.

Mitigation

Benchmark before and after:

// Measure SDK initialization time
val startTime = System.currentTimeMillis()
NewSDK.initialize(this)
val initTime = System.currentTimeMillis() - startTime
Log.d("Migration", "New SDK init time: ${initTime}ms")

Compare with the old SDK's initialization time. A difference of 50-100ms is acceptable. More than 200ms warrants investigation.

Monitor crash rates:

After the staged rollout begins, compare crash rates between users on the old SDK and users on the new SDK. Use your crash reporting tool (Firebase Crashlytics, Sentry) to segment by app version.

Risk 6: Domain and DNS Issues

The Problem

Changing DNS records for your custom link domain can cause:

  • Downtime during DNS propagation (up to 48 hours).
  • SSL certificate issues if the new platform does not have certificates ready.
  • CDN cache serving old content.

Mitigation

Lower TTL before migration:

Reduce your DNS TTL to 60-300 seconds at least 48 hours before the migration. This ensures DNS caches expire quickly when you make the switch.

Pre-provision SSL certificates:

Ensure the new platform has valid SSL certificates for your custom domain before switching DNS. If using Let's Encrypt, the platform needs to verify domain ownership first.

Test with a subdomain first:

Before migrating links.yourapp.com, test the new platform with a temporary subdomain like links-new.yourapp.com. Verify everything works, then switch the main domain.

Migration Checklist

Before going live:

  • Verification files (assetlinks.json, apple-app-site-association) serve correctly from the new platform
  • All high-traffic links redirect or resolve correctly
  • Deep links open the app on both iOS and Android (test on physical devices)
  • Deferred deep linking works (click, install, verify routing)
  • Smart banners display and link correctly
  • Analytics events appear in the new platform's dashboard
  • Crash rates are stable after SDK update
  • Rollback plan is documented and tested
  • Marketing team is briefed on timeline and changes
  • Customer support is briefed on potential issues

Tolinku Migration Support

Tolinku supports custom domains with automatic SSL provisioning and verification file hosting. The Tolinku dashboard provides route configuration, domain management, and real-time analytics to validate your migration.

For the migration timeline, see migration timeline planning. For parallel running, see parallel running during migration. For domain-specific migration, see domain migration for deep links.

Get deep linking tips in your inbox

One email per week. No spam.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.