Webhooks
Outbound webhooks let you receive real-time HTTP POST notifications when events occur in your project. Pro
Overview
Webhooks deliver a JSON payload to any HTTPS endpoint you configure whenever a specific event happens in your project. Each webhook can subscribe to one or more of the following events:
| Event | Description |
|---|---|
post.created | A new feedback post is submitted |
post.updated | A feedback post is edited |
post.deleted | A feedback post is deleted |
comment.created | A new comment is added to a post |
comment.updated | A comment is edited |
comment.deleted | A comment is deleted |
post.status_changed | A post’s status changes (open, planned, in progress, done) |
message.created | A new private message is sent |
message.updated | A private message is edited |
message.deleted | A private message is deleted |
beta_feedback.created | A beta tester submits feedback on a beta program |
beta_feedback.deleted | A beta feedback item is deleted |
waitlist_signup.created | A visitor joins the waitlist |
waitlist_signup.invited | A waitlist entry is invited off the list |
waitlist_signup.joined | An invited entry accepts and joins |
csat_survey.completed | A CSAT satisfaction survey is completed with a rating |
Webhooks are scoped to individual projects. Each project has its own set of webhook endpoints with independent configurations and signing secrets.
Configuring a webhook
- Go to your project’s Integrations page
- Scroll to the Outbound Webhooks section
- Click Add webhook
- Enter your endpoint URL (must be HTTPS in production)
- Select which events to subscribe to
- Click Save
After saving, a signing secret is displayed once. Copy it immediately — it cannot be retrieved later. You can regenerate it at any time from the webhook’s actions menu.
Verifying webhook signatures
Every webhook delivery includes an X-SupDesk-Signature header containing
an HMAC-SHA256 signature of the request body. To verify a webhook:
- Compute
HMAC-SHA256(your_signing_secret, raw_request_body) - Compare the result with the hex value in the
X-SupDesk-Signatureheader (after thesha256=prefix) - Use constant-time comparison to prevent timing attacks
Node.js
import { createHmac, timingSafeEqual } from "crypto";
function verifyWebhook(secret, body, signature) {
const expected = createHmac("sha256", secret)
.update(body)
.digest("hex");
const sig = signature.replace("sha256=", "");
return timingSafeEqual(Buffer.from(expected), Buffer.from(sig));
}Python
import hmac
import hashlib
def verify_webhook(secret: str, body: bytes, signature: str) -> bool:
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
sig = signature.removeprefix("sha256=")
return hmac.compare_digest(expected, sig)Ruby
require "openssl"
def verify_webhook(secret, body, signature)
expected = OpenSSL::HMAC.hexdigest("SHA256", secret, body)
sig = signature.sub("sha256=", "")
Rack::Utils.secure_compare(expected, sig)
endTesting a webhook
Click the Test button next to a webhook to send a sample payload to its
endpoint. The test payload has "event": "test" and a data.message field.
Use a tool like webhook.site to inspect the delivered
request.
Delivery log
The Delivery log shows the last 50 delivery attempts for each webhook, including:
- Event — which event was delivered
- Status —
successorfailed - Response code — HTTP status code from the endpoint
- Attempts — number of delivery attempts (including retries)
- Time — when the delivery was attempted
Retry behavior
When a webhook delivery fails (5xx response or network timeout), SupDesk retries up to 3 times with exponential backoff:
| Attempt | Delay |
|---|---|
| 1 | Immediate |
| 2 | 1 second |
| 3 | 2 seconds |
Client errors (4xx) are not retried — they indicate a permanent problem with the endpoint configuration.
Plan requirements
Outbound webhooks are available on Pro and Team plans.
Pro