{"id":872,"date":"2026-04-21T17:00:00","date_gmt":"2026-04-21T22:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=872"},"modified":"2026-03-07T03:48:30","modified_gmt":"2026-03-07T08:48:30","slug":"link-redirect-during-migration","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/link-redirect-during-migration\/","title":{"rendered":"Link Redirects During Migration: Zero-Downtime Strategy"},"content":{"rendered":"\n<p>The scariest part of migrating deep linking platforms is breaking existing links. Links are everywhere: in sent emails, printed materials, social media posts, ad campaigns, and partner integrations. Breaking any of them means lost users, broken attribution, and a support inbox full of complaints.<\/p>\n\n\n\n<p>This guide covers strategies for maintaining link continuity during a migration, from parallel running to DNS cutover techniques.<\/p>\n\n\n\n<p>For the general migration guide, see <a href=\"https:\/\/tolinku.com\/blog\/migrating-to-tolinku\/\">Migrating to Tolinku from Branch, Firebase, and AppsFlyer<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding the Risk<\/h2>\n\n\n\n<p>When you migrate deep linking platforms, you&#39;re changing where links resolve. A link that previously pointed to Platform A&#39;s servers now needs to point to Platform B&#39;s servers. The risk depends on which domain your links use.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vendor-Owned Domains<\/h3>\n\n\n\n<p>If your links use a vendor-owned domain (like <code>yourapp.app.link<\/code> for Branch, <code>yourapp.page.link<\/code> for Firebase, or <code>yourapp.onelink.me<\/code> for AppsFlyer), you have no control over the DNS. These links can only be served by the vendor that owns the domain.<\/p>\n\n\n\n<p><strong>Impact<\/strong>: These links will continue working as long as you maintain your account with the old vendor. They can never be transferred to a new platform.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Custom Domains<\/h3>\n\n\n\n<p>If your links use a custom domain you own (like <code>go.yourapp.com<\/code>), you control the DNS. You can point the domain to any server by updating your CNAME or A record.<\/p>\n\n\n\n<p><strong>Impact<\/strong>: These links can be migrated with zero downtime if done correctly. This is why using your own domain is always recommended.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Strategy 1: Parallel Running (Recommended)<\/h2>\n\n\n\n<p>The safest approach is running both platforms simultaneously during the transition.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How It Works<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Set up the new platform with a different subdomain (e.g., <code>links.yourapp.com<\/code> while the old platform uses <code>go.yourapp.com<\/code>)<\/li>\n<li>All new links use the new subdomain<\/li>\n<li>Existing links continue to resolve through the old platform<\/li>\n<li>Gradually, as old links age out of active use, traffic on the old platform decreases<\/li>\n<li>When traffic on the old platform is negligible, deactivate it<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Timeline<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Week 1-2<\/strong>: Set up new platform, create routes, integrate SDK<\/li>\n<li><strong>Week 3<\/strong>: Begin using new platform for all new campaigns<\/li>\n<li><strong>Week 4-8<\/strong>: Parallel running period<\/li>\n<li><strong>Week 8+<\/strong>: Evaluate old platform traffic; if minimal, deactivate<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zero risk of breaking existing links<\/li>\n<li>Gradual transition with no hard cutover<\/li>\n<li>Can fall back to old platform if issues arise<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Maintaining two platforms costs money (two subscriptions during overlap)<\/li>\n<li>Users may see two different domains for your app&#39;s links<\/li>\n<li>Some link management complexity during the transition<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Strategy 2: DNS Cutover<\/h2>\n\n\n\n<p>If you want to use the same custom domain on the new platform, you need to switch DNS from the old platform to the new one.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pre-Cutover Preparation<\/h3>\n\n\n\n<p><strong>1. Recreate all routes<\/strong>: Every link path that exists on the old platform must be recreated on the new platform with identical paths. If <code>go.yourapp.com\/summer-sale<\/code> exists on Platform A, create a route for <code>\/summer-sale<\/code> on Platform B.<\/p>\n\n\n\n<p><strong>2. Lower TTL<\/strong>: 24-48 hours before the cutover, lower your DNS TTL to 60 seconds. This ensures the DNS change propagates quickly once you make it.<\/p>\n\n\n\n<pre><code># Check current TTL\ndig go.yourapp.com CNAME +short\n\n# Lower TTL to 60 seconds in your DNS provider\n<\/code><\/pre>\n\n\n\n<p><strong>3. Prepare the CNAME change<\/strong>: Have the new CNAME value ready to paste into your DNS provider.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cutover Process<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Final route audit<\/strong>: Verify every route on the new platform matches the old platform<\/li>\n<li><strong>Update the CNAME record<\/strong>: Change from old platform&#39;s target to new platform&#39;s target<\/li>\n<li><strong>Wait for propagation<\/strong>: With a 60-second TTL, this should take 1-5 minutes<\/li>\n<li><strong>Verify SSL<\/strong>: The new platform needs to provision an SSL certificate for your domain. This usually happens automatically within minutes.<\/li>\n<li><strong>Test critical links<\/strong>: Click your most important links and verify they resolve correctly<\/li>\n<li><strong>Monitor<\/strong>: Watch for any issues in real-time<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Post-Cutover<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Raise TTL back to 3600 or higher (after confirming everything works)<\/li>\n<li>Monitor analytics for any traffic drop<\/li>\n<li>Keep the old platform account active for 1-2 weeks (just in case you need to switch back)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Downtime Window<\/h3>\n\n\n\n<p>With proper preparation, the actual downtime window is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DNS propagation time<\/strong>: 1-5 minutes (with low TTL)<\/li>\n<li><strong>SSL provisioning time<\/strong>: 1-10 minutes (usually automatic)<\/li>\n<li><strong>Total potential downtime<\/strong>: 2-15 minutes<\/li>\n<\/ul>\n\n\n\n<p>During this window, some users may see an SSL error or a temporary error page. For most apps, this is acceptable, especially if you do the cutover during low-traffic hours.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Strategy 3: Redirect Server<\/h2>\n\n\n\n<p>For teams that need zero downtime and handle very high link volumes, a redirect server provides the most control.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How It Works<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Point your custom domain to your own redirect server (a simple web server you control)<\/li>\n<li>The redirect server receives link clicks and forwards them to the active platform<\/li>\n<li>During migration, update the redirect server to forward to the new platform<\/li>\n<li>No DNS changes needed (your domain always points to your server)<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Implementation<\/h3>\n\n\n\n<p>A basic redirect server can be as simple as an Nginx config:<\/p>\n\n\n\n<pre><code class=\"language-nginx\"># During migration: forward to new platform\nserver {\n    listen 443 ssl;\n    server_name go.yourapp.com;\n\n    location \/ {\n        proxy_pass https:\/\/link.tolinku.com;\n        proxy_set_header Host go.yourapp.com;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Complete control over the redirect<\/li>\n<li>Zero DNS propagation delay<\/li>\n<li>Can route different paths to different platforms (gradual per-path migration)<\/li>\n<li>Can add logging and monitoring at the redirect layer<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Additional infrastructure to maintain<\/li>\n<li>Your server becomes a single point of failure<\/li>\n<li>May add latency to link resolution<\/li>\n<li>Need to handle SSL certificates on your server<\/li>\n<li>Need to serve AASA and assetlinks.json files correctly for Universal Links \/ App Links<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Handling Links That Can&#39;t Be Migrated<\/h2>\n\n\n\n<p>Some links can&#39;t be redirected regardless of your strategy:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vendor Domain Links<\/h3>\n\n\n\n<p>Links on domains you don&#39;t own (<code>app.link<\/code>, <code>page.link<\/code>, <code>onelink.me<\/code>) stay with the vendor. Your only options:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep the old vendor account active (just for link resolution)<\/li>\n<li>Accept that these links will eventually break<\/li>\n<li>Contact the vendor about link forwarding options (some offer this as a paid service)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Printed QR Codes<\/h3>\n\n\n\n<p>QR codes on physical materials are permanent. If they point to your old platform&#39;s domain:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If it&#39;s your custom domain, the DNS cutover covers them<\/li>\n<li>If it&#39;s the vendor&#39;s domain, they&#39;ll break when you deactivate the old account<\/li>\n<li>For future materials, always use your own custom domain<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cached Social Media Posts<\/h3>\n\n\n\n<p>Social media platforms cache link previews. After migration, the cached previews may show outdated OG metadata. You can flush caches manually:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Facebook: Use the <a href=\"https:\/\/developers.facebook.com\/tools\/debug\/\" rel=\"nofollow noopener\" target=\"_blank\">Sharing Debugger<\/a><\/li>\n<li>Twitter: Use the <a href=\"https:\/\/cards-dev.twitter.com\/validator\" rel=\"nofollow noopener\" target=\"_blank\">Card Validator<\/a><\/li>\n<li>LinkedIn: Use the <a href=\"https:\/\/www.linkedin.com\/post-inspector\/\" rel=\"nofollow noopener\" target=\"_blank\">Post Inspector<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Testing After Migration<\/h2>\n\n\n\n<p>After any migration strategy, verify:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Click resolution<\/strong>: Links resolve to the correct destination<\/li>\n<li><strong>Deep link routing<\/strong>: App opens to the correct screen (not just the home screen)<\/li>\n<li><strong>Deferred deep linking<\/strong>: New installs receive the link context<\/li>\n<li><strong>Web fallback<\/strong>: Users without the app reach the correct web page<\/li>\n<li><strong>Universal Links \/ App Links<\/strong>: AASA and assetlinks.json files are served correctly from the new domain<\/li>\n<li><strong>OG previews<\/strong>: Social media previews render correctly<\/li>\n<li><strong>Analytics<\/strong>: Clicks are tracked in the new platform&#39;s dashboard<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Key Takeaway<\/h2>\n\n\n\n<p>The single most important thing you can do for future migration safety: <strong>always use your own custom domain for links<\/strong>. Your domain is the one piece of the deep linking stack that you fully control. Platforms come and go; your domain stays.<\/p>\n\n\n\n<p>For the complete migration checklist, see <a href=\"https:\/\/tolinku.com\/blog\/deep-linking-migration-checklist\/\">Deep Linking Migration Checklist: 30 Steps<\/a>. For platform-specific guides, see <a href=\"https:\/\/tolinku.com\/blog\/migrating-to-tolinku\/\">Migrating to Tolinku from Branch, Firebase, and AppsFlyer<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Migrate deep linking platforms without breaking existing links. Learn redirect strategies, DNS cutover techniques, and parallel running approaches.<\/p>\n","protected":false},"author":2,"featured_media":871,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Link Redirects During Migration: Zero-Downtime Strategy","rank_math_description":"Migrate deep linking platforms without breaking existing links. Learn redirect strategies, DNS cutover techniques, and parallel running approaches.","rank_math_focus_keyword":"link redirects during migration","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-link-redirect-during-migration.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-link-redirect-during-migration.png","footnotes":""},"categories":[17],"tags":[157,20,168,52,49],"class_list":["post-872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comparisons","tag-custom-domains","tag-deep-linking","tag-dns","tag-migration","tag-short-links"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=872"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/872\/revisions"}],"predecessor-version":[{"id":2517,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/872\/revisions\/2517"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/871"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}