Docs

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/handoffs

The 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-association and /.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.

  1. Someone taps https://acme.golander.link/summer-sale.
  2. iOS (Universal Links) or Android (App Links) has already verified that your app owns acme.golander.link, using the .well-known files Lander hosts. So the OS opens your app directly and hands it the URL.
  3. The SDK sends the URL to the API (POST /v1/sdk/resolve).
  4. 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.
  5. The SDK delivers a LanderLink on Lander.onDeepLink, and your code calls router.go(link.route).
  6. 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:

DeviceWhere the tap goes
iPhone or iPadThe link's iOS fallback URL if set. Otherwise the App Store (or the optional Continue in app page). Otherwise the web fallback.
AndroidThe link's Android fallback URL if set. Otherwise Google Play, with a single use token in the install referrer. Otherwise the web fallback.
DesktopThe link's web fallback URL, otherwise a minimal Lander landing page.
Crawler or preview botA 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.

On this page