Loops AI Docs

Links & routing

How the SDK handles outbound links tapped inside chat — Chrome Custom Tabs by default, or your own native routing.

When a shopper taps a product or any other link inside the chat, the web widget hands the outbound URL to the native SDK over the bridge (the openExternalUrl action). The URL is passed verbatim, with its full query string intact — including any attribution parameters (utm_* or loops_ref) the runtime appended.

Default: in-app browser

Out of the box the SDK opens the URL in an in-app browser — Chrome Custom Tabs on Android. This keeps the shopper in your app, and because the full query string is preserved, the destination loads in a real web context where your analytics (e.g. GTM) fire normally.

_blank / window.open links are intercepted and routed the same way — the SDK never spawns a second WebView or leaves your app unexpectedly.

Override: your own routing

To send links somewhere else — a native product screen, the system browser, or a deep link into another app — implement the open-URL callback. When you handle it, your routing takes precedence and the in-app browser default does not run.

LoopsAIChatListener:

val listener = object : LoopsAIChatListener {
  override fun onOpenUrlRequested(url: String) {
    router.open(url)
  }
}

If you route a link into a native screen instead of a web page, the attribution parameters in the URL (utm_* / loops_ref) no longer reach web analytics — there is no web page load to run GTM. See Conversion attribution for what this means for measurement.

Next: Analytics.

On this page