Zendesk SLA Breach Escalation
On a schedule, the flow scans open Zendesk tickets against SLA policies, flags those approaching or past breach, escalates them to a manager in Teams and email, and adds an internal note to the ticket. Prevents SLA misses with proactive escalation beyond Zendesk's native triggers.
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 gives a support team a reliable SLA safety net on top of Zendesk. On a 30-minute schedule it reads open (unresolved) tickets, computes how far each one is through its priority-based SLA target, and escalates any ticket at or past a configurable warn threshold — posting an alert to a Microsoft Teams channel, emailing the support manager, and adding a private internal note to the ticket itself.
Why it matters: Zendesk's native triggers fire on single events and can miss cross-policy or slowly-aging cases. A consolidated, scheduled SLA sweep catches everything in one pass and routes it to where the team actually works (Teams + email), with an audit note left on the ticket.
Status: Built and verified Off (demo). Flow Checker: 0 errors / 0 warnings. Going live requires only authorizing the connections and setting the environment-variable values.
Use Case
A support operations team runs SLA policies by priority (e.g. urgent tickets must be actioned within an hour, low-priority within a day). They want proactive escalation *before* a breach, surfaced to a manager, with a trail on the ticket — without rebuilding Zendesk's native trigger logic for every edge case.
Flow Architecture
Every_30_Minutes
Recurrence (30 min)Runs the SLA sweep on schedule
Initialize_varWarnPercent
Initialize Variable (Integer)Pre-breach warn threshold from env var
Initialize_varManagerEmail
Initialize Variable (String)Escalation mailbox
Initialize_varSlaPolicyMap
Initialize Variable (Object)Priority → SLA minutes map (parsed JSON)
Initialize_varTeamsGroupId
Initialize Variable (String)Teams team id
Initialize_varTeamsChannelId
Initialize Variable (String)Teams channel id
Initialize_varZendeskSubdomain
Initialize Variable (String)Zendesk subdomain for REST note
Initialize_varEscalationCount
Initialize Variable (Integer)Running count of escalations
Search_Open_Tickets
Zendesk GetItems (tickets)Reads open tickets via $filter
Apply_to_each_Open_Ticket
ForeachEvaluates each ticket against SLA
Compose_Ticket_Priority
ComposeNormalizes priority (default normal)
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_ZendeskTable | String | tickets | Zendesk tabular-connector table to read |
| flowlibs_ZendeskOpenFilter | String | status ne 'solved' and status ne 'closed' | OData $filter selecting open tickets |
| flowlibs_SlaPolicyMap | String | {"urgent":60,"high":240,"normal":480,"low":1440} | Priority → SLA target minutes |
| flowlibs_WarnPercent | String | 80 | Escalate at ≥ this % of SLA elapsed |
| flowlibs_ManagerEmail | String | support-lead@contoso.com | Escalation recipient (reused) |
| flowlibs_TeamsGroupId | String | (placeholder) | Teams team id (reused) |
| flowlibs_TeamsChannelId | String | (placeholder) | Teams channel id (reused) |
| flowlibs_ZendeskSubdomain | String | contoso | Subdomain for the REST note URL |
| flowlibs_ZendeskAuthHeader | String | Basic … (placeholder) | Auth header for Zendesk REST; set to Basic base64(email/token:APITOKEN) to go live |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Zendesk | shared_zendesk | GetItems |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
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 targets
- Edit flowlibs_SlaPolicyMap to match your real SLA policies (minutes per priority). Add keys if you use custom priorities and extend Compose_SLA_Minutes accordingly.
- Warn threshold
- flowlibs_WarnPercent controls how early to escalate (e.g. 80% = escalate at 80% of the SLA clock). Set to 100 to escalate only on/after breach.
- Business hours
- The demo measures wall-clock elapsed time. For true SLA accuracy, subtract non-business hours/holidays from Compose_Elapsed_Minutes (e.g. via a business-calendar lookup).
- De-dupe repeat escalations
- Add a Dataverse/SharePoint ledger keyed by ticket id + sweep window so the same ticket isn't re-escalated every 30 minutes.
- Tiered escalation
- Branch on Compose_Elapsed_Percent to notify higher tiers as breach nears (e.g. >100% pages on-call).
- Open-ticket scope
- Adjust flowlibs_ZendeskOpenFilter (e.g. include pending/hold, or filter by group/brand).
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.01Normalized priority
Normalize ticket priority with a normal default
EXPR.02SLA minutes lookup
Look up the SLA target minutes for the ticket's priority
EXPR.03Elapsed minutes
Minutes elapsed since the ticket was created
EXPR.04Elapsed percent
Elapsed time as a percentage of the SLA target
EXPR.05Breach test (condition)
Escalate when elapsed % meets/exceeds the warn threshold
EXPR.06Internal note URL
Build the Zendesk REST URL for the internal note
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.