Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

How to sync Multiple Zendesk Tickets to a Single Jira Issue

An interesting use case often requires elaboration. And I thought this use case was interesting enough to be detailed out 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 to the issue on the Jira side. 

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


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 solution that integrates different platforms like Jira, Zendesk, Azure DevOps, Salesforce, GitHub and more. The above use case can be implemented using the Exalate API. With a built in Groovy-based scripting engine - you have the necessary capabilities to implement almost any use case.


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 configuration mode is for syncing basic entities like summary, description, comments, attachments and issue types. As you can't configure it, it is suitable for simple integration cases - but you can use it for free ...


The Visual configuration mode allows for a drag and drop interface.  It requires admin access on both sides of the connection. 


The Script configuration mode 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, we choose 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 add only the information from the custom field “Jira Ticket #”  to be sent over to Jira. 



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” 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 “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 
  • Simply 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 simply 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. 



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 #”. 


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.





Log in or Sign up to comment
AUG Leaders

Atlassian Community Events