Smart links

GET /l/{slug} — OS routing, store redirects with Install Referrer, deferred deep links, in-app browser handling, QR and Open Graph previews.

Updated 2026-09-02

A smart link is one URL that sends every visitor to the right place: the App Store, Google Play, a deep link inside an installed app, a web fallback, or an A/B variant — while still recording a click that the SDK can attribute an install to.

Endpoint#

HTTP
GET https://<tracking-domain>/l/{slug}?<any params>

Default resolution (no rules)#

VisitorDestination
iOSiosUrl (App Store). If the app has a universalLinkHost, the universal link is tried first so installed apps open directly.
AndroidandroidUrl (Google Play) with &referrer=wc_click_id%3D<id> so the Install Referrer API hands the click id to the SDK.
Desktop / otherwebFallbackUrl, or a QR page when settings.desktopBehavior = "qr".
Social / messenger crawlerHTML with Open Graph tags from settings.og (no redirect, no click).
In-app browser (Instagram, TikTok, Facebook …)Custom-scheme interstitial that tries deepLinkScheme:// then falls back to the store after schemeTimeoutMs (default 1500 ms).

Rules evaluated before the defaults can override any of this — see Routing rules.

Google transparency override#

A visible url= parameter on a smart link behaves exactly like /c/{slug}: it wins over every rule and default, and force_transparent=true is honoured. This lets you use one link in both Google Ads tracking templates and social campaigns.

Deferred deep linking#

  1. The click stores deepLinkPath (from the link or the rule action) with the click id.
  2. The store redirect carries the click id (Play referrer) or the SDK matches probabilistically on iOS.
  3. POST /api/sdk/v1/install returns attribution.deep_link_path; the SDK's onAttribution callback routes to it.
Install response
{ "install_id": "ins_01…", "attribution": { "method": "INSTALL_REFERRER", "campaign": "TikTok TR", "click_id": "k3Zp…", "deep_link_path": "/tr/collections/summer" } }
settings
{
  "passthroughParams": [
    "utm_*",
    "gclid",
    "fbclid",
    "ttclid"
  ],
  "desktopBehavior": "qr",
  "inAppBrowserBehavior": "scheme_fallback",
  "og": {
    "title": "Northwind — Summer collection",
    "description": "Open in the app",
    "image": "https://example.com/og.png"
  },
  "blockBots": false
}
SettingMeaning
passthroughParamsWhich incoming query params are forwarded to the destination: an allowlist (utm_* wildcards allowed), "all" or "none".
appendClickId, clickIdParamWhether / under which name the click id is appended to web destinations.
desktopBehaviorweb or qr.
inAppBrowserBehaviorscheme_fallback (interstitial), store, or web.
ogTitle, description, image for social previews.
expiredUrl, expiresAt, clickCapExpiry and cap; after either, visitors go to expiredUrl (or 410).
blockBotsReturn 403 to non-verified bots instead of redirecting.
geoFallbackDestination when geo lookup fails and a rule required it.

Dashboard Smart links → New, or MCP create_smart_link then update_smart_link_routing. The editor at /dashboard/smart-links/{id} includes a simulator that is also exposed as test_smart_link_route.

Host apple-app-site-association and .well-known/assetlinks.json on the link domain (the dashboard generates both from the app's bundle id and team id). Android App Links verified this way skip the interstitial entirely.