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#
GET https://<tracking-domain>/l/{slug}?<any params>Default resolution (no rules)#
| Visitor | Destination |
|---|---|
| iOS | iosUrl (App Store). If the app has a universalLinkHost, the universal link is tried first so installed apps open directly. |
| Android | androidUrl (Google Play) with &referrer=wc_click_id%3D<id> so the Install Referrer API hands the click id to the SDK. |
| Desktop / other | webFallbackUrl, or a QR page when settings.desktopBehavior = "qr". |
| Social / messenger crawler | HTML 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#
- The click stores
deepLinkPath(from the link or the rule action) with the click id. - The store redirect carries the click id (Play referrer) or the SDK matches probabilistically on iOS.
POST /api/sdk/v1/installreturnsattribution.deep_link_path; the SDK'sonAttributioncallback routes to it.
{ "install_id": "ins_01…", "attribution": { "method": "INSTALL_REFERRER", "campaign": "TikTok TR", "click_id": "k3Zp…", "deep_link_path": "/tr/collections/summer" } }Link 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
}| Setting | Meaning |
|---|---|
passthroughParams | Which incoming query params are forwarded to the destination: an allowlist (utm_* wildcards allowed), "all" or "none". |
appendClickId, clickIdParam | Whether / under which name the click id is appended to web destinations. |
desktopBehavior | web or qr. |
inAppBrowserBehavior | scheme_fallback (interstitial), store, or web. |
og | Title, description, image for social previews. |
expiredUrl, expiresAt, clickCap | Expiry and cap; after either, visitors go to expiredUrl (or 410). |
blockBots | Return 403 to non-verified bots instead of redirecting. |
geoFallback | Destination when geo lookup fails and a rule required it. |
Creating smart links#
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.
Universal links / App Links#
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.