← all posts
The Zippy Team

Webhooks: Get Pinged When Someone Actually Opens Your App

Zippy webhooks push link events to any URL — including the one signal no other link tool exports: whether a tap actually opened the real app. Works with Zapier and Make out of the box.

webhooksapp-open eventszapiermakeautomationcreator tools
Zippy the lightning-bolt mascot ringing a bell that sends signal waves to a row of happy robot inboxes
Zippy, the lightning-bolt mascot

Zippy: every link tool can count clicks. only I can tell your spreadsheet, your Slack, your CRM — the moment someone taps your link — whether the REAL app opened. ring ring.

Zippy now speaks webhook. Point it at any URL you own and it POSTs you a signed JSON event the moment something happens: a link created, updated, or archived — and the big one — someone tapped your link and Zippy knows whether the real app opened.

The signal nobody else exports

Every link tool on earth will tell you a click happened. None of them will tell you what happened next — because none of them know. Zippy's redirect engine does: after every tap it hears back from the device and files the outcome into one of three buckets.

  • app.opened — the native app actually launched. The tap worked.
  • app.browser — the visitor stayed in the browser (usually the in-app one).
  • app.broken — the hand-off failed. Something to fix.

Until today that signal lived in your Zippy analytics. Now it's exportable — pushed to your own systems in real time, with the slug, the target platform, the app the tap came from, country, city, and device riding along. Click counts say "somebody tapped." The app-open stream says "and it worked." That difference is the whole reason Zippy exists, and now you can pipe it anywhere.

Six events, one envelope

Three lifecycle events (link.created, link.updated, link.archived — each carrying the full link object) and the three app-open outcomes above. Every delivery is the same shape:

{
  "event": "app.opened",
  "ts": "2026-07-19T14:03:22.512Z",
  "data": {
    "slug": "summer-drop",
    "platformKey": "youtube",
    "sourceApp": "instagram",
    "country": "US",
    "device": "ios"
  }
}

Every delivery is signed — an x-zippy-signature header carries the HMAC of the body, keyed with a secret only you and Zippy hold, so your receiver can verify it's really us. The webhooks docs have the payloads and a copy-paste verifier.

No code? Zapier and Make catch it natively

A webhook is just an HTTP ping, which means the entire automation universe is your receiver. Zapier's Catch Hook and Make's Custom webhook both hand you a URL — paste it into Zippy's Webhooks page, pick your events, done.

The starter recipe: a Google Sheets row per real app-open. Catch Hook → map data.slug, data.sourceApp, data.country → Create Spreadsheet Row. Five minutes, and you have a live ledger of taps that actually opened your app, sliceable by post, platform, and country.

From there it's your imagination: Slack ping when app.broken fires (your link health alarm), tag CRM contacts by country, log every link.created your team ships. If a tool has a catch-webhook trigger — and they all do — Zippy can feed it.

The fine print, honestly

Delivery is single-attempt with a 5-second timeout — a live signal, not a ledger. If your endpoint is down, that event is missed and a fail counter ticks up in your dashboard so you notice. Endpoints must be public https URLs, up to 5 per org, and the signing secret is shown exactly once at creation — store it like a password.

Webhooks are a Legend power. The app-open outcomes it exports are the same engine signal that powers the debugger's verdict and your click analytics — this just hands you the firehose.

The gist

Your links now ring a bell: created, updated, archived — and opened the real app, the one event nobody else can send. Point it at Zapier, Make, or your own server, and build on the signal. It shipped here in the changelog. ⚡

Ready? Start zipping →