Webhooks
Webhooks let you receive real-time HTTP callbacks when events occur in AgileTune. Use them to integrate with external services, trigger CI/CD pipelines, or build custom automations.
Setting Up Webhooks
- Go to Organization Settings → Webhooks
- Click Add Webhook
- Enter a Payload URL — the endpoint that will receive POST requests
- Choose a Content type (JSON recommended)
- Generate or enter a Secret for signature verification
- Select the events you want to subscribe to
- Click Create Webhook
Available Events
| Event | Description |
|---|---|
| task.created | A new task is created |
| task.updated | A task's fields are changed |
| task.deleted | A task is permanently deleted |
| task.moved | A task is moved to a different column |
| comment.created | A comment is added to a task |
| member.added | A member is added to the organization |
| member.removed | A member is removed from the organization |
| project.created | A new project is created |
Payload Example
Each webhook delivery includes a JSON payload with the event type and relevant data:
{
"event": "task.updated",
"timestamp": "2026-03-20T12:00:00Z",
"data": {
"id": "tsk_abc123",
"title": "Implement login page",
"status": "in_progress",
"assignee": {
"id": "usr_xyz789",
"name": "Jane Doe"
},
"changes": {
"status": {
"from": "todo",
"to": "in_progress"
}
}
}
}Retry Policy
If your endpoint returns a non-2xx status code or times out (30-second limit), AgileTune retries the delivery with exponential backoff:
- 1st retry — after 1 minute
- 2nd retry — after 5 minutes
- 3rd retry — after 30 minutes
- 4th retry — after 2 hours
- 5th retry — after 12 hours
After 5 failed attempts, the webhook is marked as failing. You can view delivery logs and manually re-trigger deliveries from the webhook settings page.
Signature Verification
Every webhook delivery includes an X-AgileTune-Signature header containing an HMAC-SHA256 signature of the payload using your webhook secret. Always verify this signature to ensure the request is authentic:
import crypto from "crypto";
function verifySignature(payload: string, signature: string, secret: string) {
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}