Docs

Anatomy of a Link

What a Lander link is made of, and what happens when someone taps it on each platform.

A Lander link is a short URL on your link domain that knows two things: which screen it opens in your app, and where to send people who do not have the app.

https://acme.golander.link/summer-sale
        \________________/ \_________/
             domain            slug

  opens in the app at:   /sale/summer
  params:                { "discount": "20" }
  not installed:         iOS fallback, Android fallback, web fallback
  labels:                campaign "summer_2026", channel "instagram", tags

Domain and slug

Domain. Every project gets a hosted domain on golander.link, in the form <project>-<org>.golander.link. You can also add your own domain, such as go.acme.com (see Custom domains). A custom domain serves links only after it passes its DNS check.

Slug. The path after the domain. Leave it empty and Lander picks a random 7 character slug (no 0, O, 1, l or I, so it is easy to type). Or choose your own:

  • 1 to 64 characters: letters, digits, _ and -, starting with a letter or digit.
  • Unique per domain, across both the test and live environments.
  • .well-known, api, v1, favicon.ico and robots.txt are reserved.

Route and parameters

Route (deepLinkPath, labelled Opens in your app at in the dashboard) is the path your router receives, for example /product/123. It must start with / and defaults to /. In the SDK it arrives as link.path, and link.route gives you a value that is always safe to pass to your router.

Parameters (params) are key and value pairs your app receives with the link, like productId or referrer. Values are strings, numbers or booleans. When the tapped URL carries query parameters, they are merged over the stored ones, so https://acme.golander.link/summer-sale?utm_source=newsletter arrives with both discount and utm_source. Lander's own lander_token and lander_link parameters are never passed through.

Fallbacks

Fallback URLs decide where people go when the app is not installed. In the dashboard they sit under When the app is not installed.

FieldUsed for
iosFallbackUrl (iOS)iPhone and iPad taps, instead of the App Store
androidFallbackUrl (Android)Android taps, instead of Google Play
webFallbackUrl (Web and desktop)Desktop taps, and phones when no store is configured

All are optional. Without them, Lander sends people to the store pages from your Platforms settings.

Fallbacks skip deferred deep linking

A platform fallback URL always wins. Android deferred deep linking needs the redirect to Google Play to carry its token, so a link with an Android fallback URL cannot recover the link after install. The same goes for the iOS Continue in app page and an iOS fallback URL.

What happens on each platform

When the app is installed and its Universal Links or App Links are verified, the OS opens the app directly and the edge is not involved. The SDK resolves the link and the API records the open.

When the app is not installed, the edge routes by the device's user agent. The first option that applies wins.

iPhone or iPad

  1. The link's iosFallbackUrl.
  2. The Continue in app page, when iosLandingPage is on and your iOS app has an App Store ID (see Deferred deep linking).
  3. Your App Store page, https://apps.apple.com/app/id followed by your App Store ID.
  4. The link's webFallbackUrl.
  5. A minimal Lander landing page.

Android

  1. The link's androidFallbackUrl.
  2. Your Play Store URL (or one built from your package name), with a single use lander_token added to its referrer parameter. Any referrer you set yourself is kept.
  3. The link's webFallbackUrl.
  4. A minimal Lander landing page.

Desktop

  1. The link's webFallbackUrl.
  2. A minimal Lander landing page.

Crawlers and link preview bots get a page with Open Graph tags, so the link unfurls in chats and social posts.

iPads on iPadOS 13 and later identify as desktop Safari, so the edge treats them as desktop.

Labels and extras

  • Title: a name for the link in your dashboard.
  • Campaign and Channel: attribution labels (up to 100 characters each), returned to your app as link.campaign and link.channel and used in analytics.
  • Tags: up to 20 tags of up to 50 characters, for filtering.
  • Social preview: ogTitle, ogDescription and ogImageUrl for the preview card crawlers see. Without them, the link's title is used.
  • Expiration (expiresAt, Stops working after): after this time the link stops working.
  • Enabled: turn a link off without deleting it.
SituationAt the edgeIn the app
Unknown slug404 pageDelivered unresolved (isResolved == false, only uri set)
Disabled or expired link410 pageDelivered unresolved

Your app always receives the URL, so it can fall back to routing on the raw path.

Clicks

Every tap the edge routes is recorded as a click, after the redirect has already gone out. A click keeps the platform, the country and the host of the referring page, never the IP address, the full user agent or the full referrer. Crawlers, scripts, headless browsers and monitors are still redirected normally (so curl -I shows the real redirect) but are flagged as bots and left out of your analytics.

  • Dashboard: Links, then Create link. See Links in the dashboard.
  • Links API: POST /v1/links with a secret key, from your server.
  • In the app: Lander.createLink(...) with the publishable key, for share and invite flows. The slug is always random and the domain is the project's default domain. See Creating links.

On this page