WorkestraDocs
ModulesSupport

Outbound Webhooks

Push ticket events to your own systems with HMAC-signed delivery, retries, and a settings UI for testing.

Webhooks let you mirror Workestra ticket activity into other systems — your CRM, Slack, an internal incident tracker, a data warehouse. Workestra POSTs a JSON payload to your endpoint every time a subscribed event happens.

Creating a Webhook

Permission required: workspace Admin or Owner.

  1. Go to Support > Settings > Webhooks
  2. Click Add webhook
  3. Fill in the form:
FieldDescription
NameHuman-readable label (e.g. "Slack #support-feed")
URLThe HTTPS endpoint that will receive POSTs
EventsCheck the boxes for the events you want to receive
ActiveOff by default — enable after testing
  1. Click Create
  2. Copy the signing secret from the dialog — it's shown only once

Available Events

EventFires When
ticket.createdA new ticket is opened from any channel
ticket.updatedAny field on a ticket changes
ticket.field_changedA specific field changes (carries before/after values)
ticket.status_changedStatus moves between values
ticket.priority_changedPriority moves between values
ticket.assignedAssignee changes (or a ticket gets its first assignee)
ticket.label_addedA label is added
ticket.label_removedA label is removed
ticket.customer_repliedThe customer adds a comment or reply
ticket.agent_respondedAn agent posts a public reply
ticket.escalatedThe ticket is manually escalated
ticket.resolvedThe ticket is moved to a resolved status
ticket.closedThe ticket is moved to a closed status
ticket.deletedThe ticket is archived
ticket.sla_warningThe SLA warning threshold is crossed
ticket.sla_breachedThe SLA resolution time is exceeded
ticket.sentiment_changedThe sentiment label moves between buckets

You can subscribe to any subset. Most webhooks subscribe to 2–4 events relevant to their downstream system.

Payload Format

Each delivery is a POST with Content-Type: application/json:

{
  "event": "ticket.status_changed",
  "delivered_at": "2026-05-12T14:23:00.000Z",
  "workspace_id": "wks_...",
  "ticket": {
    "id": "tkt_...",
    "reference": "TKT-0042",
    "title": "Login broken on Safari",
    "status": "in_progress",
    "priority": "high",
    "assignee_id": "usr_...",
    "customer_email": "alex@example.com"
  },
  "changes": {
    "status": { "from": "open", "to": "in_progress" }
  }
}

The ticket object is the canonical ticket shape — same as the one returned by the public ticket API. The changes object is present on update-flavored events and lists what changed.

Verifying the Signature

Every delivery is signed with HMAC-SHA256 using the secret you copied at creation time. The signature is in the X-Workestra-Signature header:

X-Workestra-Signature: sha256=ab12cd34...

Your endpoint should:

  1. Read the raw request body
  2. Compute HMAC-SHA256(body, secret).hex()
  3. Compare with the value after sha256= using a constant-time string comparison
  4. Reject the delivery if they don't match

Reject any delivery without a signature header — that's how you protect against spoofed POSTs to your endpoint URL.

Example (Node.js)

import crypto from "node:crypto";

function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signatureHeader),
    Buffer.from(expected)
  );
}

Retries and Failures

Workestra retries failed deliveries with exponential backoff:

AttemptDelay after previous
1— (immediate)
2~5 minutes
3~30 minutes
4~3 hours
5~12 hours
FinalAfter ~24 hours total — delivery is marked failed

A delivery is considered successful if your endpoint returns a 2xx status code within 10 seconds. Any other response (4xx, 5xx, timeout, connection refused) counts as a failure and is retried.

Failed deliveries are visible in the Deliveries tab of the webhook detail page, with the response code, body, and timestamp.

Make your endpoint idempotent. The same event can deliver more than once if your endpoint times out and Workestra retries. Use the delivered_at timestamp + the event payload as a deduplication key on your side.

Testing a Webhook

Before flipping a new webhook to Active, send a test event:

  1. Open the webhook's detail page
  2. Click Send test
  3. Pick an event type from the dropdown
  4. Click Fire

Workestra POSTs a synthetic payload (with event: "webhook.test" and a sample ticket) to your URL and shows the response inline. Use this to confirm your endpoint is reachable, your signature verification works, and your handler doesn't crash on the canonical shape.

Disabling and Deleting

ActionEffect
Toggle Active offStops new deliveries; existing failed retries are abandoned
DeleteRemoves the webhook and its delivery history; cannot be undone

To pause without losing history, toggle Active off. To rotate a leaked secret, delete the webhook and create a new one — Workestra doesn't support in-place secret rotation.

When NOT to Use Webhooks

  • For agent-facing notifications, use Workestra's built-in inbox + email — webhooks aren't visible in the app
  • For periodic exports, use the public API — webhooks deliver one event at a time
  • For fetching data, webhooks push, not pull — use the API for queries

Next Steps

  • Developer API — Pull current ticket state via the public API
  • API Keys — Authenticate webhook handlers that call back into Workestra
  • SLA Policies — The source of ticket.sla_warning and ticket.sla_breached events