Webhooks

What gets delivered
The event payload
Create a webhook

Shape the request body

data fields; each inserts a $path reference.Timeouts and retries
Monitor deliveries

Troubleshooting
Last updated
Was this helpful?
Webhooks deliver build and release events from codev to any HTTP endpoint. When a build completes, a build fails, or a release is deployed or finalized, codev sends an HTTP request to the URL you configure — carrying a stable event payload you can reshape into whatever body your destination expects. Unlike the Slack and Microsoft Teams integrations, which post preformatted messages to a chat channel, a webhook is a raw delivery to an endpoint you control: an automation server, an internal service, a serverless function, or a chat provider's own incoming webhook.
You manage webhooks under Settings > Webhooks. Each webhook has its own delivery log, retry policy, and error count.

A webhook fires on one event. codev emits four events to webhooks:
Event
When it fires
Key data fields
Release Deployed (release.deployed)
A release finishes deploying to an environment
releaseName, domain, environmentName, environmentCategory, deploymentStatus
Release Finalized (release.finalized)
A release is finalized
releaseName, domain, intermediateCandidatesFinalized
Build Completed (build.completed)
A build completes after a merge
commitId, buildStatus, buildResults, workItems
Build Failed (build.failed)
A build fails
commitId, buildStatus, buildResults
Every event is delivered with the same envelope. Event-specific fields live under data; the envelope fields are hoisted to the top level so a body template can reference them the same way for any event.
With no body template, codev sends this payload as-is. A body template lets you send a different shape (see Shape the request body).
Go to Settings > Webhooks and click Add Webhook.
Give it a Name and pick the Event it fires on.
Enter the Webhook URL and the HTTP Method (POST, PUT, or PATCH).
Add any Headers the destination needs — an authorization token, a content type, a signing header.
Set the Timeout, Retry Count, and Retry Delay (see Timeouts and retries).
Optionally add a Body Template to reshape the payload.
Click Add Webhook.
The Provider field tags the destination type. Leave it on Custom to deliver to any HTTP endpoint.

By default codev delivers the event payload verbatim. A Body Template rewrites it into the shape your destination expects. The template is JSON; to pull a value from the event, use a $path reference:
codev replaces each { "$path": "…" } with the value at that path in the event payload, and sends the resulting JSON as the request body. Everything else in the template is sent literally, so you can mix static fields with pulled values. Leaving the template empty sends the raw event payload.
The editor validates the JSON as you type and lists the merge fields available for the selected event beside it, in two groups: the envelope fields present on every event, and the event-specific data fields. Click a field to insert its $path reference, or type inside a $path string for autocomplete.

data fields; each inserts a $path reference.For example, to post a message to an endpoint that expects text, release, environment, and status:
A release.deployed event then delivers:
Each delivery has a per-attempt Timeout (default 30000 ms). If the endpoint returns a non-2xx status or does not respond within the timeout, codev retries up to Retry Count times (default 3), waiting Retry Delay (default 1000 ms) between attempts. A delivery is a success once any attempt returns a 2xx; it is a failure once the retries are exhausted, and the webhook's error count increases.
Open a webhook's Delivery history from the list to see every delivery, with totals and a success rate. Filter by status — all, success, failed, or retrying — and select a delivery to inspect its Overview, Request, Response, and per-Attempts timeline, including the response code and duration. Retry re-sends a delivery on demand.

No deliveries arrive — confirm the webhook's status is Active and its Event matches what you expect to fire. Only the four events above are delivered.
Deliveries fail — open the delivery's Response and Attempts to see the status code and error. A 4xx usually means the body or headers are wrong for the destination; a timeout means the endpoint was slow — raise the Timeout or check the endpoint.
The endpoint expects a specific shape — add a body template so codev sends exactly the fields it needs.
Last updated
Was this helpful?
Was this helpful?
{
"event": "release.deployed",
"repository": "acme/core",
"timestamp": "2026-08-04T13:03:00.000Z",
"actor": "developer@acme.com",
"data": {
"releaseName": "1.4.0",
"domain": "core",
"environmentName": "production",
"environmentCategory": "release",
"deploymentStatus": "Success"
}
}{ "$path": "data.releaseName" }{
"text": { "$path": "event" },
"release": { "$path": "data.releaseName" },
"environment": { "$path": "data.environmentName" },
"status": { "$path": "data.deploymentStatus" }
}{
"text": "release.deployed",
"release": "1.4.0",
"environment": "production",
"status": "Success"
}