{"id":1591,"date":"2026-06-27T13:00:00","date_gmt":"2026-06-27T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1591"},"modified":"2026-03-07T03:49:39","modified_gmt":"2026-03-07T08:49:39","slug":"amp-and-deep-linking","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/amp-and-deep-linking\/","title":{"rendered":"AMP and Deep Linking: Current State and Future"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">AMP (Accelerated Mobile Pages) changed how mobile web content was served, and those changes created specific challenges for deep linking. AMP pages are served from Google&#39;s cache at <code>cdn.ampproject.org<\/code> or via the AMP viewer in Google Search. This means the URL a user sees is not your domain, which breaks Universal Links and App Links that depend on domain verification.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers the current state of AMP and deep linking, what has changed since Google de-prioritized AMP, and how to handle AMP-to-app transitions. For broader deep linking standards, see <a href=\"https:\/\/tolinku.com\/blog\/deep-linking-standards-2026\/\">deep linking standards in 2026<\/a>. For the future of mobile deep linking, see <a href=\"https:\/\/tolinku.com\/blog\/future-mobile-deep-linking\/\">the future of mobile deep linking<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How AMP Broke Deep Linking<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">The URL Problem<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When Google served AMP pages, the URL in the browser was not your domain:<\/p>\n\n\n\n<pre><code>Your URL:    https:\/\/yoursite.com\/article\/summer-deals\nAMP Cache:   https:\/\/cdn.ampproject.org\/c\/s\/yoursite.com\/article\/summer-deals\nAMP Viewer:  https:\/\/www.google.com\/amp\/s\/yoursite.com\/article\/summer-deals\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Universal Links and App Links verify the domain. If the user is on <code>cdn.ampproject.org<\/code> or <code>google.com\/amp\/<\/code>, your app&#39;s domain verification does not match, and the OS will not open your app.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Referrer Problem<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When a user tapped a link on an AMP page, the HTTP referrer was <code>cdn.ampproject.org<\/code> or <code>google.com<\/code>, not your original page. This broke:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Attribution:<\/strong> Analytics could not tie the click back to your content.<\/li>\n<li><strong>Deferred deep linking:<\/strong> The referrer chain was lost, making post-install routing less reliable.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The JavaScript Problem<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">AMP restricted JavaScript execution. Custom deep linking scripts (checking if the app is installed, attempting a custom scheme redirect) did not work in AMP pages. Only standard <code>&lt;a&gt;<\/code> tags with simple href attributes were allowed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Google&#39;s AMP Pivot<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Signed Exchanges<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In 2021, Google introduced <a href=\"https:\/\/developer.chrome.com\/docs\/web\/sxg\" rel=\"nofollow noopener\" target=\"_blank\">Signed HTTP Exchanges (SXG)<\/a> as an alternative to the AMP cache. With SXG, your content is cryptographically signed and served from Google&#39;s cache, but the browser shows your original URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This solved the deep linking URL problem: since the browser displays your domain, Universal Links and App Links work correctly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Core Web Vitals as the Ranking Signal<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Google <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/page-experience\" rel=\"nofollow noopener\" target=\"_blank\">announced<\/a> that Core Web Vitals (LCP, FID, CLS), not AMP specifically, would be the ranking signal for mobile search. This means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You do not need AMP to rank well in mobile search.<\/li>\n<li>Fast, well-optimized regular pages get the same treatment.<\/li>\n<li>The &quot;AMP badge&quot; in search results is gone.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Current AMP Status<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">AMP is still maintained as an <a href=\"https:\/\/amp.dev\/\" rel=\"nofollow noopener\" target=\"_blank\">open-source framework<\/a>, but its role has diminished:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Google Search:<\/strong> AMP is no longer required for the Top Stories carousel.<\/li>\n<li><strong>Google News:<\/strong> AMP is no longer required for Google News inclusion.<\/li>\n<li><strong>Email:<\/strong> AMP for Email remains active in Gmail.<\/li>\n<li><strong>Ads:<\/strong> AMP for Ads (AMPHTML ads) are still used in some ad networks.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Most publishers who adopted AMP for SEO benefits are migrating away from it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deep Linking on AMP Pages (If You Still Use Them)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Standard Links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest approach: use standard <code>&lt;a&gt;<\/code> tags with your domain URL.<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;a href=&quot;https:\/\/yoursite.com\/products\/shoes&quot;&gt;View in App&lt;\/a&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When the user taps this link, the browser navigates to your domain. If your Universal Link or App Link is configured correctly, the OS intercepts the navigation and opens the app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The limitation: this requires a full page navigation away from the AMP page.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">amp-smart-links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/amp.dev\/documentation\/components\/amp-smartlinks\/\" rel=\"nofollow noopener\" target=\"_blank\"><code>amp-smartlinks<\/code><\/a> component was designed for affiliate link monetization, but the pattern is relevant: it rewrites links on the page to go through a redirect service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For deep linking, a similar pattern works:<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;a href=&quot;https:\/\/links.yoursite.com\/products\/shoes&quot;&gt;View Product&lt;\/a&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Using a dedicated link domain (like <code>links.yoursite.com<\/code>) that is configured for Universal Links \/ App Links ensures the link opens the app regardless of where the AMP page is served from.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">App Banners on AMP Pages<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apple&#39;s native Smart App Banner works on AMP pages:<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;meta name=&quot;apple-itunes-app&quot; content=&quot;app-id=123456789, app-argument=yourapp:\/\/products\/shoes&quot;&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For custom banners, AMP provides the <a href=\"https:\/\/amp.dev\/documentation\/components\/amp-app-banner\/\" rel=\"nofollow noopener\" target=\"_blank\"><code>amp-app-banner<\/code><\/a> component:<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;amp-app-banner layout=&quot;nodisplay&quot; id=&quot;app-banner&quot;&gt;\n  &lt;button on=&quot;tap:app-banner.dismiss&quot;&gt;Close&lt;\/button&gt;\n  &lt;a href=&quot;https:\/\/play.google.com\/store\/apps\/details?id=com.yourapp&quot;&gt;\n    Install the App\n  &lt;\/a&gt;\n&lt;\/amp-app-banner&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This component handles platform detection and remembers dismissals.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migrating Away from AMP<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Preserving Deep Link Behavior<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When migrating from AMP to standard pages:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><p><strong>Keep the same URL structure.<\/strong> If your AMP pages used <code>\/article\/summer-deals<\/code>, your standard pages should use the same path. This ensures existing deep links continue to work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Set up redirects from AMP URLs.<\/strong> If you had standalone AMP pages at <code>\/amp\/article\/summer-deals<\/code>, redirect them:<\/p>\n\n\n\n<pre><code>\/amp\/article\/summer-deals \u2192 \/article\/summer-deals (301)\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><p><strong>Update the AMP cache.<\/strong> Google&#39;s AMP cache updates automatically when it re-crawls your page. You can also use the <a href=\"https:\/\/developers.google.com\/amp\/cache\/update-cache\" rel=\"nofollow noopener\" target=\"_blank\">AMP Cache Update API<\/a> to request immediate updates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Add deep linking JavaScript.<\/strong> Standard pages have no JavaScript restrictions. You can now add proper deep linking detection, smart banners, and deferred deep linking scripts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Performance After AMP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">AMP pages were fast because of strict resource constraints. When migrating, ensure your standard pages maintain performance:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep Largest Contentful Paint (LCP) under 2.5 seconds.<\/li>\n<li>Keep Cumulative Layout Shift (CLS) under 0.1.<\/li>\n<li>Keep Interaction to Next Paint (INP) under 200ms.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Google&#39;s <a href=\"https:\/\/pagespeed.web.dev\/\" rel=\"nofollow noopener\" target=\"_blank\">PageSpeed Insights<\/a> measures these metrics. Good Core Web Vitals mean your standard pages rank just as well as AMP pages did.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deep Linking Alternatives to AMP<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Instant Articles and Native Content<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Facebook Instant Articles had similar deep linking challenges (content served from Facebook&#39;s domain, not yours). Meta <a href=\"https:\/\/www.facebook.com\/formedia\/blog\/sunsetting-instant-articles\" rel=\"nofollow noopener\" target=\"_blank\">deprecated Instant Articles in 2023<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apple News also serves content from Apple&#39;s domain, but supports Universal Links within article content.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Progressive Web Apps (PWAs)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">PWAs serve content from your domain, so Universal Links and App Links work natively. If you adopted AMP for performance, PWA techniques (service workers, preloading, lazy loading) achieve similar performance without the deep linking complications.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Server-Side Rendering<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Modern frameworks (Next.js, Nuxt, Remix) produce fast server-rendered pages from your domain. These work seamlessly with deep linking because:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The URL is your domain (Universal Links \/ App Links work).<\/li>\n<li>Full JavaScript is available (smart banners, deferred deep linking).<\/li>\n<li>Performance can match or exceed AMP with proper optimization.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Handling AMP URLs in Analytics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you historically received traffic from AMP pages, your analytics may contain AMP-format URLs. Normalize them:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function normalizeAmpUrl(url) {\n  \/\/ Remove AMP cache prefix\n  const ampCachePattern = \/^https:\\\/\\\/cdn\\.ampproject\\.org\\\/c\\\/s\\\/\/;\n  const ampViewerPattern = \/^https:\\\/\\\/www\\.google\\.com\\\/amp\\\/s\\\/\/;\n\n  let normalized = url\n    .replace(ampCachePattern, &#39;https:\/\/&#39;)\n    .replace(ampViewerPattern, &#39;https:\/\/&#39;);\n\n  \/\/ Remove AMP suffix if present\n  normalized = normalized.replace(\/\\\/amp\\\/?$\/, &#39;\/&#39;);\n\n  return normalized;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This ensures your deep link attribution data is consistent across AMP and non-AMP page views.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku and AMP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> deep links use a dedicated link domain that works regardless of where the link is placed, including AMP pages. When a user taps a Tolinku link on an AMP page, the navigation goes to the Tolinku domain, which is configured for Universal Links and App Links. The app opens directly. For users without the app, the <a href=\"https:\/\/tolinku.com\/docs\/concepts\/deep-linking\/\">web fallback page<\/a> loads with your configured content and store links.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For SEO considerations when migrating from AMP, 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>Understand the relationship between AMP and deep linking. Handle AMP viewer URLs, cache redirects, and AMP-to-app link transitions.<\/p>\n","protected":false},"author":2,"featured_media":1590,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"AMP and Deep Linking: Current State and Future","rank_math_description":"Understand the relationship between AMP and deep linking. Handle AMP viewer URLs, cache redirects, and AMP-to-app link transitions.","rank_math_focus_keyword":"AMP deep linking","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-amp-and-deep-linking.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-amp-and-deep-linking.png","footnotes":""},"categories":[11],"tags":[456,23,20,124,69,63,22,366],"class_list":["post-1591","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deep-linking","tag-amp","tag-app-links","tag-deep-linking","tag-google","tag-mobile-development","tag-seo","tag-universal-links","tag-web-performance"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1591","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=1591"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1591\/revisions"}],"predecessor-version":[{"id":2644,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1591\/revisions\/2644"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1590"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}