ZIPPY DOCS

Link in bio

One page for every link you post — and unlike every other link-in-bio tool, each button springs the real native app, so you can see which blocks actually got people into the app.

Link in bio

Your Zippy bio page lives at zipthe.link/@yourhandle and holds every link you post — the new video, the preset pack, your socials.

The difference from every other link-in-bio tool is one design decision: a block never holds a URL. Every tappable block points at one of your Zippy links, so a tap runs through the redirect engine and springs the real native app out of the Instagram or TikTok in-app browser. And because the engine records how each tap landed, your bio page can answer a question no other bio tool can: which block actually got people into the app.

The page is free on every plan. Custom colours are Hero and up. The whole feature is behind the link-in-bio feature flag.

Claim your handle

Dashboard → Link in bio (or my bio on the phone).

FieldWhat it is
HandleThe address people tap: zipthe.link/@yourhandle. 3–30 characters, letters/numbers/./-/_, starting with a letter or number.
Display nameThe big name at the top of the page.
BioOne line under your name. Up to 280 characters.
Profile picture URLAny public https:// image.
Page is liveOff hides the page — and nothing else. See Hiding the page never breaks a link.

Handles are case-insensitive (/Mona and /mona are one page, stored lowercase), and every top-level route of the app is reserved, so nobody can claim links, settings or billing. Change your handle any time — the old one frees up and every link on the page keeps working.

Blocks

A page is an ordered list of up to 50 blocks.

BlockWhat it does
Link buttonThe big tap target. Points at one of your links; optional small print under the label.
HeadingA section title between groups of buttons.
TextA line of plain text (rendered as text — never HTML).
Social rowA row of pills, up to 8, each one its own link.

Because a pasted URL just opens a webpage. That's the entire gap between Zippy and a Linktree:

  • A link block resolves through the redirect engine, which fires the native app intent — YouTube opens in YouTube, Spotify in Spotify, instead of a webview.
  • The engine records the outcome, so the block gets a real app-open rate.
  • Everything you already set on that link comes along: deep-linking, UTM tags, pixels, password, A/B tests.

Make links on the Links page, then pick one in the block. There is no URL field on a block, and the API refuses any block that carries one.

Reordering

Every block has Move up and Move down buttons — on the web dashboard and in the mobile app. They're real buttons, so reordering works with a keyboard, a screen reader or a switch control, not just a mouse drag.

Saving replaces the whole list in one write. There's no per-block position to drift out of sync, so a reorder can never duplicate or lose a block: either the new order is stored, or nothing changed. If a block is unfinished (no button text, no link picked), the editor names it and holds the save rather than quietly dropping it.

Which block opens the app

This is the payoff, and it's on the editor screen under Which block opens the app.

GET /api/bio/stats

{
  "configured": true,
  "sampled": true,
  "window": 90,
  "blocks": [
    { "linkId": "…", "clicks": 3120, "outcomes": 980, "opened": 892, "appOpenRate": 0.91 },
    { "linkId": "…", "clicks": 1450, "outcomes": 402, "opened": 121, "appOpenRate": 0.3 },
    { "linkId": "…", "clicks": 12,   "outcomes": 0,   "opened": 0,   "appOpenRate": null }
  ]
}

Read it the way we report it:

  • appOpenRate is opened / outcomes, computed inside the outcomes dataset — not opened / clicks. Clicks and outcomes are sampled independently, so dividing one by the other would be a made-up ratio.
  • sampled: true is always true. These are trends. The gap between 91% and 30% is real; the last digit isn't. We show whole numbers only, for that reason.
  • appOpenRate: null means no outcome rows yet and renders as . A block with outcome rows and zero opens is a real 0%. Those are different facts and never render the same.
  • No traffic at all gets a plain "nobody has tapped yet" — never a table of fake zeros.

Per-block rates are Hero and up (fullAnalytics), the same tier as the rest of your per-link analytics. On the free plan the page and every block still work, still redirect, and are still measured — you just can't read the rate yet.

Colours

Hero and up can set three hex colours: page background, text, and buttons. Everything else on the page reads those three values, so a page is always internally consistent.

Two deliberate behaviours:

  • Saving your page without touching colours preserves them. If your plan changes, editing your title never wipes your palette.
  • The public page paints the colours you stored, whatever your plan is today. A downgrade never repaints a page your audience already knows.

Switching Page is live off hides the page. Deleting the page frees the handle. Neither one touches a single link:

Every link that was ever on your bio page keeps redirecting. Forever.

That's the same permanence rule as everywhere else in Zippy — no expiry, no click caps, no dead 404s. The QR you printed, the caption you posted last year, the block you deleted this morning: all still resolve.

Your bio blocks also don't count against your plan's link limit. The page is free on every tier, so it would be a strange kind of free if five blocks ate a free plan's five links.

Your page as your audience sees it

The public page is server-rendered, has no client-side JavaScript at all, and every button is a plain same-tab link. That's not minimalism for its own sake — a new tab or a JS-driven navigation breaks the in-app-browser → native-app hand-off, which is the only reason this page exists.

The preview in the editor is the exact same renderer as the public page, so what you arrange is what your audience gets.

FAQ

Open Link in bio in the dashboard (or my bio in the app), claim a handle, then add blocks. Each link block points at one of your Zippy links. Your page is live at zipthe.link/@yourhandle as soon as you claim the handle.

Make a Zippy link whose destination is the Instagram URL (a profile, a Reel, a post), then add a link button block that points at that link — not at the raw URL. The redirect engine fires Instagram's native app intent, so the tap leaves whatever in-app browser it started in and lands in the Instagram app, logged in. The same holds for TikTok, YouTube, Spotify and every other app in the routing table; put them in a social row block if you want them as a row of pills. Nothing to configure: it's what a link block does by default.

So a tap can open the real app. A pasted URL is just a webpage; a Zippy link runs through the redirect engine, which springs the native app out of the Instagram/TikTok browser — and reports whether it worked.

Yes, and by the metric that matters: app-open rate per block, not just clicks. It's on the editor screen, Hero and up.

No. Hiding hides only the page; deleting frees only the handle. Every link stays live and keeps redirecting forever.

No. Links created for your bio page are excluded from your plan's active-link count.

Read more