Zendesk Ticket to Jira Bug Sync
When a Zendesk ticket is flagged as a bug or escalated to engineering, the flow creates a linked Jira issue with the customer context, keeps status and comments in sync both ways, and notifies the agent when engineering resolves it. Connects support and engineering without copy-paste.
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 solution connects Zendesk support and Jira engineering without copy-paste. When a Zendesk ticket is tagged for escalation to engineering, a linked Jira Bug issue is created with full customer context, the mapping is recorded in Dataverse, the Jira key is cross-referenced back on the Zendesk ticket, and the support team is notified in Microsoft Teams. A second flow watches the linked Jira issues and, when engineering resolves them, pushes the resolution back onto the original Zendesk ticket and notifies the agent.
Why it matters: Manual handoffs between support and engineering lose context and updates. A live, idempotent two-way sync keeps both sides informed and prevents duplicate issues and comment echo loops.
Built as two flows + one Dataverse mapping table in one solution (§3g), tied together by a correlationId minted at escalation and propagated through every hand-off.
Use Case
Support escalates product bugs to engineering and needs status flowing back to the customer-facing ticket. Operations get a governed audit trail (the Dataverse mapping table) of every escalation and its resolution.
Flow Architecture
Recurrence_Poll_Zendesk (Flow A)
Recurrence (5 min)Schedule
Init_var… (×8) (Flow A)
Initialize VariableLoad env vars (Jira project/type/instance, bug tag, Zendesk subdomain/auth, Teams group/channel)
Get_Open_Zendesk_Tickets (Flow A)
Zendesk GetItems (table tickets)Read open tickets (status ne 'solved' and status ne 'closed')
Filter_Escalated_Tickets (Flow A)
Query (Filter array)Keep only tickets whose tags contain the escalation tag
Apply_to_each_Escalated_Ticket (Flow A)
Foreach (sequential)Process each escalated ticket
Check_Existing_Mapping (Flow A)
Dataverse ListRecordsDedup — skip tickets already synced
Condition_New_Ticket (Flow A)
If (length = 0)Only escalate un-synced tickets
Set_Correlation_Id (Flow A)
Compose @guid()Mint the cross-flow correlation id
Compose_Jira_Fields (Flow A)
ComposeBuild Jira summary + description (customer context)
Create_Jira_Issue (Flow A)
Jira CreateIssue_V3Create the linked Bug issue
Create_Mapping_Record (Flow A)
Dataverse CreateRecordEnvironment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_JiraProjectKey | String | SUP | Target Jira project key |
| flowlibs_JiraBugIssueTypeId | String | 10004 | Jira Bug issue type id (instance-specific) |
| flowlibs_JiraInstance | String | (blank) | X-Request-Jirainstance header value |
| flowlibs_ZendeskBugTag | String | engineering | Tag that marks a ticket as escalated |
| flowlibs_ZendeskSubdomain | String | yourcompany | Builds https://{subdomain}.zendesk.com |
| flowlibs_ZendeskApiAuth | String | (blank) | Basic base64(email/token:APITOKEN) for Zendesk REST |
| flowlibs_JiraResolvedStatuses | String | Done,Resolved,Closed | Jira statuses that count as resolved |
| flowlibs_JiraZendeskStatusMap | String | (JSON) | Jira status → customer-facing message |
| flowlibs_TeamsGroupId | String | (reused) | Teams team id for notifications |
| flowlibs_TeamsChannelId | String |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Zendesk | shared_zendesk | GetItems |
| Jira | shared_jira | CreateIssue_V3 GetIssue_V2 |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord |
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.
- Escalation signal
- Change flowlibs_ZendeskBugTag, or edit Filter_Escalated_Tickets to key off type/priority/a custom field instead of a tag.
- Issue type / project
- Set flowlibs_JiraProjectKey and flowlibs_JiraBugIssueTypeId for your Jira instance (issue type ids are instance-specific; read them from Jira project settings).
- Resolved definition
- Adjust flowlibs_JiraResolvedStatuses to match your Jira workflow's done states.
- Customer messaging
- Edit flowlibs_JiraZendeskStatusMap to control what the customer-facing/agent note says per Jira status.
- Customer wait
- Extend Flow A to set the Zendesk ticket to pending on escalation (additional HTTP PUT).
- Multi-link
- Attach multiple tickets to one bug by matching on a fingerprint before Create_Jira_Issue.
- Public vs private
- Switch the back-sync note to public:true to message the customer directly on fix release.
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.01Dedup check
True when the ticket has no existing mapping
EXPR.02Escalation filter
Keep tickets whose tags contain the escalation tag
EXPR.03Jira issue key (after create)
Read the created Jira issue key
EXPR.04Current Jira status
Extract the current Jira status name
EXPR.05Resolved test
Check whether the Jira status counts as resolved
EXPR.06Mapped customer message
Look up the customer-facing message for the Jira status
EXPR.07Correlation id
Minted in Flow A, stamped on the mapping row, read by Flow B
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.