← Back to Blog

Deep Links in In-App Browsers: Why Instagram, TikTok, and Facebook Break Your Links (and How to Keep the Attribution Too)

Social apps open links in their own embedded browsers, so Universal Links and App Links never fire. What breaks, what it costs your attribution, and the fix.

Quick answer: When someone taps your link inside Instagram, TikTok, or Facebook, the link opens in that app's own embedded browser, not in Safari or Chrome. The operating system never sees the tap, so Universal Links (iOS) and App Links (Android) never fire, and your app does not open even when it is installed. Everything your link carried - invite context, referral codes, campaign parameters - stays on a web page and never reaches the app. You cannot force a social app to hand the tap to the OS. What you can do is record the click on your server before any redirect happens, restore the destination after install with deferred deep linking, and give installed users an explicit tap target that works inside a webview. That stack, plus testing inside the real apps, is what this guide covers.

$ cat table-of-contents

  1. What is an in-app browser?
  2. Why do Universal Links and App Links fail inside them?
  3. What are the iOS-specific traps?
  4. What are the Android rules?
  5. What breaks, platform by platform?
  6. What does an in-app browser do to your attribution?
  7. What actually fixes it?
  8. What can't you fix?
  9. How do you test this properly?
  10. Where LinkTrace fits
  11. Frequently asked questions

What is an in-app browser?

Definition: An in-app browser is the web view a mobile app opens when you tap a link, instead of handing the link to the phone's default browser. On iOS this is usually a WKWebView the app controls; on Android it is a WebView or a Chrome Custom Tab. The host app's code sees every navigation first and decides what is allowed to leave.

When a friend DMs you a link in Instagram and you tap it, the page loads inside Instagram. When you tap a link in a TikTok bio, it loads inside TikTok. The social apps do this because keeping you on the web inside their app keeps you inside their app.

Not every app's browser behaves the same. There are three kinds, and the differences decide whether your link works:

Kind What it is Deep link behavior Seen in
The app's own browser WKWebView (iOS) or WebView (Android) the app fully controls Universal Links, App Links, and URI schemes work only if the host app allows them Instagram, Facebook, Messenger, TikTok, Snapchat (per Felix Krause's iOS in-app browser survey, August 2022)
The system's in-app view SFSafariViewController (iOS), Chrome Custom Tabs (Android) Much closer to the real browser; Custom Tabs open installed apps by default per Chrome's documentation X, Reddit, Telegram on iOS in the same 2022 survey
The default browser The app hands the link to the OS entirely Full Universal Link and App Link behavior WhatsApp, Gmail, and Slack on iOS in 2022

One practical consequence: WhatsApp, the channel most invite and referral links travel through, is one of the better-behaved apps on iOS because it hands links to the system. The worst behavior concentrates exactly where paid and organic social traffic concentrates: Instagram, TikTok, and Facebook. These classifications come from 2022 research and app makers change behavior without notice, so treat them as a starting hypothesis and test on the current app versions.

Universal Links and App Links are OS features. When you tap a link in Safari, iOS checks your apple-app-site-association file and opens the app before any page loads. When you tap a verified App Link on Android, the OS routes you to the app without a disambiguation dialog. Both mechanisms assume the operating system handles the tap.

Inside an in-app browser, the operating system does not handle the tap. The host app's code does. Apple's debugging technote TN3155 says it directly for browsers that are not Safari: it is up to them to enable Universal Links. On Android, a WebView keeps every tapped link inside itself unless the host app implements shouldOverrideUrlLoading to launch intents for specific URLs, and the major social apps do not do this for your domain.

Both platforms were designed this way deliberately. Universal Links exist partly to give users a predictable, secure path from web to app, and letting any embedded webview trigger app opens would hand that power to every ad iframe and redirect chain. The side effect is that your links work in every test you run in Safari and Chrome, and fail in the exact environments where your users actually tap them.

What are the iOS-specific traps?

