Zendesk Ticket SLA & Teams Sync
On an hourly poll, the flow reads open Zendesk tickets, posts new high-priority tickets to a Teams support channel, and on SLA breach reassigns the ticket to the team lead in Zendesk and alerts the channel. A Dataverse ledger prevents duplicate notifications across runs. A two-way Teams-reply-to-Zendesk-comment companion is documented as an extension.
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 bridges Zendesk support into Microsoft Teams, backed by a Dataverse idempotency ledger. On an hourly schedule it reads all open Zendesk tickets, posts any new high-priority ticket to a Teams support channel, and - when an open ticket ages past its SLA window - reassigns the ticket to the team lead in Zendesk and alerts the channel. A Dataverse ledger records every notification/escalation so the same ticket is never actioned twice across runs.
Why it matters: Agents triage in Teams while the ticket of record lives in Zendesk. Surfacing high-priority work and auto-escalating breaches gives every at-risk ticket a human owner the moment the SLA elapses, with zero duplicate noise.
As-built note: the Zendesk Power Platform connector is tabular (no event trigger, and no SearchTickets/AddComment actions), so the flow uses a Recurrence trigger that polls GetItems on the tickets table. The two-way Teams-reply-to-Zendesk-comment companion is documented as a future extension (it needs a Teams trigger + a Zendesk private-note write via REST).
Use Case
A support team wants new urgent/high tickets surfaced in a Teams channel automatically, SLA-breached tickets escalated to a team lead without manual chasing, and a durable audit trail of what was notified and when. The flow ships Off; going live requires only authorizing the three connections and setting the configuration environment variables.
Flow Architecture
Recurrence
Recurrence (Hour/1)Polls Zendesk hourly
Initialize variables
Initialize Variable x8Correlation id (guid) and env vars: table, open filter, high priorities, SLA hours, team-lead id, Teams group + channel
Get Open Tickets
Zendesk GetItemsReads open tickets (table tickets, open $filter, $top 100)
Apply to each Ticket
Foreach (concurrency 1)Evaluate each ticket
Idempotency lookups
Dataverse ListRecords x2Has this ticket already been notified high-priority or escalated for breach?
Check New High Priority
If + Teams PostMessageToConversation + Dataverse CreateRecordpriority in high list and not already logged -> post the card and write a HighPriority ledger row
Check Sla Breach
If + Zendesk PatchItem + Teams + Dataverse CreateRecordcreated_at older than SLA window and not already escalated -> reassign to team lead, alert the channel, write an SLABreach ledger row
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_ZendeskTable | String | tickets | Zendesk tabular table to read |
| flowlibs_ZendeskOpenFilter | String | status ne 'solved' and status ne 'closed' | OData filter for still-open tickets |
| flowlibs_ZendeskHighPriorities | String | high,urgent | Comma list of priority values treated as high-priority |
| flowlibs_ZendeskSlaBreachHours | String | 8 | Age (hours) after which an open ticket is an SLA breach |
| flowlibs_ZendeskTeamLeadUserId | String | 0 | Numeric Zendesk user id breached tickets are reassigned to |
| flowlibs_TeamsGroupId | String | <your-team-id> | Target Teams team/group id |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Target Teams channel id |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Zendesk | shared_zendesk | GetItems PatchItem |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord |
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.
- Switch to event-driven
- If a Zendesk webhook/automation POSTs to a flow URL, replace the Recurrence + GetItems front end with a Request trigger for near-real-time handling.
- Two-way sync (companion flow)
- Add a Teams OnNewChannelMessage trigger flow that writes an internal Zendesk note via REST PUT .../tickets/{id}.json with comment.public=false (the tabular connector has no comment action).
- Priority tiers
- Broaden/narrow flowlibs_ZendeskHighPriorities (e.g. urgent only) without touching flow logic.
- SLA precision
- Swap the created_at-age heuristic for a Zendesk SLA policy field if your plan exposes next_breach_at.
- Adaptive cards
- Replace the HTML Teams body with an adaptive card carrying Acknowledge/Reassign buttons that call PatchItem directly.
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.01High-priority gate
Ticket priority is in the high list
EXPR.02Already-notified check
True when not yet logged
EXPR.03SLA-breach gate
Ticket older than the SLA window
EXPR.04Reassign payload
Bound to PatchItem item
EXPR.05Ledger filter
Idempotency lookup by ticket + type
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.