Deep Link Button

For engineers routing paid users from the success page into a web or mobile product. You'll have a clear model of what the button puts on the URL and how to handle it downstream. You need a destination URL on your web domain, a universal link on your mobile app, or App Store / Play Store URLs.

What it is#

The Deep Link Button is a funnel component you drop on the success page. It builds a URL from your inputs plus selected funnel context and opens it via funnelRouter.openExternal() when tapped.

It supports two button types:

  • Regular Button — single CTA with one destination URL.
  • App Store Buttons — Apple App Store + Google Play badges, side-by-side or stacked. Each badge has its own URL.

Both types share the same parameter-injection machinery; only the rendering differs.

AppsFlyer needs the dedicated component: This page covers the standard Deep Link Button. For AppsFlyer OneLink — which auto-loads the AF Smart Script and routes through generateOneLinkURL() — use the AppsFlyer Deep Link Button instead.

How URLs are built#

The button does not use {{template}} interpolation in the destination URL field. Instead, you give it a plain destination URL, then opt in to which contextual values get appended as query parameters and what each one's key should be named.

On click, the button:

  1. Validates and normalizes the destination URL (adds https:// if missing).
  2. Walks the Built-in Parameters list and appends each enabled value to the URL using its configured key.
  3. Walks the URL Parameter Mapping list and copies named query params from the current funnel page URL onto the destination.
  4. Calls funnelRouter.openExternal(finalUrl).

URL building only runs in live mode. In the editor preview, the click is a no-op.

Built-in parameters#

Every built-in parameter is disabled by default. Toggle the field on (and edit the key name if needed) to include it.

FieldDefault keySourceUse case
Funnel IDfunnel_idtracker.funnelIdServer-side funnel attribution
Organization IDorganization_idtracker.organizationIdMulti-tenant routing
Campaign IDaf_c_idtracker.campaignIdAppsFlyer-style campaign attribution
Experiment IDexperiment_idtracker.experimentIdA/B test bucket carry-over
EmailemailFunnel email variablePre-fill signup, link to existing record
App User IDapp_user_idtracker.sessionIdCanonical user identity (see app_user_id)
Stripe Customer IDstripe_customer_idFunnel _stripeCustomerId variableAuto-link a Stripe customer in your backend
Meta FBP Cookie_fbptracker.pageSnapshot.fbpServer-side Conversions API matching
Meta FBC Cookie_fbctracker.pageSnapshot.fbcServer-side click attribution

Default key names follow common provider conventions (note af_c_id is AppsFlyer's campaign key) but every key is editable — rename it to match whatever your backend or attribution provider expects.

A value is only appended when (a) the field is enabled, (b) the key is non-empty, and (c) the underlying value resolves to something truthy. Missing values are silently skipped, never sent as empty strings.

URL Parameter Mapping#

For ad-click identifiers and other params that arrive on the funnel landing page (e.g. gclid, fbclid, ttclid, custom ?ref=), the URL Parameter Mapping section forwards them to the destination URL.

Each mapping uses the option Label as the source (the param name on the current page URL) and the Description as the target (the param name on the destination URL). Source and target can be the same string when you just want to pass the value through unchanged.

Example: source fbclid → target fbclid copies ?fbclid=AbC123 from https://yourfunnel.com/f/...?fbclid=AbC123 onto the destination URL when the user taps.

Mappings only run in live mode and only copy values that are present in window.location.search at the moment of the click.

App Store Buttons mode#

Switch Button Type to "App Store Buttons" to render Apple + Google Play badges instead of a single button. You then configure:

  • App Store Link — the iTunes / App Store URL.
  • Google Play Link — the Play Store URL.
  • Dark Mode — black background + white type vs. white background + black type.
  • Button Stack — vertical (default, mobile-friendly) or horizontal.

Both badges go through the same parameter-injection path, so a ?app_user_id=...&_fbp=... tail is appended to whichever store URL the user taps. This lets you reconcile the eventual install with the funnel session post-attribution if the store URL is actually a tracked redirect.

You can disable either button independently. If both are off, nothing renders.

Variables from earlier in the funnel#

The button only reads the funnel email variable and _stripeCustomerId variable directly. Other payment-provider variables that components elsewhere expose (_stripeCheckoutSessionId, _paddleCustomerId, _paddleTransactionId, _solidgateCustomerId) are accessible from a custom success-page component via useVariable(), but the standard Deep Link Button does not surface them as built-in parameters.

If you need one of those IDs on the destination URL, either (a) write a custom component that calls your backend with useVariable("_stripeCheckoutSessionId") etc., or (b) read them server-side from the payment provider's webhook keyed by app_user_id.

Tokens may resolve late on refresh: On a first page render after a hard refresh, tracker.sessionId (which becomes app_user_id on the URL) can be undefined for up to ~200ms. The button only fires on click, so this is rarely an issue — but if you wire a custom component that auto-fires on mount, use the polling pattern from Custom registration component.
AppsFlyer Deep Link Button
OneLink Smart Script integration with conversion params.
Deep linking integrations
Provider notes: Adjust, AppsFlyer, Branch, plain universal links.
app_user_id
The canonical identifier sent as the App User ID param.
Mobile app with RevenueCat
Recipe using the button to hand off to a RevenueCat-backed app.