Webhooks
Webhooks let you receive real-time notifications when events happen in your workspace.
Creating a Webhook
- Go to Settings → Manage Webhooks
- Click Register Webhook
- Enter the URL where notifications should be sent
- Optionally add a secret for signature verification
- Click Create

Event Types
Webhooks are triggered for these events:
| Event | When It Fires |
|---|---|
ingestion.completed | A data ingestion job finishes |
ingestion.failed | A data ingestion job fails |
kpi.computed | A KPI value is computed |
kpi.alert | A KPI anomaly is detected |
analysis.completed | An investigation finishes |
dashboard.ready | A dashboard build completes |
Payload Format
{
"event": "ingestion.completed",
"timestamp": "2025-01-15T10:30:00Z",
"tenantId": "tenant_abc123",
"data": {
"jobId": "job_xyz",
"table": "sales_data",
"rowsIngested": 15234,
"duration": 3200
}
}
Signature Verification
If you configured a secret, each webhook includes an X-Webhook-Signature header with an HMAC-SHA256 signature of the body:
X-Webhook-Signature: sha256=abc123...
Verify it in your service:
const crypto = require('crypto')
const signature = crypto
.createHmac('sha256', YOUR_SECRET)
.update(requestBody)
.digest('hex')
const isValid = signature === receivedSignature
Managing Webhooks

Actions
| Action | Description |
|---|---|
| Test | Send a test event to verify connectivity |
| Delivery History | View past deliveries with status codes and timestamps |
| Delete | Remove the webhook |
Delivery History
Each delivery shows:
- Status code — 200 = success, other = failure
- Timestamp — When the event was sent
- Response time — How long your server took to respond
- Resend — Re-deliver a specific event
Dead Letter Queue (DLQ)
Failed deliveries go to the Dead Letter Queue after multiple retry attempts. From the DLQ you can:
- View failed events with error messages
- Replay individual events
- Replay All to retry all failed events
info
Retry policy: Failed deliveries are retried up to 3 times with exponential backoff (1min, 5min, 15min). After all retries fail, the event goes to the DLQ.