How to Sync Multiple Zendesk Tickets to a Single Jira Issue

sync multiple zendesk tickets a jira issue

This article was originally published on both the Zendesk community and the Atlassian Community.

An interesting use case often requires elaboration. And we thought this use case was interesting enough to be detailed for others who have similar requirements. 

So here it is! 

The Use Case

A customer wanted to sync multiple Zendesk tickets (raised by their customers) to be reflected in a single Jira Cloud issue to be taken up by the Dev team. 

Also, once the status on the Jira issue has been marked as “Done” from “In Progress”, the corresponding status on the Zendesk side would be changed to “Open” from “New”. 

A custom field called “Jira ticket #” is used as an identifier for the issue on the Jira side. 

Summary/Subject, description, labels/tags, attachments, and comments need to be synced bi-directionally between the 2 systems. 

jira zendesk table

The challenges

  • Finding out the correct Jira issue ID so that the tickets are mapped correctly to it.
  • Mapping statuses such that the customer support team using Zendesk gets the correct status updates. 

The Integration Solution: Exalate

Exalate is a bi-directional synchronization tool that integrates platforms like Jira, Zendesk, Azure DevOps, Salesforce, GitHub, and more. The above use case can be implemented using the Exalate Connect API. It supports Groovy-based scripting giving it the necessary flexibility. 

It has a distributed architecture, so as an Exalate administrator, you can configure both the incoming and outgoing processors on each side independently. These processors on both Jira and Zendesk filter what information must be sent and received. 

Implementation with Exalate

Before starting this implementation, Exalate must be installed on both Zendesk and Jira

Then a connection must be established between them. There are 3 types of connections that are supported: Basic mode, Visual mode, and Script mode. 

The Basic mode is for syncing basic entities like summary, description, comments, attachments, and issue types. But you cannot configure it, so it is suitable for simple integration cases. 

The Visual mode connection allows for a drag-and-drop interface and is best suited for those with admin access for both Zendesk and Jira. 

The Script mode connection provides independent control on each side. It consists of Groovy scripts that help configure the incoming and outgoing information. It can be done by editing the Sync rules

Considering the advanced configuration of this use case, it is recommended we use the Script mode connection. 

Configuration of the Sync Rules

As stated above, we need to configure both the incoming and outgoing information at either end using Sync rules. 

Starting with: 

Zendesk: Outgoing Configuration

The ticket information from Zendesk, like summary, description, labels, etc., to be sent to Jira are present in the “Outgoing Sync” by default. 

To this, I added only the information from the custom field “Jira Ticket #”  to be sent to Jira. 

Zendesk connection on Exalate

Zendesk: Incoming Configuration

Since I need to map the statuses between Jira and Zendesk, the mapping code needs to be added in the “Incoming sync” field on Zendesk. Remote and local statuses are mapped one-on-one. 

Also, once the issue has been marked ‘Done’ in Jira, a comment is added on the Zendesk ticket stating that “Fix has been released by Dev team”. This is done using the commentHelper class of Exalate.

Jira: Outgoing Configuration

Nothing specific needs to be added to the “Outgoing sync” of Jira, so the default configuration remains. 

Jira: Incoming Configuration

For this, when the ticket is synced over for the first time, it needs to create an issue in the specific project. In our case, “AAA” is the project that is selected.

  • Then depending on the remote issue, an issue type is set, default is Task if no issue type is found. 
  • The Jira issue ID from the Zendesk custom field “Jira Ticket #” is saved in the remoteIssueUrn variable 
  • Fetch the Jira issue details using the httpClient.get() method in the localIssue variable. 
  • If the Jira issue is not found, then an “Issue not found” exception is raised. 
  • However, if the Jira issue exists, then set the Jira issue ID to the localIssue ID. 
  • Summary, description, comments, attachments, and labels are synced as is. 

After this, you can create triggers to start syncing information automatically. On the Jira side, you can use the Jira Query Language, and on the Zendesk side, use the Zendesk Search Syntax to create them. 


We create a ticket on the Zendesk side and sync it manually to the Jira side by clicking the Exalate button on the right panel of the ticket view. Though this can be done automatically with the help of Triggers. 

ticket interface Zendesk and Exalate

The issue on the Jira side has the ID: AAA:830

Remember: this is the ID that needs to be entered on the Zendesk side.

So when a new ticket is created, the same ID is entered in the custom field “Jira ticket #”. 

defect ticket key Zendesk

And when it is synchronized, it gets synced to the same Jira issue we have entered. 

That’s all that is needed to achieve this use case with Exalate. If you are a visual person, this video will help you get started, or check out this Jira Zendesk integration article. 


There are native integrations that can integrate Jira and Zendesk, but they are confined by their UI. 

Exalate, on the other hand, has a scripting engine that makes it flexible enough to handle even the most advanced or complex integration requirements. If you are interested in knowing more about it, book a demo with an expert, and we can walk you through its functionality. 

Recommended Reading:

Comments are closed.