Short links
A short, brandable redirect you create per app — one link that sends iPhones to the App Store, Android to Play, and everyone else to a web page. Links can expire by date or by click count, they report where the clicks came from, and link-preview fetchers are excluded from the count so sharing in a group chat doesn't burn the budget.
Creating a link
In the dashboard open your app and go to Short links → New link. You give the link an internal name (visitors never see it), a destination, and optionally a lifetime. The public URL looks like this:
https://go.appmate.cloud/{code} # with a short domain configured
https://appmate.cloud/l/{code} # path form — always worksBoth forms resolve to the same link, so a code created before the short domain was set up keeps working afterwards — and vice versa.
Codes
- Generated codes are 6 characters from a deliberately unambiguous alphabet: lowercase only, with
0/oand1/l/iremoved. That's 31 symbols, about 887 million combinations — and a code survives being read off a poster or dictated over the phone. - Custom (vanity) codes are supported: 3–40 characters, lowercase letters, numbers, hyphens and underscores, starting and ending with a letter or number — e.g.
summer-sale. - A reserved-word list blocks codes that would shadow a real route (
api,docs,login,settings, and similar).
Platform-aware destinations
Every link has one required fallback URL plus two optional overrides:
- iOS URL — served to iPhones and iPads.
- Android URL — served to Android devices.
- Fallback URL — served to everyone else (desktop, and anything unrecognised).
Leave a platform field blank and that platform simply gets the fallback, so a link with only a fallback behaves exactly like a plain redirect.
Destinations accept http, https, and custom app schemes — deep links such as myapp://home are a supported destination. For safety, javascript:, data:, vbscript:, file: and blob: URLs are rejected.
Expiry and click limits
A link stops redirecting when any of these applies:
- Expiry date — set an Expires at date and time.
- Click limit — set a maximum number of counted clicks.
- Disabled — switch the link off manually at any time.
Click limits are enforced atomically: the limit check and the increment happen in one database write, so a link capped at 100 hands out exactly 100 clicks even when requests arrive simultaneously.
Reset click count reopens a link that hit its cap without editing the limit. It resets only the budget — the click history and the stats stay intact.
What happens when a link ends
Each link chooses its own ending, independently of the others:
- Branded “link ended” page(the default) — shows your app icon and name, an optional custom message you write per link, and a button through to the app's website if one is set on the app. The wording differs for a disabled link versus an expired one.
- Redirect to a fallback URL — send the traffic somewhere else instead, e.g. your home page or the next campaign.
Link previews don't count as clicks
When someone pastes a URL into Slack, WhatsApp, Facebook, Telegram, Discord, or an iMessage-style chat, the platform fetches it to build the preview card. AppMate detects those fetchers and excludes them from the click count and from the click limit. They are still redirected, so the preview renders normally, and they are reported separately in the link's stats.
Analytics
Each link has its own stats page showing:
- Clicks over time.
- The split across iOS / Android / fallbackdestinations — which destination each visitor actually got, snapshotted at click time so later edits don't rewrite history.
- Top countries.
- Top referrer hosts — the host only (e.g.
instagram.com), never the full referring URL. - Recent clicks with device and platform.
- Preview-fetcher hits, counted separately from humans.
Why 302, not 301
Short links always redirect with HTTP 302 and Cache-Control: no-store. A 301 would be cached by browsers and intermediaries indefinitely, which means expiry, click limits and destination edits would silently stop taking effect for anyone who had followed the link once. The 302 keeps every hit going through AppMate, so changes apply immediately. Requests are also sent with Referrer-Policy: no-referrer, so the short code isn't leaked to the destination.
Setting up the go. domain
The short domain is an operator-level setup step, done once per deployment:
- Add
go.appmate.cloudto the app in Coolify — this triggers the Let's Encrypt certificate for the host. - Set the environment variable
SHORTLINK_HOSTS=go.appmate.cloud(comma-separated; the first entry wins).
Until both are done, links are generated and served in the /l/{code} path form on your main host. The codes are identical either way, so nothing needs to be recreated once the short domain is live.
Pair a short link with a QR code for print, or use the referral program when you need per-user links with install attribution.