Webhooks
Outbound webhooks let you subscribe to Colony pipeline events and receive an HTTP POST to any https:// endpoint you control. Use them to pipe Colony signals into Slack, PagerDuty, internal dashboards, or any automation that consumes HTTP.
Events
Section titled “Events”Each webhook subscription receives notifications for the events you choose at creation time. The table below lists all event types. webhook.test fires on demand from the Test button; digest.daily is the only pipeline-driven event currently emitted. The eight pipeline and PR event types are reserved and do not yet produce deliveries.
| Event | When it fires | Delivery |
|---|---|---|
issue.analyzed | Colony finished analyzing an issue and produced a work plan — the issue is ready for development. | Reserved |
issue.blocked | An issue has entered a blocked state (dependency-blocked, failure-blocked, or needs-clarification) and cannot progress without intervention. | Reserved |
issue.done | An issue completed the full pipeline cycle: PR merged and state reached done. This is the canonical completion event. | Reserved |
pr.opened | Colony opened a pull request for an issue. The PR URL and branch are included in the payload. | Reserved |
pr.approved | A reviewer approved a Colony pull request. Fires on each approval event. | Reserved |
pr.changes_requested | A reviewer requested changes on a Colony PR — the issue will be re-queued for development for revision. | Reserved |
pr.merged | A Colony pull request was successfully merged to the target branch. | Reserved |
cost.budget_warning | LLM token spend has approached or exceeded the configured cost threshold for the billing period. | Reserved |
digest.daily | A scheduled daily operator digest: pipeline throughput, cost, blocked work, anomalies, and recommendations. | Active |
webhook.test | A synthetic test event sent via the Test button. | Active |
To configure the email delivery channel for the daily digest — recipients, send time, timezone, and quiet mode — see Digest Notifications.
Role requirements
Section titled “Role requirements”| Action | Owner | Admin | Member | Viewer |
|---|---|---|---|---|
| Create webhook | ✓ | ✓ | — | — |
| Edit or delete webhook | ✓ | ✓ | — | — |
| Send test delivery | ✓ | ✓ | — | — |
| Replay a delivery | ✓ | ✓ | — | — |
| List webhooks | ✓ | ✓ | ✓ | ✓ |
| View delivery history | ✓ | ✓ | ✓ | ✓ |
Add a webhook
Section titled “Add a webhook”- Open Settings → Webhooks.
- Click Add webhook.
- Enter the URL — must start with
https://and be at most 2 048 characters. - Choose a Format:
- JSON payload (default) — Colony sends a JSON body signed with HMAC-SHA256. Use this for custom endpoints, automation platforms, and most integrations.
- Slack message — Colony sends a Block Kit message formatted for Slack. The URL must be a
hooks.slack.comincoming-webhook URL. No signature header is sent in this mode.
- Check the events you want to receive. At least one event is required.
- Optionally add a Description (up to 500 characters) to identify the webhook in the list.
- Click Add webhook.
Signing and verifying deliveries
Section titled “Signing and verifying deliveries”When a JSON-format delivery is sent, Colony includes three headers:
| Header | Value |
|---|---|
X-Colony-Signature | sha256=<hex> — HMAC-SHA256 of the raw request body, keyed with the signing secret |
X-Colony-Event | The event type, e.g. issue.done |
X-Colony-Delivery-Id | A UUID that uniquely identifies this delivery attempt |
The signing secret is a 64-character hex string (32 random bytes). To verify a delivery, compute HMAC-SHA256(secret, rawBody) and compare the result against the value in X-Colony-Signature after stripping the sha256= prefix. Always compare in constant time to prevent timing attacks.
Send a test delivery
Section titled “Send a test delivery”- Open Settings → Webhooks.
- In the webhook row, click Test.
- Colony queues a synthetic
webhook.testdelivery immediately. The test payload contains the event name, webhook ID, the user who triggered it, and a timestamp. - Click History on the same row to watch the delivery status update.
The test delivery follows the same retry and signing logic as a real event delivery.
Delivery history
Section titled “Delivery history”- Open Settings → Webhooks.
- In the webhook row, click History.
- The delivery history panel shows the most recent 100 deliveries, newest first.
Each row shows:
| Column | Description |
|---|---|
| Event | The event type that triggered the delivery |
| Status | pending — queued, not yet attempted; retrying — at least one attempt failed, more scheduled; delivered — endpoint returned 2xx; failed — all attempts exhausted |
| Attempts | Number of delivery attempts made so far |
| Response | HTTP status code from the most recent attempt |
| Created | When the delivery was first queued |
| Delivered | When the endpoint returned a successful 2xx response |
Replay a delivery
Section titled “Replay a delivery”- Open Settings → Webhooks.
- Click History on the webhook row.
- Find a delivery with status
failedorretryingand click Replay. - Colony resets the delivery’s attempt counter to zero and queues it for immediate re-delivery.
Replaying does not create a new delivery record — it reuses the existing one, resetting its state to pending and scheduling it to fire right away.
Retry schedule and auto-disable
Section titled “Retry schedule and auto-disable”Colony attempts each delivery up to 7 times. If the initial attempt fails, the remaining retries are spaced with exponential back-off plus ±20% random jitter to avoid thundering-herd bursts:
| Retry | Delay (approximate) |
|---|---|
| 1st retry | 30 seconds |
| 2nd retry | 2 minutes |
| 3rd retry | 10 minutes |
| 4th retry | 1 hour |
| 5th retry | 6 hours |
| 6th retry | 24 hours |
Each delivery attempt has a 30-second timeout. Payloads larger than 1 MB are dropped immediately without a retry attempt.
A delivery is counted as successful when the endpoint returns any 2xx HTTP status code.