{"id":1501,"date":"2026-06-18T13:00:00","date_gmt":"2026-06-18T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1501"},"modified":"2026-03-07T03:49:29","modified_gmt":"2026-03-07T08:49:29","slug":"seo-migration-deep-links","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/seo-migration-deep-links\/","title":{"rendered":"SEO During Deep Link Platform Migration"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Switching deep link platforms is a technical project. Switching deep link platforms without losing search rankings is a different project entirely. Your deep link URLs appear in sitemaps, structured data, internal links, and backlinks. Changing these URLs without proper redirects causes crawl errors, drops indexed pages, and breaks the connection between your web content and your app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers how to handle the SEO side of a deep link platform migration. For the general migration process, see <a href=\"https:\/\/tolinku.com\/blog\/migrating-to-tolinku\/\">migrating to Tolinku<\/a>. For domain migration specifically, see <a href=\"https:\/\/tolinku.com\/blog\/domain-migration-deep-links\/\">domain migration for deep links<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Changes During a Deep Link Migration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">URL Structure Changes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Most deep link migrations involve at least one of these URL changes:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Change Type<\/th>\n<th>Before<\/th>\n<th>After<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Domain<\/td>\n<td><code>links.oldplatform.com\/abc<\/code><\/td>\n<td><code>links.yourapp.com\/abc<\/code><\/td>\n<\/tr>\n<tr>\n<td>Path structure<\/td>\n<td><code>yourapp.com\/l\/product-123<\/code><\/td>\n<td><code>yourapp.com\/products\/product-123<\/code><\/td>\n<\/tr>\n<tr>\n<td>Both<\/td>\n<td><code>oldplatform.app.link\/xyz<\/code><\/td>\n<td><code>links.yourapp.com\/products\/xyz<\/code><\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Each change affects search engines differently. Domain changes are the most impactful because all link equity is tied to the domain.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What Search Engines Need to Reprocess<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When your deep link URLs change, Google and Apple need to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Re-crawl<\/strong> all pages that reference the old URLs (internal links, structured data, sitemaps).<\/li>\n<li><strong>Follow redirects<\/strong> from old URLs to new URLs.<\/li>\n<li><strong>Transfer link equity<\/strong> from old URLs to new URLs (this takes weeks).<\/li>\n<li><strong>Re-verify<\/strong> App Links (Android) and Universal Links (iOS) on the new domain.<\/li>\n<li><strong>Update the index<\/strong> with the new URL structure.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Pre-Migration SEO Audit<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Inventory Your Indexed URLs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before migrating, identify every URL that search engines know about:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Search Console:<\/strong> Export all indexed URLs from the Coverage report.<\/li>\n<li><strong>Sitemaps:<\/strong> List all URLs in your current sitemaps that contain deep link references.<\/li>\n<li><strong>Backlinks:<\/strong> Use a backlink checker to find external sites linking to your deep link URLs.<\/li>\n<li><strong>Internal links:<\/strong> Search your website content for references to your current deep link domain.<\/li>\n<li><strong>Structured data:<\/strong> Find all <code>potentialAction<\/code> targets, <code>url<\/code> fields, and <code>target<\/code> URLs in your JSON-LD.<\/li>\n<\/ol>\n\n\n\n<pre><code class=\"language-bash\"># Find all internal references to the old deep link domain\ngrep -r &quot;links.oldplatform.com&quot; .\/content\/ .\/templates\/ .\/components\/\ngrep -r &quot;oldplatform.app.link&quot; .\/content\/ .\/templates\/ .\/components\/\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Baseline Your Rankings<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Record your current search performance before the migration:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Keyword rankings<\/strong> for all terms where deep link pages rank.<\/li>\n<li><strong>Organic traffic<\/strong> to pages that contain deep links.<\/li>\n<li><strong>Impressions and clicks<\/strong> from Search Console for affected URLs.<\/li>\n<li><strong>Core Web Vitals<\/strong> scores for key landing pages.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You will compare these numbers post-migration to detect regressions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Redirect Strategy<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">301 Redirects (Not 302)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Status\/301\" rel=\"nofollow noopener\" target=\"_blank\">301 (permanent) redirects<\/a>, not 302 (temporary). Google treats 301 redirects as a signal to transfer link equity to the new URL. A 302 tells Google the old URL is still the canonical, which defeats the purpose.<\/p>\n\n\n\n<pre><code class=\"language-nginx\"># Nginx: redirect old deep link domain to new domain\nserver {\n    server_name links.oldplatform.com;\n\n    location \/ {\n        return 301 https:\/\/links.yourapp.com$request_uri;\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Redirect Mapping<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a complete redirect map before migrating:<\/p>\n\n\n\n<pre><code># redirect-map.csv\nold_url,new_url\nhttps:\/\/links.oldplatform.com\/product\/123,https:\/\/links.yourapp.com\/products\/123\nhttps:\/\/links.oldplatform.com\/category\/shoes,https:\/\/links.yourapp.com\/categories\/shoes\nhttps:\/\/links.oldplatform.com\/promo\/summer,https:\/\/links.yourapp.com\/campaigns\/summer\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For large sites, generate this programmatically:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">const oldLinks = await getOldPlatformLinks(); \/\/ from old platform export\nconst redirectMap = oldLinks.map(link =&gt; ({\n  old: link.url,\n  new: buildNewUrl(link.path, link.metadata)\n}));\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Redirect Chain Prevention<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid redirect chains (old URL redirects to intermediate URL which redirects to final URL). Each hop in a redirect chain loses some link equity and slows crawling:<\/p>\n\n\n\n<pre><code>Bad:  old.com\/abc \u2192 redirect-service.com\/abc \u2192 new.com\/abc  (2 hops)\nGood: old.com\/abc \u2192 new.com\/abc  (1 hop)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If your old deep link platform already had redirects, ensure you map directly to the final destination URL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sitemap Updates<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Timing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Update your sitemaps as part of the migration cutover:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Before migration:<\/strong> Sitemaps contain old URLs.<\/li>\n<li><strong>At cutover:<\/strong> Update sitemaps to contain new URLs only.<\/li>\n<li><strong>After migration:<\/strong> Submit updated sitemaps to <a href=\"https:\/\/search.google.com\/search-console\" rel=\"nofollow noopener\" target=\"_blank\">Search Console<\/a>.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Sitemap Structure for Deep Link Pages<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Include <a href=\"https:\/\/developers.google.com\/search\/docs\/specialty\/international\/localized-versions#sitemap\" rel=\"nofollow noopener\" target=\"_blank\">xhtml:link<\/a> annotations if your deep links have app-specific alternates:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;urlset xmlns=&quot;http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9&quot;\n        xmlns:xhtml=&quot;http:\/\/www.w3.org\/1999\/xhtml&quot;&gt;\n  &lt;url&gt;\n    &lt;loc&gt;https:\/\/links.yourapp.com\/products\/123&lt;\/loc&gt;\n    &lt;lastmod&gt;2026-06-18&lt;\/lastmod&gt;\n    &lt;changefreq&gt;weekly&lt;\/changefreq&gt;\n    &lt;xhtml:link rel=&quot;alternate&quot; href=&quot;android-app:\/\/com.yourapp\/https\/links.yourapp.com\/products\/123&quot; \/&gt;\n  &lt;\/url&gt;\n&lt;\/urlset&gt;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">IndexNow<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If your site supports <a href=\"https:\/\/www.indexnow.org\/\" rel=\"nofollow noopener\" target=\"_blank\">IndexNow<\/a>, submit the new URLs immediately after migration. This tells search engines to re-crawl the affected pages faster than waiting for the normal crawl cycle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Structured Data Updates<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Update All URL References<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Search your structured data for any reference to the old deep link domain:<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;!-- Before migration --&gt;\n&lt;script type=&quot;application\/ld+json&quot;&gt;\n{\n  &quot;@context&quot;: &quot;https:\/\/schema.org&quot;,\n  &quot;@type&quot;: &quot;Product&quot;,\n  &quot;name&quot;: &quot;Running Shoes&quot;,\n  &quot;potentialAction&quot;: {\n    &quot;@type&quot;: &quot;ViewAction&quot;,\n    &quot;target&quot;: &quot;https:\/\/links.oldplatform.com\/products\/running-shoes&quot;\n  }\n}\n&lt;\/script&gt;\n\n&lt;!-- After migration --&gt;\n&lt;script type=&quot;application\/ld+json&quot;&gt;\n{\n  &quot;@context&quot;: &quot;https:\/\/schema.org&quot;,\n  &quot;@type&quot;: &quot;Product&quot;,\n  &quot;name&quot;: &quot;Running Shoes&quot;,\n  &quot;potentialAction&quot;: {\n    &quot;@type&quot;: &quot;ViewAction&quot;,\n    &quot;target&quot;: &quot;https:\/\/links.yourapp.com\/products\/running-shoes&quot;\n  }\n}\n&lt;\/script&gt;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Verify with Rich Results Test<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After updating structured data, test with <a href=\"https:\/\/search.google.com\/test\/rich-results\" rel=\"nofollow noopener\" target=\"_blank\">Google&#39;s Rich Results Test<\/a> to confirm the new URLs are valid and the structured data is still correct.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">App Links and Universal Links Verification<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Timeline Overlap<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">During migration, both old and new domains need to serve valid verification files:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Android:<\/strong> Both domains need valid <code>\/.well-known\/assetlinks.json<\/code> files.<\/li>\n<li><strong>iOS:<\/strong> Both domains need valid <code>\/.well-known\/apple-app-site-association<\/code> files.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the old domain&#39;s verification files active for at least 30 days after migration. Google and Apple cache these files, and removing them too early can break app opening for users who have not updated their apps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification File on New Domain<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure your new deep link domain serves the correct verification files before going live:<\/p>\n\n\n\n<pre><code class=\"language-json\">\/\/ \/.well-known\/assetlinks.json (Android)\n[{\n  &quot;relation&quot;: [&quot;delegate_permission\/common.handle_all_urls&quot;],\n  &quot;target&quot;: {\n    &quot;namespace&quot;: &quot;android_app&quot;,\n    &quot;package_name&quot;: &quot;com.yourapp&quot;,\n    &quot;sha256_cert_fingerprints&quot;: [&quot;YOUR_SHA256_FINGERPRINT&quot;]\n  }\n}]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For verification file setup, see <a href=\"https:\/\/tolinku.com\/docs\/concepts\/deep-linking\/\">Tolinku deep linking docs<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Internal Link Updates<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Find and Replace<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Update all internal links across your site:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Blog posts referencing deep link URLs.<\/li>\n<li>Navigation links.<\/li>\n<li>Footer links.<\/li>\n<li>Email templates.<\/li>\n<li>Help center articles.<\/li>\n<li>API documentation examples.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Smart Banner Updates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you use <a href=\"https:\/\/tolinku.com\/features\/smart-banners\">smart banners<\/a>, update the deep link URLs in your banner configuration. Smart banners that point to the old domain will still work if redirects are in place, but direct links to the new domain are faster and avoid the redirect hop.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Post-Migration Monitoring<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Week 1<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check Search Console for crawl errors on the old domain.<\/li>\n<li>Verify that 301 redirects are working (test a sample of old URLs).<\/li>\n<li>Monitor organic traffic for any sudden drops.<\/li>\n<li>Confirm that new URLs are being indexed (Search Console Coverage report).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Week 2-4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compare keyword rankings to your pre-migration baseline.<\/li>\n<li>Monitor the index status of new URLs (they should be growing).<\/li>\n<li>Check for any remaining references to old URLs in Search Console.<\/li>\n<li>Verify that backlinks are passing equity through redirects.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Month 2-3<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Organic traffic should return to pre-migration levels (or improve if the new URL structure is better).<\/li>\n<li>Old URLs should show as &quot;Redirected&quot; in Search Console, not &quot;Not found.&quot;<\/li>\n<li>New URLs should be fully indexed and ranking.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku Migration SEO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> supports custom domain deep links, which means your deep link URLs use your own domain (e.g., <code>links.yourapp.com<\/code>) rather than a third-party domain. This makes future migrations simpler because you control the domain and its redirects. Configure your domain in the <a href=\"https:\/\/tolinku.com\/docs\/migrations\/from-branch\/\">Tolinku dashboard<\/a> and set up verification files for both platforms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the complete migration process, see <a href=\"https:\/\/tolinku.com\/blog\/migrating-to-tolinku\/\">migrating to Tolinku<\/a>. For the broader app indexing strategy, see <a href=\"https:\/\/tolinku.com\/blog\/app-indexing-seo-mobile-apps\/\">app indexing and SEO for mobile apps<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Preserve SEO rankings during deep link migration. Handle URL redirects, update sitemaps, and maintain search visibility through the transition.<\/p>\n","protected":false},"author":2,"featured_media":1500,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"SEO During Deep Link Platform Migration","rank_math_description":"Preserve SEO rankings during deep link migration. Handle URL redirects, update sitemaps, and maintain search visibility through the transition.","rank_math_focus_keyword":"SEO migration deep links","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-seo-migration-deep-links.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-seo-migration-deep-links.png","footnotes":""},"categories":[16],"tags":[20,52,69,88,376,63,352],"class_list":["post-1501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-marketing","tag-deep-linking","tag-migration","tag-mobile-development","tag-redirects","tag-search-rankings","tag-seo","tag-url-structure"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1501","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=1501"}],"version-history":[{"count":4,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1501\/revisions"}],"predecessor-version":[{"id":2617,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1501\/revisions\/2617"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1500"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}