Even when a Universal Link is configured perfectly, iOS has documented edge cases that in-app browsers trigger constantly:

  • Typed or pasted URLs never open the app. If the navigation was not a link tap, Universal Links do not fire.
  • Redirects count as typing. An Apple engineer confirmed on the Apple Developer Forums in March 2025 that sending the user onward with window.location is treated like typing the URL into the address bar: no app opens. Most marketing and tracking links redirect exactly this way. The fix is a real link the person taps, not a script that pushes them.
  • The first page load in a webview never triggers a Universal Link. This is a reading of the WebKit source rather than documented API (documented as such by appy.to's October 2026 write-up), but it matches observed behavior: if the host app loads your URL directly, the OS interception never gets a chance.
  • Same-domain links stay in the browser. A link pointing at the same domain as the page it sits on does not trigger a Universal Link, which is why the "open in app" link on your landing page should point at a different subdomain than the page itself.
  • The App Store trap for installed users. The first tap on a tracking link from an app other than Safari can open the App Store even though the app is installed. The user you already have gets sent to a store listing, and the second tap behaves differently from the first. This one is observed behavior, not documented, and it confuses everyone who hits it.

What are the Android rules?

Android's failure mode is simpler and cruder. A WebView keeps every link inside itself by default. Your App Link, your custom scheme, and your intent:// URL all just load, or fail, inside the webview unless the host app decides otherwise. Developers have reported exactly this for Instagram on Android.

Chrome Custom Tabs behave much better: Chrome's documentation says they open links in the matching installed app by default. And since Android 12, a normal web link opens an app only if that app is verified for the domain, which makes a healthy assetlinks.json file the price of entry for everything else.

Chrome's intent:// URLs have their own documented rules: they need a real user gesture, they do not launch from a redirect or a JavaScript timer, and they can only reach activities marked BROWSABLE. Critically, those are Chrome's rules. An in-app WebView does not inherit them and may ignore intent:// entirely, so an intent URL that works beautifully in Chrome can be dead inside Instagram.

What breaks, platform by platform?

Combining app-maker documentation, platform documentation, and published research (dated where the finding is old, because this changes without notice):

App Browser behavior What happens to your link
Instagram Own in-app browser on iOS, with a menu to open in the default browser and no setting to disable it (Krause, August 2022) Universal Links do not open the app from organic links; deep link vendors Branch and AppsFlyer both document this, and AppsFlyer notes they can work in ads that use the app as the destination. On Android, developers report intent:// links are not launched.
TikTok Own in-app browser Same class of failure: links load as web pages, app context does not survive, and bio and DM links are where your organic traffic taps.
Facebook and Messenger Own in-app browser; Meta's help center documents that links open inside the app, with "Open in browser" under the menu AppsFlyer documents suppressed Universal Link behavior for organic links. The ⋯ menu is the user's only way out.
X and Reddit System in-app view (SFSafariViewController) on iOS in the 2022 survey Closer to Safari behavior; still test, because the classification is old.
WhatsApp and Telegram WhatsApp hands links to the default browser on iOS (2022); Telegram used the system view Best-behaved channels for deep links, which matters because this is where invite links actually get shared.

The pattern: the apps with the most consumer social traffic are the worst citizens. And the tap that fails is often the first one, which is the one your growth depends on.

What does an in-app browser do to your attribution?

Most guides stop at "the app doesn't open." For a team running invites, referrals, or any kind of campaign, that is only half the loss.

When the link stays on the web, every parameter in the URL stays on the web. The invite code, the referrer ID, the campaign tags: all of it lives in a webview that will be closed and forgotten. If the user later installs the app from the store, the install shows up in your analytics as direct or organic. You got the install. You lost the reason.

The concrete failures:

  • Invites lose their sender. A friend shares your group-expense app in an Instagram DM. The recipient taps, lands on your site inside Instagram, installs from the store, and opens the app to a generic home screen. No group, no inviter, no attribution. This is the single most common way referral programs leak credit.
  • Campaigns lose their source. The TikTok bio link that drove your best week of installs is invisible, because every install it caused looks direct.
  • Retargeting loses the trail. The user who tapped and did not install is a high-intent audience you cannot see.

Routing fixes and attribution fixes are not the same thing. A URI-scheme fallback can open the app for an installed user, but it does nothing for the far more valuable user who has not installed yet. That user is the whole point of the link, and for them the only thing that survives the journey is a click recorded before the store.

What actually fixes it?

No single technique fixes in-app browsers. What works is a stack, in layers, where each layer covers the case the one above it cannot:

Layer 0: healthy platform configuration. Your apple-app-site-association and assetlinks.json files must be live, valid, and fast to update. Validate them monthly with Apple's and Google's tools, keep CDN cache TTLs at or under 24 hours for these paths, and alert on 404s: one cached failure on your AASA file can break every Universal Link until Apple's CDN refreshes. This layer fixes Safari and Chrome, which still carry a large share of taps.

Layer 1: record the click on the server, before any redirect. A tracking link is an HTTPS URL your server answers. When it is hit, your server records the click, along with everything the link carried, and only then sends the user onward. This works identically in Safari, in Instagram's webview, in TikTok, everywhere, because it is just an HTTP request. Nothing about the host app can interfere with it. This is the layer that preserves attribution through an in-app browser, and it is also the layer that makes the next one possible.

Layer 2: deferred deep linking for the user who installs. If the click was recorded server-side, then after the user installs and opens the app, the app can ask the server "did someone with this fingerprint or this referrer token just click a link?" and restore the destination and the invite context on first open. This is the only mechanism that survives a fresh install, and it works regardless of which browser the tap happened in, because the record was made before the store ever appeared.

Layer 3: an explicit tap target for installed users. Inside a webview, automatic redirects do not trigger Universal Links, but a real user tap on a real link can. So the landing page an in-app browser shows should have one obvious button - "Open in the app" - pointing at your Universal Link from a different subdomain, with a URI-scheme fallback behind it for environments where that helps. The tap satisfies the user-gesture requirement that iOS and Chrome's intent rules both demand. Do not auto-fire it: auto-firing is exactly what the platforms treat as typed navigation.

Layer 4: monitoring. Track the ratio of link clicks to app opens per source platform. A sudden drop for one platform is what an in-app browser change looks like in production. Catching it in a dashboard beats catching it in a support ticket.

What can't you fix?

Be suspicious of anyone who claims their SDK makes deep links "just work" inside Instagram. The host app decides, full stop. There is no entitlement, no JavaScript trick, and no vendor that can force Instagram's webview to hand a tap to iOS. Behaviors also change without notice: social apps ship in-app browser updates on their own schedules, independent of iOS and Android releases, and a configuration that works today can break next quarter.

The goal is not to defeat the in-app browser. The goal is to make sure that even when the worst case happens - the user stays on the web, installs later from the store - the invite, the referral credit, and the campaign attribution are still intact when they open the app.

How do you test this properly?

Most in-app browser bugs are found by users, not by QA, because QA tests in Safari. The testing discipline that actually catches them:

  1. Use physical devices. Simulators skip OS-level link verification.
  2. Distribute the link the way users get it: post it to a private Instagram story, send it in a TikTok DM, a Facebook message, a WhatsApp chat. Tap it from inside the app, never from a notes app.
  3. On iOS, tap twice and record both results. The first and second taps can behave differently.
  4. Delete the app, tap the link, install from the store, open it. Confirm the first screen matches the link's destination and that invite or campaign context arrived.
  5. Re-run the top journeys after every major iOS and Android release and every major Instagram, TikTok, or Facebook update. Their webviews change independently of the OS.

Where LinkTrace fits

LinkTrace is built around exactly the layer that survives in-app browsers: the server-side click record.

You create a tagged link with one API call. Every tap on that link is recorded on LinkTrace's servers the moment it happens, before any redirect, in whatever browser the tap occurred in - Safari, Chrome, or Instagram's webview. When the user installs your app and opens it, your app makes one more API call to retrieve the attribution: which link brought them, with the invite, referral, or campaign context attached. Two HTTP calls, no SDK to embed, nothing for the social apps' webviews to interfere with.

That covers the measurement and the post-install routing: the user lands in the right group, attached to the right inviter, and your reporting shows which channel actually drove the install. Pair it with the fallback patterns above for the installed-user case, where LinkTrace deep links hand the user to your app's own routing.

It is free to start, and the whole integration is sub-hour, so the cheapest way to see what in-app browsers are currently costing you is to put tagged links in your bio and your next few posts and watch which installs stop being "direct."

Frequently asked questions

Why does my link open a browser instead of my app in Instagram?

Instagram opens links in its own embedded browser rather than handing the tap to the operating system, so Universal Links and App Links never fire. Your link is not misconfigured; the environment is doing exactly what Instagram designed it to do.

Why does the same link work in Safari?

Safari hands link taps to iOS, which checks your apple-app-site-association file and opens the app. The social apps' in-app browsers handle navigation themselves and do not perform that check for you.

Do URI schemes work inside in-app browsers?

Sometimes, when triggered by a real user tap on a button or link, but they fail with an error when the app is not installed and they carry nothing through an install. Use them as a fallback for installed users, never as the primary link.

Can a JavaScript redirect open the app from an in-app browser?

No. Apple treats scripted navigation like a typed URL, which never triggers a Universal Link, and Chrome's intent rules similarly require a real user gesture. Automatic redirects from webviews reliably fail; explicit taps are the pattern that works.

Does deferred deep linking work if the click happened inside Instagram?

Yes, provided the click was recorded server-side when the link was hit. The record does not depend on which browser rendered the page, so after the user installs and opens the app, the original destination and attribution can be restored.

How do I know if in-app browsers are hurting me?

Compare link clicks to app opens per source platform. If Instagram shows plenty of clicks and a fraction of the opens of WhatsApp, the gap is the in-app browser, and the installs behind it are currently reading as direct traffic.

LinkTrace is a deferred deep linking and install attribution service for startups and app developers. Two HTTPS calls, flat pricing, no SDK. Start here.

Related guides: Universal Links vs App Links, You're Getting Installs from Twitter, Reddit, and LinkedIn, and Deferred Deep Links Are Harder Than They Look