When to Use
- Compliance audit export: Regulated organizations require a full audit trail of issue changes. A monthly compliance workflow retrieves the changelog for all change-request issues, filters for status changes and assignee changes, and exports them to a MongoDB audit collection for submission to auditors.
- Time-in-status calculation: To report on engineering cycle time (time from "In Progress" to "Done"), a reporting workflow reads the changelog, finds the timestamps for each status transition, and calculates the elapsed time for SLA tracking and sprint retrospectives.
- Priority change alerts: A monitoring workflow calls
getChangelog on high-priority issues and checks if priority was recently downgraded by someone other than a team lead. If an unauthorized downgrade is detected, it alerts the engineering manager.
- Reassignment tracking: HR and team management workflows analyse assignee-change history across issues to detect unusual reassignment patterns — for example, a task being passed between five engineers without resolution may indicate a blocker requiring management attention.
- Rollback detection: In a CI/CD-integrated workflow, if a deployment issue is transitioned backwards (e.g. from "In Review" back to "In Progress"), the changelog records this. A monitoring workflow detects backward transitions and triggers a Slack alert to the engineering lead.
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 retrieve changelog for. Example: PROJ-123. Returns all recorded field changes since issue creation. |
Sample Configuration
{
"resource": "issue",
"operation": "getChangelog",
"Host": "https://acmecorp.atlassian.net",
"Email": "automation@acmecorp.com",
"ApiToken": "{{ $credentials.jiraApiToken }}",
"IssueKey": "{{ $json.issueKey }}"
}
Validation Errors
| Error Code | Cause |
VAL_MISSING_ISSUE_KEY | IssueKey is empty or null. |
ISSUE_NOT_FOUND | No issue exists with the given key, or the user lacks view access. |
AUTH_FAILED | Invalid credentials or expired API token. |
Output Fields
| Field | Type | Description |
status | string | "success" or "error" |
changelog | array | Array of changelog history entries, oldest first. Each entry has id, author (display name), created (ISO timestamp), and items (array of field changes with field, fromString, toString). |
resource | string | Always "issue" |
operation | string | Always "getChangelog" |
Sample Output
{
"status": "success",
"changelog": [
{
"id": "10101",
"author": "Sarah Chen",
"created": "2026-05-26T08:15:00.000Z",
"items": [
{
"field": "status",
"fromString": "To Do",
"toString": "In Progress"
}
]
},
{
"id": "10102",
"author": "Marcus Webb",
"created": "2026-05-26T11:45:22.000Z",
"items": [
{
"field": "priority",
"fromString": "High",
"toString": "Highest"
},
{
"field": "assignee",
"fromString": "Marcus Webb",
"toString": "Sarah Chen"
}
]
},
{
"id": "10103",
"author": "Sarah Chen",
"created": "2026-05-26T14:30:05.000Z",
"items": [
{
"field": "status",
"fromString": "In Progress",
"toString": "Done"
}
]
}
],
"resource": "issue",
"operation": "getChangelog"
}
Expression Reference
| Expression | Type | Example Value | Use |
{{ $output.getChangelog.changelog }} | array | All history entries | Iterate for time-in-status analysis |
{{ $output.getChangelog.changelog.length }} | integer | 3 | Count total change events |
{{ $output.getChangelog.changelog[0].author }} | string | "Sarah Chen" | First change author |
{{ $output.getChangelog.changelog[0].created }} | string | ISO timestamp | Calculate time-in-status by diffing timestamps |
{{ $output.getChangelog.changelog[0].items[0].field }} | string | "status" | Filter for specific field changes |
Node Policies & GuardRails
- Changelog is read-only: This operation cannot be used to delete or modify changelog entries. Jira changelog entries are immutable audit records.
- Large changelogs on long-lived issues: Issues that have been active for months or years may have hundreds of changelog entries. Process results with filtering logic to extract only the change type you need rather than passing the full array to downstream nodes.
- Sensitive field exposure: Changelog entries may contain sensitive data in field values (e.g. assignee email addresses, custom field content). Ensure compliance with data handling policies when storing or transmitting changelog data.
- Time zone handling: The
created field is in UTC ISO 8601 format. Apply time zone conversion in your workflow if displaying times to users in their local time zone.
Workflow Example — Cycle Time Reporting
// Step 1: issue/getAll — get all Done issues in sprint
// Step 2: Loop over each issue
// Step 3 per issue: issue/getChangelog
{
"resource": "issue",
"operation": "getChangelog",
"IssueKey": "{{ $loopItem.key }}"
}
// Step 4: Function node — extract status transition times
// const statusChanges = $output.getChangelog.changelog
// .flatMap(e => e.items.filter(i => i.field === "status").map(i => ({...i, at: e.created})));
// const inProgressAt = statusChanges.find(s => s.toString === "In Progress")?.at;
// const doneAt = statusChanges.find(s => s.toString === "Done")?.at;
// const cycleTimeHours = (new Date(doneAt) - new Date(inProgressAt)) / 3600000;
// return { issueKey: $loopItem.key, cycleTimeHours };
// Step 5: MongoDB/insert — store cycle time metrics