Webhooks
Signed event deliveries — sync your app in real time instead of polling. Buffer's biggest gap, closed.
Events
| Parameter | Type | Description |
|---|---|---|
| update.sent | event | A scheduled or instant update was accepted by the network (this is the billable moment) |
| update.failed | event | The network rejected the update — payload includes the reason |
| update.created | event | An update was queued (create call succeeded) |
| update.approved | event | A pending update passed the approvals workflow |
| channel.connected | event | A network was connected to the workspace |
| channel.schedule_updated | event | Time slots changed |
| quota.exceeded | event | Successful-post quota hit on a hard-capped plan |
Payload & signature
X-BufferSass-Event: update.sent
X-BufferSass-Signature: sha256=1f3a…
{
"event": "update.sent",
"data": {
"id": "upd_7c2…", "channel_id": "cha_9a1…",
"service": "x", "text": "Ship day! v2.4 is live 🚀",
"sent_at": "2026-11-10T14:30:02Z"
}
}import crypto from "crypto";
export function verify(req) {
const raw = req.rawBody; // exact bytes
const expected =
"sha256=" + crypto.createHmac("sha256", process.env.WH_SECRET).update(raw).digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected), Buffer.from(req.headers["x-buffersass-signature"]));
}Reliability
- Deliveries are real outbound
POSTs with signed headers (X-BufferSass-Event,X-BufferSass-Delivery,X-BufferSass-Signature) and log to the dashboard (Webhooks → deliveries) with the response status code (0= endpoint unreachable). - Non-2xx responses retry with backoff (up to 3 attempts) on Starter plans and above.
- Replay any delivery from the dashboard while debugging.
- Buffer reports live delivery failures. Sync from Buffer to see the failure message and retry the post in Buffer.