When to Use
- Assignee re-routing: When a team member goes on leave, a scheduled workflow queries their open issues and uses
issue/update to reassign each one to a backup engineer, ensuring no issue is unattended during the absence.
- Priority escalation from monitoring: If a monitoring system detects that an existing incident is worsening (e.g. error rate climbs from 5% to 40%), a workflow automatically updates the corresponding Jira bug's priority from
High to Highest and appends escalation context to the description.
- Fix version stamping: At release branch cut, a workflow queries all "In Progress" issues in the sprint and sets their
fixVersion field to the new release version identifier, enabling accurate release tracking.
- Label management: A post-deployment verification workflow updates all issues deployed in a release by adding the
deployed-prod label and setting a custom field with the deployment timestamp.
- Story point synchronisation: When a planning tool exports updated estimates, a batch workflow reads the estimates and updates the
storyPoints custom field on the corresponding Jira stories to keep planning data in sync.
Configuration
Connection
| Field | Required | Description |
Host | Required | Jira instance base URL. Example: https://acmecorp.atlassian.net |
Email | Required | Atlassian account email. Example: automation@acmecorp.com |
ApiToken | Required | API token from Atlassian security settings. Store in Credentials Manager. |
Operation Fields
| Field | Required | Description |
IssueKey | Required | The key of the issue to update. Example: PROJ-123. |
Fields | Optional | JSON object of standard Jira fields to update. Keys use Jira's internal field names. Example: {"summary": "New title", "priority": {"name": "High"}, "assignee": {"name": "jsmith"}}. At least one of Fields or CustomFields must be provided. |
CustomFields | Optional | JSON object of custom field values. Keys are Jira field IDs (e.g. customfield_10016). Values must conform to the field's type format. |
Field format: Jira uses nested objects for some fields. Priority: {"name": "High"}. Assignee: {"name": "jsmith"} or {"accountId": "5b10a2..."} for Jira Cloud. Labels: ["label1", "label2"]. Story points: plain number in the custom field.
Sample Configuration
Escalate a bug's priority and update its description after worsening alert metrics:
{
"resource": "issue",
"operation": "update",
"Host": "https://acmecorp.atlassian.net",
"Email": "automation@acmecorp.com",
"ApiToken": "{{ $credentials.jiraApiToken }}",
"IssueKey": "{{ $json.issueKey }}",
"Fields": {
"priority": { "name": "Highest" },
"description": "{{ $json.originalDescription }}\n\n---\n**ESCALATED {{ $now }}**\nError rate climbed to {{ $json.errorRate }}%. Immediate attention required.\nAffected users: {{ $json.affectedUsers }}"
},
"CustomFields": {
"customfield_10050": "{{ $json.incidentId }}"
}
}
Validation Errors
| Error Code | Cause |
VAL_MISSING_ISSUE_KEY | IssueKey is empty or null. |
VAL_NO_FIELDS_TO_UPDATE | Both Fields and CustomFields are null or empty. |
VAL_INVALID_FIELDS_JSON | Fields is not valid JSON. |
ISSUE_NOT_FOUND | No issue exists with the given key, or insufficient access. |
FIELD_NOT_EDITABLE | One or more fields are read-only for this issue type or project configuration. |
AUTH_FAILED | Invalid credentials or expired API token. |
Output Fields
| Field | Type | Description |
status | string | "success" or "error" |
issueKey | string | Key of the updated issue. Example: "PROJ-123" |
resource | string | Always "issue" |
operation | string | Always "update" |
Sample Output
{
"status": "success",
"issueKey": "OPS-347",
"resource": "issue",
"operation": "update"
}
No body returned on update: The Jira REST API returns HTTP 204 No Content on a successful update. The node constructs the output object from the request — the update is confirmed by the "success" status with no error on the error port.
Expression Reference
| Expression | Type | Example Value | Use |
{{ $output.updateIssue.issueKey }} | string | "OPS-347" | Confirm which issue was updated in a log entry |
{{ $output.updateIssue.status }} | string | "success" | Guard downstream steps that depend on successful update |
Node Policies & GuardRails
- Partial updates only: Only supply fields you intend to change. The Jira API performs a merge — omitted fields remain unchanged. Do not reconstruct the entire issue object for updates.
- No status change via update: The
status field cannot be changed via issue/update. Status transitions must use issue/executeTransition. Attempting to set status via Fields will result in a FIELD_NOT_EDITABLE error.
- Account ID vs username: In Jira Cloud, assignee must be specified via
accountId not name. Use user/get to resolve a username to an account ID if needed.
Labels replace not append: | Setting the labels field replaces the entire label array. To add a label, first fetch the current labels via issue/get, append the new label, and set the full array. |
Workflow Examples
Example 1 — Escalate Priority on Worsening Metric
// Monitoring webhook fires with worsening error rate
// Step 1: issue/get — fetch current issue state
// Step 2: IfCondition — {{ $json.errorRate }} > 30 AND {{ $output.getIssue.priority }} !== "Highest"
// Step 3 (if escalation warranted): issue/update
{
"resource": "issue",
"operation": "update",
"IssueKey": "{{ $json.issueKey }}",
"Fields": {
"priority": { "name": "Highest" },
"labels": ["production", "escalated", "p0"]
}
}
// Step 4: Slack/postMessage — notify manager channel
Example 2 — Bulk Reassign on Team Member Absence
// Step 1: issue/getAll
{
"Jql": "assignee = \"{{ $json.absentUser }}\" AND status != Done"
}
// Step 2: Loop over issues
// Step 3 per issue: issue/update
{
"resource": "issue",
"operation": "update",
"IssueKey": "{{ $loopItem.key }}",
"Fields": {
"assignee": { "accountId": "{{ $json.backupUser.accountId }}" }
}
}