Menu ☰

Webhooks

Signed event deliveries — sync your app in real time instead of polling. Buffer's biggest gap, closed.

Events

ParameterTypeDescription
update.senteventA scheduled or instant update was accepted by the network (this is the billable moment)
update.failedeventThe network rejected the update — payload includes the reason
update.createdeventAn update was queued (create call succeeded)
update.approvedeventA pending update passed the approvals workflow
channel.connectedeventA network was connected to the workspace
channel.schedule_updatedeventTime slots changed
quota.exceededeventSuccessful-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"
  }
}
POST to your endpoint
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"]));
}
verify the signature (Node)

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.