Issue Event
trigger.jira_event
TriggerBusiness appsconnection requiredruns in-engine
Mantle registers a Jira Cloud webhook on publish and deletes it on unpublish; one run per delivered event.
Start a run when a Jira issue, comment or worklog changes.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- Username & password
- Providers
- Jira
- Secret shape
- {"email", "api_token"}
- Config it needs
- domain
- Resolved by
- config.connection_id, else node.connection_id
Configuration
3 fields, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
events Which Jira events start a run. At least one. | array | No | ["jira:issue_created","jira:issue_updated"] | ≥ 1 characters; array of string | — |
jql_filter JQL restricting which issues fire, e.g. project = ENG AND issuetype = Bug. Leave empty and every issue in the site fires this workflow. | string | No | — | — | project = ENG AND issuetype = Bug |
allow_unsigned Arm this trigger even when Jira will not sign its deliveries. Every request to the callback URL is then accepted unverified — only tick it if your site cannot sign (Jira Server / Data Center). | boolean | No | false | — | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"allow_unsigned": false,
"events": [
"jira:issue_created",
"jira:issue_updated"
],
"jql_filter": "project = ENG AND issuetype = Bug"
}Output
One shape.
event
One Jira event, flattened. `payload` keeps the raw delivery.
| Field | Type | Example |
|---|---|---|
webhookEvent Jira's event name, e.g. jira:issue_updated. | string | jira:issue_updated |
issue_event_type_name The finer-grained issue event, e.g. issue_generic, issue_commented. | string | issue_updated |
timestamp When Jira raised the event, epoch milliseconds. | number | — |
issue.key Issue key, e.g. ENG-412. | string | ENG-412 |
issue.id Jira's numeric issue id, as a string. | string | — |
issue.summary The issue title. | string | — |
issue.status Status name, e.g. In Progress. | string | — |
issue.status_category To Do / In Progress / Done. | string | — |
issue.issue_type Issue type name, e.g. Bug. | string | — |
issue.priority Priority name, e.g. High. | string | — |
issue.labels Label strings on the issue. | array | — |
issue.url Browse URL for a human, e.g. https://site.atlassian.net/browse/ENG-412. | string | — |
issue.assignee.accountId Atlassian account id, or null when unassigned. | string | — |
issue.assignee.displayName Assignee's display name. | string | — |
issue.assignee.emailAddress Assignee's email, when Jira exposes it. | string | — |
issue.reporter.accountId | string | — |
issue.reporter.displayName | string | — |
issue.reporter.emailAddress | string | — |
issue.project.id | string | — |
issue.project.key Project key, e.g. ENG. | string | ENG |
issue.project.name | string | — |
user.accountId Who caused the event. | string | — |
user.displayName | string | — |
user.emailAddress Only when Jira exposes it; often absent. | string | — |
changelog Field changes on an update, each {field, field_type, from, to, from_id, to_id} — from/to are Jira's human values (fromString/toString), *_id the raw ids. | array | — |
changelog_id Jira's change-group id; part of the idempotency key. | string | — |
comment.id Present on comment_created / comment_updated. | string | — |
comment.body Comment text, flattened out of ADF when the site sends ADF. | string | — |
comment.author.accountId | string | — |
comment.author.displayName | string | — |
comment.author.emailAddress | string | — |
comment.created ISO 8601, as Jira sends it. | string | — |
comment.updated ISO 8601, as Jira sends it. | string | — |
worklog.id Present on the worklog_* events. | string | — |
worklog.time_spent Human form, e.g. 3h 30m. | string | — |
worklog.time_spent_seconds | number | — |
worklog.started ISO 8601 start of the logged work. | string | — |
worklog.comment | string | — |
worklog.author.accountId Who logged the work. | string | — |
worklog.author.displayName | string | — |
worklog.author.emailAddress | string | — |
payload The whole Jira delivery, verbatim — for anything the flattened fields above omit. | object | — |
{
"changelog": [],
"changelog_id": "",
"comment": {
"author": {
"accountId": "",
"displayName": "",
"emailAddress": ""
},
"body": "",
"created": "",
"id": "",
"updated": ""
},
"issue": {
"assignee": {
"accountId": "",
"displayName": "",
"emailAddress": ""
},
"id": "",
"issue_type": "",
"key": "ENG-412",
"labels": [],
"priority": "",
"project": {
"id": "",
"key": "ENG",
"name": ""
},
"reporter": {
"accountId": "",
"displayName": "",
"emailAddress": ""
},
"status": "",
"status_category": "",
"summary": "",
"url": ""
},
"issue_event_type_name": "issue_updated",
"payload": {},
"timestamp": 0,
"user": {
"accountId": "",
"displayName": "",
"emailAddress": ""
},
"webhookEvent": "jira:issue_updated",
"worklog": {
"author": {
"accountId": "",
"displayName": "",
"emailAddress": ""
},
"comment": "",
"id": "",
"started": "",
"time_spent": "",
"time_spent_seconds": 0
}
}Notes
- Mantle creates the webhook in Jira when the workflow is published and deletes it when the workflow is unpublished, disabled or archived — do not add it by hand.
- The connection's account must be a Jira administrator: registering a webhook is an admin operation, and publish fails with Jira's own message if it is not.
- Deliveries are signed. Mantle generates a random secret, registers it, and verifies the X-Hub-Signature HMAC over the raw body; a bad signature is refused before any run starts.
- If your site does not confirm signing (no isSigned on registration) the webhook is deleted again and the publish fails, rather than leaving an unauthenticated URL armed. Tick allow_unsigned to accept URL-only authentication anyway — then anyone who learns the callback URL can start runs.
- jql_filter and events are applied when the workflow is published, so they cannot use {{ }} expressions — there is no run to evaluate them against.
- Jira sends no delivery id. Runs are deduped on webhookEvent + issue id + timestamp + the change-group / comment / worklog id, so a Jira retry cannot start a second run.
- MANTLE_APP_PUBLIC_BASE_URL must be a public https:// URL — Jira refuses to register a plain-http or unreachable callback.
See Issue Event run in a workflow.
In a technical demo we add the Jira connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.