gospur

Link manager · one Worker, many apps

Every link lands
where it should.

gospur serves your app's links from your own domain: it opens the app when it's installed, renders a real preview card when it's shared in chat, and sends everyone else to the right store for their phone.

gospur.link/Ab3dE5f short link link.yourapp.com/post/9Qd2 app link
Where one link goes A single shared link branches three ways: the installed app on iOS and Android, the App Store or Google Play for people without it, and a preview card fetched by the chat app. one link, shared gospur app installed opens straight in the app no app yet landing page, then App Store or Play chat app fetching title, description and image for the card
Most taps never reach the Worker at all — iOS and Android open an installed app straight from the link. The landing page is for everyone else, and for in-app browsers that skip app links.

The line

What happens between sharing a link and counting the tap

Five stops, in the order they happen. Each one is a route on the same Worker.

  1. Stop 01 — share

    The app posts the link, gets a clean one back

    Your app sends the full link, preview text and all, to /create. The details are stored and you get back a tidy /post/9Qd2 to share. The first save for an item wins, so nobody can overwrite a preview afterwards.

    POST /create → { url } only accepts links on the domain it's called on if the save fails, it returns the full link and the preview still works
  2. Stop 02 — preview

    The card renders before anyone taps

    When a chat app fetches the link, gospur answers with the title, description and image for that item, plus a generated share image. Apps that send richer fields — a room's rent, a job's title, a deal's dates — get a preview style that uses them.

    per-app preview styles app icon stands in when an item has no image details in the link's own query always win over the saved ones
  3. Stop 03 — tap

    Installed apps open directly

    gospur serves the Apple and Android association files for every domain it answers on, so the operating system hands the link to your app instead of the browser. New link types need no iOS release: the file lists them the moment you add them.

    /.well-known/apple-app-site-association /.well-known/assetlinks.json only /<type>/* and /invite are claimed, so /go stays in the browser
  4. Stop 04 — install

    Everyone else reaches the right store

    /go reads the device and sends an iPhone to the App Store and an Android phone to Google Play, while a desktop visitor sees both. An invite code rides along to Play as the install referrer, so it survives the install.

    /go · /go/appstore · /go/play /invite?code=NAMASTE shows the code on the landing page
  5. Stop 05 — count

    The trip is added to a daily total

    Every hit adds one to a daily counter: shares, landing page views, store taps and preview fetches, broken down by link type, chat app, store and country. Nothing about the person is recorded.

    one row per app, per day, per combination no IP addresses, no user IDs, no cookies

Also in the box

Built for more than one app

Multi-app

One Worker, any number of apps

The hostname decides which app a request belongs to, so links carry no app ID in their path. Adding an app is a row in the database and a domain on the Worker.

Your domain

Custom domains, certificates included

Every app gets <app>.gospur.link and can add its own domain, such as link.yourapp.com. Cloudflare issues the DNS record and certificate on deploy.

Link types

Name the things you share

Posts, deals, events, businesses, activities — each type is a label you define, and it becomes the first segment of the path and the wording on the landing page.

Invites

Codes that survive the install

Invite links show the code on the page and carry it into Google Play, so a new user still has it after signing up.

Dashboard

Stats behind Cloudflare Access

The dashboard checks the signed token Access adds to each request, so it stays shut even if the Access policy is later removed. Membership is per app: people see only their own.

Share images

Generated preview cards

Links render their own image at request time, drawn from the item's details and the app's icon, so a shared link looks composed rather than blank.

Short links

gospur.link/Ab3dE5f

The bare domain is a shortener with an API key per app. Ask for a code, share it, switch it off when the campaign ends. Clicks land on that app's dashboard page alongside everything else.

  • The same target always gets the same code, so re-running a script doesn't litter the domain.
  • Targets must be https, with no credentials in the URL.
  • A short link can't point at an app domain: a redirect in front of an app link stops it opening the app.
  • About 60 new links a minute per key, and a key can only switch off its own app's links.
# create a short link
curl -X POST https://gospur.link/v1/links \
  -H "Authorization: Bearer $GOSPUR_KEY" \
  -H 'content-type: application/json' \
  -d '{"url":"https://example.com/spring-sale"}'

→ 201 { "url": "https://gospur.link/Ab3dE5f",
        "code": "Ab3dE5f" }

# switch it off — it answers 404 from then on
curl -X DELETE https://gospur.link/v1/links/Ab3dE5f \
  -H "Authorization: Bearer $GOSPUR_KEY"

Keys live on your servers, never inside the app, where anyone could pull them out. Only the hash of a key is stored, so a lost key is revoked rather than recovered.

Numbers

Four counts, and what each one means

CountWhat it tells you
Shares Links your app created. The size of the loop your users are actually running.
Page views People who opened a link in a browser — usually the ones without the app yet.
Store taps Taps on App Store or Google Play from a landing page. Your install intent, by link.
Preview cards Chat apps fetching a link to build its card. This is where your links get shared.

Taps that open an installed app never reach the Worker, so they aren't in these numbers — count those inside your app. What's here is aggregate from the start: daily totals per app, link, platform, country and detail. There's no row that belongs to a person.

Runs on

Cloudflare, end to end

One Worker at the edge, one database, no servers to keep alive. Deploys in seconds and stays inside the free tiers at ordinary app volumes.

Workers · routing and rendering D1 · previews, links, daily counts Assets · icons and static files Access · who opens the dashboard Rate limiting · per key, per location Custom domains · DNS and TLS on deploy