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", tagsDomain 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.icoandrobots.txtare 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.
| Field | Used 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
- The link's
iosFallbackUrl. - The Continue in app page, when
iosLandingPageis on and your iOS app has an App Store ID (see Deferred deep linking). - Your App Store page,
https://apps.apple.com/app/idfollowed by your App Store ID. - The link's
webFallbackUrl. - A minimal Lander landing page.
Android
- The link's
androidFallbackUrl. - Your Play Store URL (or one built from your package name), with a single use
lander_tokenadded to itsreferrerparameter. Any referrer you set yourself is kept. - The link's
webFallbackUrl. - A minimal Lander landing page.
Desktop
- The link's
webFallbackUrl. - 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.campaignandlink.channeland used in analytics. - Tags: up to 20 tags of up to 50 characters, for filtering.
- Social preview:
ogTitle,ogDescriptionandogImageUrlfor 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.
Disabled, expired and unknown links
| Situation | At the edge | In the app |
|---|---|---|
| Unknown slug | 404 page | Delivered unresolved (isResolved == false, only uri set) |
| Disabled or expired link | 410 page | Delivered 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.
Ways to create links
- Dashboard: Links, then Create link. See Links in the dashboard.
- Links API:
POST /v1/linkswith 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.