Jira Issue SLA Breach Escalation
Hourly flow queries Jira via JQL for issues approaching or breaching their SLA, escalates each by adding a comment, reassigning per an escalation matrix, and notifying the lead in Teams plus an Outlook email to the manager. Tracks repeat breaches and bumps severity on the second escalation.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow enforces SLAs on Jira issues. On an hourly recurrence it runs a JQL search for issues that are open and past their SLA/due target, then for each breaching issue it adds an escalation comment, reassigns it to a first-tier escalation owner, and pings the team lead in a Teams channel. A Dataverse breach-ledger tracks how many times each issue has been escalated and the date it was last escalated; on a repeat breach (escalation count ≥ a configurable threshold) it raises the issue priority and emails the manager. The ledger also de-duplicates so an issue is escalated at most once per day.
Why it matters: Jira's native SLA features live in JSM premium tiers; many teams on standard Jira have no automated breach handling. This flow brings an SLA nudge-then-escalate ladder to any Jira project using JQL + comments + assignment, with management visibility and an auditable escalation history.
Status: Built as a demo — ships Off (Stopped). Going live requires only authorising the connections and setting the environment variable values.
Use Case
A delivery team commits to response/resolution times, but issues silently age past them. They want an automatic ladder so breaches get a human owner and management visibility without a daily manual triage meeting. First breach → comment + reassign + Teams ping. Repeat breach → priority bump + manager email. The Dataverse ledger prevents the same issue being re-escalated every hour and records the full escalation history for audit.
Flow Architecture
Recurrence Hourly SLA Check
Recurrence (every 1 hour, EST)Hourly scan for Jira issues past their SLA target.
Initialize Config
Initialize VariableLoad Jira instance/base URL/email/token, project key, SLA JQL fragment, escalation assignee, manager email, Teams group/channel, varBumpPriority (High), varRepeatThreshold (2) and a guid() correlation id.
Compose Full JQL
ComposeBuild project = key AND SLA fragment ORDER BY priority DESC.
Search Issues JQL
HTTP — GET /rest/api/3/search/jqlRun the JQL with Basic auth; returns issues[].
Apply To Each Issue
Foreach (sequential, concurrency 1)Iterate each breaching issue; read its ledger row (Dataverse ListRecords) and derive prior count + once-per-day de-dup keys.
Condition Should Escalate
ConditionEscalate if first breach (no row) or not already escalated today.
Escalate Issue
Jira — AddComment + EditIssue; Microsoft Teams — PostMessageToConversationCompose new count, add an escalation comment, reassign to the escalation owner, and ping the lead in Teams.
Repeat Breach
Condition + Jira — EditIssue + Office 365 Outlook — SendEmailV2When new count ≥ varRepeatThreshold, bump priority and send a high-importance email to the manager.
Upsert Ledger
Compose + Condition + Microsoft Dataverse — UpdateRecord / CreateRecordWrite the ledger row (count, timestamp, status, priority, correlationId); update if a row exists, else create.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_JiraInstance | String | <configure> | Jira instance id (connector X-Request-Jirainstance; not used by the HTTP search). |
| flowlibs_JiraBaseUrl | String | https://your-domain.atlassian.net | Jira site base URL for the REST search + browse links. |
| flowlibs_JiraEmail | String | you@contoso.com | Atlassian account email (Basic auth on the REST search). |
| flowlibs_JiraApiToken | String | <configure> | Atlassian API token (Basic auth on the REST search). |
| flowlibs_JiraProjectKey | String | OPS | Project to monitor. |
| flowlibs_SlaJqlFragment | String | due < now() AND statusCategory != Done | JQL breach predicate. |
| flowlibs_EscalationAssignee | String | <configure> | First-tier escalation owner (Atlassian accountId). |
| flowlibs_ManagerEmail | String | manager@contoso.com | Repeat-breach email recipient. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams team (group) id for the escalation channel. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Jira | shared_jira | AddComment EditIssue |
| HTTP | http | GET /rest/api/3/search/jql |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
| Microsoft Dataverse |
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- SLA source
- Change flowlibs_SlaJqlFragment. If you store SLA targets in a custom field, fold it into the JQL via cf[12345].
- Escalation matrix
- The demo reassigns every breach to a single flowlibs_EscalationAssignee. Replace it with a Dataverse/SharePoint lookup keyed by component or priority for a true matrix.
- Repeat threshold / priority
- Adjust varRepeatThreshold (Initialize Variable) to escalate to management sooner, and varBumpPriority to match your project's priority scheme (e.g. Highest).
- De-dup window
- The flow escalates an issue at most once per calendar day (UTC). To change the cadence, edit Compose Last Day / Compose Today (e.g. compare full timestamps with an hours threshold).
- Recurrence
- The trigger runs hourly in Eastern Standard Time; change the frequency/time zone to fit your working hours.
- Going live
- Authorise the Jira, Teams, Outlook and Dataverse connections, set all flowlibs_ env var values (especially flowlibs_JiraApiToken), and turn the flow On.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Full JQL build
Assemble the project-scoped breach JQL.
EXPR.02REST search URI
Jira Cloud JQL search endpoint with the encoded JQL.
EXPR.03Ledger lookup filter
Find the ledger row for the current issue key.
EXPR.04Prior escalation count
Prior count from the ledger row, defaulting to 0.
EXPR.05Once-per-day de-dup gate
Escalate on first breach or when not already escalated today.
EXPR.06Reassign fields object
Bound to body/fields on EditIssue.
EXPR.07Issue browse URL
Build the Jira browse link for the issue.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.