Webhooks
A webhook in Webhooks Pro is one outbound integration: a URL that receives JSON when configured Jira events happen, when a CRON schedule fires, or when a workflow transition runs the Trigger Webhook post function.
When to use it
Create a webhook whenever you need to push Jira changes out of Jira automatically:
An external service should react to issue creates / updates / comments / transitions.
You're bridging Jira to chat, paging, ticketing, CI/CD, or a data warehouse.
You need a periodic JQL snapshot delivered somewhere on a schedule.
If you only need one URL receiving everything, Jira's built-in webhooks are simpler. Reach for Webhooks Pro when you need any of: filtering, payload shaping, scheduling, signing, retries, or a delivery log.
How it works
For each enabled webhook, Webhooks Pro:
Subscribes to the Jira events you tick on the Events tab.
(Issue events only) runs the JQL filter if set — non-matching events are dropped.
Holds the event for the debounce window so a burst of edits to the same entity collapses into one delivery.
Renders the payload template against the event context.
Sends the request to the configured URL with your headers and (optional) HMAC signature.
Logs the full request, response, and timing — replayable from Webhook Logs.
A webhook can fire from up to three sources: Jira events, a CRON schedule, or a workflow post function. They use the same URL, headers, payload template, and signing settings.
Configure
The Webhooks page has two surfaces: the list (every webhook on this Jira) and the create / edit form.
From the list page
Create webhook (top right) — opens an empty form.
Click a row's name or its pencil icon — edit.
Status toggle — enable / disable in place.
Clone icon — duplicate as inactive
(Copy).⋯ → Delete — removes the webhook and all related data (events, headers, query params, transition bindings, delivery logs).
Export (next to Create) — downloads a JSON bundle of every webhook plus the payload templates they use, ready for re-import on another tenant.
Filters on the list: name/URL search, status, event group, page size.
In the create / edit form
Section | What you set | Sub-page |
|---|---|---|
General | Name, Active, Description | (this page) |
URL | Method, URL, payload template, headers, query params | (this page) |
Security | HMAC signing secret | |
Events | Which Jira events fire the webhook + JQL filter | |
Schedule | CRON-driven periodic delivery | |
Transitions | Workflow transitions wired via post function (read-only here) |
{{ … }} placeholders in URL, headers, and query params
The URL, every header (key and value), and every query parameter (key and value) accept the same {{ … }} syntax used by Custom JSON payload templates — same root context (event, issue, project, entity, baseUrl, timestamp), same formatters (:number(…), :date(…), :json, :string).
URL https://api.example.com/issues/{{issue.key}}/events
URL https://api.example.com/p/{{issue.project.key}}
Header X-Issue-Key = "{{issue.key}}"
Header X-Event = "{{event}}"
Query project = "{{issue.project.key}}"
Query date = "{{timestamp:date(yyyy-MM-dd)}}"Substituted values in the URL are URL-encoded automatically; literal characters (:, /, ?, =, #) stay as written.
Don't put secrets in placeholders. A static
Authorizationtoken belongs in a literal header value — not pulled from an issue field. Anything resolved from Jira data ends up in the delivery log.
Save behaviour
Save is in the top right. Keyboard: Ctrl+S / ⌘S.
The first save to a new destination host triggers a Forge egress approval dialog for the Jira admin. See Approve egress to your endpoint.
After save, existing event subscriptions pick up the new webhook with no restart.
Send Test (edit mode only)
Fires a one-off delivery using a synthetic issue payload. Useful for validating the receiver without making a real Jira change. The HTTP status and round-trip time appear right in the form.
Examples
Minimum: send every issue create/update to one URL
|
|
|---|---|
Method |
|
URL |
|
Payload template |
|
Events | Issue created, Issue updated |
JQL | (none) |
Per-project URL via a placeholder
|
|
|---|---|
Method |
|
URL |
|
Payload template |
|
Events | Issue updated |
JQL |
|
Signed delivery with a custom header
|
|
|---|---|
Header |
|
Security → Signing secret |
|
Events | Comment created |
The receiver verifies X-Webhook-Signature: sha256=<hex> against the same secret — see HMAC signing and secrets.
Limits and gotchas
At least one event required — the form will not save with zero ticked.
Auto-disable — too many consecutive failures flips the webhook to
AUTO-DISABLED(red lozenge). Tune the threshold in Auto-disable thresholds, or re-enable manually after fixing the receiver — see Re-enable an auto-disabled webhook.HTTP method
GETsends no body — payload templates are still rendered for the URL/headers/query, but the body is empty. The HMAC signature, if enabled, is computed over the empty string.Egress approval is per host, not per webhook — once the admin approves
api.example.com, every webhook in this app can reach it.You cannot retrieve a saved signing secret. Rotation is one-way. Keep your own copy in a vault. See HMAC signing and secrets.
Schedules are UTC. The form does not convert from your locale. See UTC semantics and the fire-window.
Workflow transition bindings are managed in Jira's workflow designer, not on this page. The Transitions section is read-only with deep links to the relevant transitions.
Sub-pages
Related
Payload templates — shape the JSON body.
Webhook logs — inspect, filter, replay.
Scheduled webhooks — fire on a CRON schedule.
Trigger Webhook post function — wire a webhook to a workflow transition.
Tenant settings — retries, auto-disable, timeouts, retention.