Webhooks: get every click as a POST
Have your own server POSTed to every time a link is clicked. Slack / Discord / your CRM / your spreadsheet.
Webhooks are a Pro feature. We POST a small JSON payload to an HTTPS endpoint you control every time a click happens. Pair this with Slack incoming webhooks, Zapier, n8n, your own server, anything that takes an HTTP POST.
Step 1: Register the endpoint
- Settings → Tracking → Webhooks → + New webhook.
- Name: for your reference only ("#growth in Slack").
- URL: the endpoint we'll POST to. Must be HTTPS.
- Secret: optional. If set, we sign the payload with HMAC-SHA256 in the x-bnkl-signature header.
- Save.
Step 2: Subscribe a link to the webhook
- Edit → Tracking tab → toggle the webhook in the list. Multiple webhooks can fire on the same link.
- Save.
The payload we POST
{
"event": "click",
"slug": "spring-drop",
"link_id": "uuid",
"destination": "https://...",
"ts": "2026-05-17T12:34:56Z",
"referer": "https://...",
"country": "US",
"region": "California",
"browser": "Chrome",
"device": "mobile",
"is_qr_scan": false
}
Verifying the signature
If you set a secret, the request will carry `x-bnkl-signature: sha256=<hex>`. Compute HMAC-SHA256 over the raw request body using your secret; compare to the header value.
// Node example
const crypto = require("crypto");
const expected = "sha256=" + crypto.createHmac("sha256", secret)
.update(rawBody).digest("hex");
if (expected !== req.headers["x-bnkl-signature"]) {
return res.status(403).end();
}
Retry / timeout behaviour
- Each POST has a 1.5-second timeout; we won't keep a visitor's redirect waiting on your endpoint.
- We don't retry. If your endpoint is down, the click is logged in our database but you don't get the POST.
- For higher reliability, point the webhook at a queue (SQS, Inngest, Pipedream) that your real consumer reads from.
Common patterns
- Slack notification: point at a Slack incoming webhook URL. Slack expects { text: "..." }; use a Zap/Pipedream/your own bridge to reshape our payload.
- Sheet logger: point at a Google Apps Script web app or a Zapier zap that appends to a sheet row.
- Internal CRM enrichment: point at your own endpoint to attach the geo + device data to the lead.