How Lander Works
What happens between a tap on a short link and the screen your app opens, for installed and not yet installed apps.
Lander has three moving parts: the SDK in your app, the edge that serves your link domain, and the API that both the SDK and the dashboard talk to. You configure everything in the dashboard.
+--------------------------------+
tap on a link -----> | Lander edge (link domain) | ---> App Store / Google Play / your fallback URL
acme.golander.link | routing by platform |
| /.well-known files |
| social previews for crawlers |
+---------------+----------------+
| clicks (queued, never delay the redirect)
v
Flutter SDK -------> Lander API (api.golander.link) <------- Dashboard (app.golander.link)
init, resolve, publishable keys: /v1/sdk/* setup, links, keys, analytics
events, links secret keys: /v1/links, /v1/handoffsThe pieces
The edge answers every request to your link domain, such as acme.golander.link. Each project gets a hosted subdomain of golander.link, and you can add custom domains. The edge:
- Redirects a tap to the right place for the device (see the table below).
- Serves
/.well-known/apple-app-site-associationand/.well-known/assetlinks.json, generated from the apps you entered under Platforms. iOS and Android fetch these to verify that your app may open links on the domain. - Serves a page with Open Graph tags to crawlers and link preview bots, so your links unfurl nicely in chats and social posts.
- Reads link settings from a cache at the edge and records clicks after the response goes out, so a redirect never waits on a database write.
The SDK (lander_flutter) runs in your app. It reports each launch, receives every link the operating system hands to your app, asks the API what that link means, and delivers the result on Lander.onDeepLink. It also creates links in app and queues your conversion events.
The API at api.golander.link owns the data. The SDK uses publishable keys (pk_...) on the /v1/sdk/* routes; your server uses secret keys (sk_...) to manage links. The SDK only ever talks to this public API.
The dashboard at app.golander.link is where you create projects, register your apps, create links and keys, and read analytics.
When the app is installed
This is the common path, and it usually skips the edge entirely.
- Someone taps
https://acme.golander.link/summer-sale. - iOS (Universal Links) or Android (App Links) has already verified that your app owns
acme.golander.link, using the.well-knownfiles Lander hosts. So the OS opens your app directly and hands it the URL. - The SDK sends the URL to the API (
POST /v1/sdk/resolve). - The API finds the link and returns its route (
/sale/summer), parameters, campaign and channel. Query parameters on the tapped URL are merged over the link's own parameters. - The SDK delivers a
LanderLinkonLander.onDeepLink, and your code callsrouter.go(link.route). - The API records an open for the link. You do not need to track opens yourself.
If the URL is not a Lander link (for example a page on your own site), or the network is down, the SDK still delivers it, with isResolved == false and only the raw uri set, so your app can route on it. Custom scheme URLs such as acmeshop://product/123 are delivered as they are, without a network call.
When the app is not installed
The OS has no app to open, so the browser loads the link and the edge decides where to send the person:
| Device | Where the tap goes |
|---|---|
| iPhone or iPad | The link's iOS fallback URL if set. Otherwise the App Store (or the optional Continue in app page). Otherwise the web fallback. |
| Android | The link's Android fallback URL if set. Otherwise Google Play, with a single use token in the install referrer. Otherwise the web fallback. |
| Desktop | The link's web fallback URL, otherwise a minimal Lander landing page. |
| Crawler or preview bot | A page with the link's social preview tags. |
The full rules are in Anatomy of a link.
After the person installs and opens your app for the first time, the SDK reports the first launch (POST /v1/sdk/init). If Lander can tie that install to the earlier tap, the API returns the link and the SDK delivers it on the same onDeepLink stream, with isDeferred set to true. That is deferred deep linking. Every install, matched or not, is recorded with a confidence label.
Changes go live immediately
Link settings and domain configuration are cached at the edge for a few minutes. When you save a link or platform in the dashboard, or change a link through the API, Lander drops the cached copy, so the next tap sees the change.