Zendesk is an amazing tool for customer support. While Jira is the go-to choice for development teams. So, effectively integrating both solutions means you’ll create a powerful collaboration between these teams. You’ll synchronize development and support into a seamless communication process. That means no more manual copying of data. An effective integration indicates that the synchronization between Zendesk and Jira happens seamlessly and automatically.
In this guide, we’ll walk you through a step-by-step process on how to set up a Jira Zendesk integration. By doing so, you’ll save a ton of time for your development team and customer service reps.
Note: In this tutorial, we will be using an integration tool called Exalate to set up the integration. You will learn more about this, as well as other integration options, throughout this guide.
Here is an overview of what we will cover:
- Why Integrate Jira and Zendesk
- How to Choose the Right Technology for Setting up a Jira Zednesk Integration
- How to set up the Jira Zendesk integration (the step-by-step process)
- Common Pitfalls to avoid after setting up the Integration
You’ll likely want to integrate Jira and Zendesk and set up a flexible synchronization for 2 general reasons :
Instead of exchanging support tickets via email, or manually creating Jira issues for every ticket, a Zendesk to Jira integration enables you to automatically create linked issues whenever a ticket is generated.
If you’re manually adding issues in Jira, you’ll also need to manually update the Zendesk ticket whenever a new one is added to the issue. Not a great use of your team’s time!
By synchronizing both tools automatically, less information is lost in comparison to the manual route. As less information will fall through the cracks, you’ll not only save time, but it will also result in you providing a better experience for your users.
The general reason most teams will want to integrate Zendesk with Jira is to “experience a seamless collaboration between their development and support teams”.
Development teams and customer service teams generally don’t have the same type of workflows, and that’s perfectly fine. But the Development processes for a Software/Product/Service are inter-connected with the Support processes.
Either side is also used to working in its familiar environment. Zendesk for support teams and Jira for development teams. Teams perform best when they use their own systems and unique workflows.
Integrating Zendesk and Jira correctly enables each team to stay in their system, while still communicating with the other side. And they keep their own workflows.
The development team doesn’t need to leave Jira to communicate with customer support. And customer support doesn’t have to learn Jira to provide detailed reports to the dev team. So everybody’s happy in this scenario!
Note: To find out more about aligning your service desk and development teams, you can download this free ebook and read all about it. 👇
Before we can integrate both systems, we will first have to choose a suitable synchronization solution. When designing an integration between two systems, three important features always need to be taken into consideration for a secure flexible collaboration: autonomy, flexibility, and reliability.
In this blog post, we use a synchronization tool called Exalate. As you may or may not know, there is also a general Zendesk add-on for Jira. But there are some important reasons we’ll be using another solution.
First off, Zendesk for Jira requires the support of an engineer to select the target project. Whereas with Exalate, this selection can be automated based on the properties set on the ticket.
There’s also the important factor of keeping both sides autonomous. Because this selection is done on the Jira side, dependencies between the systems are reduced. Whenever tickets need to be escalated towards other projects, that reconfiguration can be done without reconfiguration at the Zendesk side.
But the real value comes with the two-way sync Exalate provides. With a two-way sync, your team can:
- Synchronize any field you need in custom Jira configurations
- Automatically get bidirectional updates when one side is modified
- Use native comment exchange for all existing comments
- Link a single Zendesk instance to multiple target Jira instances
- Customize workflow synchronization
- Sync with multiple instances at the same time
All of the above cannot be done using Zendesk for Jira. Plus, it’s easy to set up triggers and rules to automatically generate synchronized Jira issues when a Zendesk ticket is created. Zendesk for Jira is also limited to Jira Cloud – on the other hand, Exalate for Zendesk is natively integrated into Jira.
Now we’ve decided what we want to achieve and picked a tool, let’s look at how to set things up. We’re going to run through installing Exalate on both platforms, setting up a connection between them and then look at how we can configure that connection to do what we want. We’ll start by installing it on each platform.
First, we’ll install Exalate on Zendesk. To do that, we have to create a proxy user that will be used when we install the app. Exalate cannot synchronize issues created by the proxy user so it is best to have a dedicated user account to use just as a proxy.
For more information, have a look at the Exalate installation guide for Zendesk.
You need to generate a token for this user, so when you’re logged in, go to the Zendesk Admin screen, by clicking the cog-shaped icon in the left side menu. Then select “API” under the “Channels” heading. If you haven’t used this section before you’ll need to agree to some terms and conditions, and then click the yellow “Get started” button to proceed.
On the next screen, you’ll see a “Token Access” heading. This will probably be disabled. If that’s the case, flip the switch on the right of the screen to enable it. Your screen should then look something like this.
Click the plus icon to add an API token. You can give the token a description to help you identify it in the future. This is very useful, particularly if you have multiple tokens later on. The generated token is a string of text, which you should now copy somewhere safe. You are only shown the token once, so if you don’t copy it properly you’ll have to repeat this process.
Now, we need to find the Exalate app in Zendesk’s marketplace. Log in to Zendesk, then click on the cog-shaped admin button on the left side menu. Next click on “Marketplace”.
The marketplace should open in a new window. If it doesn’t, check your browser isn’t blocking you from opening new windows. Type “Exalate” into the search field and you should see the app appear.
Click on Exalate and you’ll be taken to the app’s page. Click the blue “install” button. Make sure the account you want to use is selected in the popup that appears, then click “install” again.
You’ll need to enter the token created earlier and the details of the proxy user who created it. Enter the email of the proxy user into the user field.
There are also boxes to tick to restrict the roles and groups that have access to the app. You can ignore this for now, but if you want to control who can use Exalate, this is where to set that up.
Click the blue “Install” button and Exalate will be installed on Zendesk. Now we need to get an evaluation license. You can read more about that in the documentation.
Click “Exalate” in the Zendesk left-hand menu if you aren’t there already, then look for “License Details” in Exalate’s menu. It might take Exalate a few seconds to load the first time you use it, so don’t panic if the menu doesn’t appear immediately.
On the licensing page, click the area that says “30-day trial”. A pop-up will appear.
Enter your email address into the pop-up field. Click the green “Send” button. You’ll then get an email containing an evaluation key.
Copy the key to your clipboard by highlighting it with the mouse and pressing the copy keyboard shortcut. That’s control+c for Windows and Linux, or command+c for Mac users. Then look back at the Exalate license details page and click the “License Key” button at the bottom left. You may have to scroll down if it isn’t visible.
Paste the license key into the field that appears with control+v, or command+v for Mac users. Then click the “Update” button. Your Exalate installation is now licensed for 30 days on Zendesk.
We’ll come back later to set up our connection, but first, we need to install Exalate on Jira.
There are two main versions of Jira, Jira Cloud, and Jira Server. There is also Jira Data Center for Enterprise users. Exalate works on all of them, though the install process is slightly different. Once Exalate is set up, it gives you a common interface across all platforms, making it easy to deploy and adapt to your needs.
Start by logging in to your Jira instance. As with Zendesk, we need to find Exalate in the marketplace first.
Click the cog-shaped settings button in the top-right of the screen, and select “Apps”. You’ll be taken to the Atlassian marketplace. Type “Exalate” in the search field. You should see several results. Click “Exalate Jira Issue Sync & More”.
Next, click the “Try it free” button, if you don’t have a license already, you’ll be taken to “My Atlassian” where you’ll need to enter your email address and accept the license conditions, by ticking the box.
When you click “Generate license”, a pop-up will appear, showing your instance name. Check this is correct, and click “Apply license”. You’ll be taken back to Jira, where you’ll see a confirmation. Click “Get started” and you’ll be ready to go on Jira.
Now we have Exalate installed and ready on both platforms. Let’s see how to connect them.
To create a connection, we go into one platform, enter a few details, and generate an invitation. We then go to the other platform and paste the invitation code into it. It doesn’t matter which platform we start with, but for this guide, we’ll use Zendesk first.
As mentioned above, one advantage of Exalate is the common interface in different platforms makes it easy to work with. Once you’ve done something in one platform you can do the same thing elsewhere.
In Zendesk, get to Exalate by selecting its icon from the left side menu. If you haven’t already accepted Exalate’s EULA, you may be asked to do so on this screen. Click on the connections screen if you aren’t there already, and you should see something like the screenshot below.
When you have connections, they will be listed here. Now though, we can see a message telling us we don’t have any, so let’s go ahead and set one up.
Firstly, click the green “Initiate connection” button at the top right of the screen. On the screen that appears, choose the type of destination instance. The destination instance just means the machine we’re connecting to, our Jira instance in this case.
You can select “public”, “private” or “local” depending on the type of machine you are connecting to. In this case, we’ll select “public”. Then click the green “Next” button to proceed.
If you selected “public”, you’ll see a screen where you enter the URL of the Jira destination instance. If not, you’ll skip to the screen after that.
If you’ve selected public, enter the URL of the Jira destination instance. Make sure to enter the full URL with ‘http://’ at the start or it may not be recognized. You may also need to enter credentials if fields to do that appear. Then click “Next” to continue.
Now you’ll see a screen where you name your local and remote instances. Doing this will generate a connection name automatically, but you can edit it further if you like. There’s also a field to enter a description. It’s best to enter as much information as possible here, to help you identify and differentiate this connection from others later on.
The next screen lets you know about the default sync rules. Our connection has various rules that control what it does. We’ll look at these in more detail, but for now, just click the green “Initiate” button.
On the final screen, click the “Copy invitation code” button to copy the generated code to the clipboard. It’s best to paste this somewhere safe, so you don’t accidentally overwrite it. When you’ve done that, click “Done”.
Now our connection is set up on the Zendesk side, we need to move over to Jira. Log in to your Jira instance if you haven’t already. Click “Apps” from the top menu, then “Manage apps”. Look in the Exalate section on the left-side menu and click “Connections”.
As you can see in the screenshot below, our Jira Cloud instance already has a couple of connections to a Jira server instance. We’re going to add a new one to Zendesk. Click the “Accept invitation” button to continue.
On the next screen, paste in the invitation code we generated in Zendesk.
Then click the “Next” button. You’ll see another connection information screen where you can name each end of your connection and add a description. The ones we used in Zendesk are set here as the defaults. It is often best to leave these as it is, though you may wish to change them if each team uses different terminology, or you want to alter the description to reflect what each group needs to use if for.
Next, you’ll be asked if you have admin access to the other node. This may or not be the case depending on the relationship between the teams running the different platforms.
If you select “Yes”, you’ll need to verify admin access and can then configure both sides in visual mode. Click the green button to do that. A popup like the one below should appear.
Click the green ‘Finish Verification’ button in the popup. You’ll get a message telling you if it worked. You can now click the ‘close’ button or wait and the popup will close itself. You’ll also see a confirmation in the Jira window.
Click next and Exalate will start setting up the connection. A screen will appear while this is done. As it says, this may take some time, so this may be a good moment to take a break. Why not make yourself a cup of coffee?
After a while, it will tell you the connection is established and a green ‘Configure sync’ button will appear. Click it.
Here’s how the visual configuration looks. The exact arrangement will depend on whether you set up the connection in Jira or Zendesk – this is how it looks from Zendesk.
There are several options here, on the scope screen. If you click the ‘Filter tickets’ button a further popup will appear like the one below.
From here you can choose the properties of the tickets you wish to synchronize. You can select various properties from the dropdown boxes. You can choose specific tags as well as filter by status, type, or priority.
There is also a ‘More’ button which will give you further options. If you click that, you’ll be able to enter a subject and a description.
When you’ve chosen the filters you want, click the green ‘Save’ button.
Back on the scope screen, there are dropdown boxes to choose your Sync method. You can choose whether syncing is done manually, automatically, or disabled altogether.
There are two of these boxes, one to control each direction. In this case, one controls tickets sent from Zendesk to Jira, and other controls tickets sent from Jira to Zendesk.
There’s also a dropdown box on the right that lets you choose which project will be used for synchronization.
Once you’re done with the scope, click ‘Next’ to configure the rules.
On the rules screen, you can see a list of fields on each platform and how they are mapped onto one another. Some tags have the same name, and these are obviously paired. Others such as ‘Tags’ and ‘Labels’ are different names for similar properties that naturally map together.
Exalate will choose sensible defaults for you, but you are free to change, add or delete any of them as you see fit. Sometimes you might feel one team only needs a particular bit of information, in which case you can delete the fields you don’t want synced. Other times you may feel a field should be mapped to a different one.
You can drag the mappings up and down to change their order. Each one has a delete icon on the right and an edit button to the left of that. If you click the edit button, the following screen will appear.
Here you can select which fields to sync from all the available choices, using the dropdown boxes under the connection side names. In this case, those are ‘Zendesk’ and ‘Jira’. Between those, another dropdown lets you choose the sync direction.
In this case, it is set to a two-way sync, but you can have a one-way synchronization by choosing a one-directional arrow pointing whichever way you need it.
You can also choose what Exalate does if there isn’t value when it syncs the tickets. You can choose to set a default value, report an error, or do nothing. If you choose ‘default value’, there will be a further dropdown letting you select the default value to use.
Click the ‘Save’ button when you’re done. Back on the ‘Rules’ screen, you’ll see an ‘Add mapping’ button. If you click that, a screen like the one below will appear.
This works similarly to the ‘edit mapping’ screen, except you have to choose the fields to map to get started. You have to choose fields of a similar data type. You’ll see a warning message if you pick fields that can’t be matched.
Once you’ve picked your fields, you’ll see the other fields in the ‘edit mapping’ screen appear, and these work in the same way. Again, click ‘Save’ when you’re done.
If you click the small arrow on the right of the ‘Add mapping’ button an ‘Add script’ button will appear. Click this to see the ‘Add script’ screen. Here, you can create and edit advanced scripting rules.
If coding isn’t your thing, you may want to skip this, but if you want to learn more about it, click the ‘Check examples’ text, which will take you to some useful documentation.
That will teach you many of the useful things you can do with scripts. You can assign fields to others, or give them specific values, or even use programming logic to make decisions on what fields to synchronize.
When you’ve finished editing everything, click the green ‘Publish’ button, and the connection will be created.
If you select “No”, when you get the option to configure visually, then you use the wizard to set up and configure Exalate on each side. That’s what we’ll look at now. Click “Next” to continue.
Next, you need to pick the sync rules template. You can choose the single project option to use some common defaults and that’s what we’ll do here, so click “Next” to continue.
Next, you need to pick the local project that will be associated with the connection. Entities sent over from the other side will appear in this project. In this case, we’ve picked the “devscrum” project.
Zendesk entities that are sent over will appear in this project. We’ll look at the rules for deciding what is sent in the next steps.
Click the “Confirm” button to finish creating the connection. You’ll be taken back to the connections screen, where you’ll see your new connection listed.
Now our connection is ready, we’ll see what we can do to control what it does.
To configure our connection we can change the rules that control how data is mapped from one platform to the other. This can be done on either platform. We can control what happens to outgoing data and what happens to incoming data on each side.
Let’s use Zendesk for our example. First look in the connections page, which you reach by clicking “Connections” in the left-hand menu under the “Exalate” heading. Find the connection you want to edit and click the “Edit connection” icon that appears when you hover the mouse over it.
You’ll see a few headings. One is “Triggers”, which we’ll look at in the next section. There are also statistics showing you what has been exchanged and an “Info” tab with a few useful details. For now, click the “Rules” text.
The outgoing sync section shows how items that go from Zendesk to Jira are mapped. The incoming sync section shows how incoming items from Jira are matched to new Zendesk items. Fields on each platform’s items are mapped to their equivalents on the other.
Exalate does a great job of picking defaults for you. You might want to alter this behavior, however, or add additional items. In the outgoing sync, you can see that the “assignee” fields are mapped via the line that says “replica.assignee = issue.assignee”.
There isn’t an equivalent in the incoming sync, so if you want the assignee for issues mapped, you could add the line “issue.assignee = replica.assignee” there. Perhaps you want to assign issues from Jira to a particular person or give them a particular label. You could do that by adding lines like these:
Replica.assignee = ‘Julia’
Issue.labels = ‘From Jira’
You can do more complicated things, such as add multiple fields to the description, or add data from one field to a different one. You may also have custom fields you want to work with. There are also advanced functions that can do even more.
For more information about what you can do, read our Script Helpers guide.
As well as controlling mappings, you can change the conditions which cause issues to be synced. We do this with synchronization triggers.
As in the previous step, find your connection, hover over it and click the “Edit” icon. Then make sure you are on the “Triggers” screen by clicking the matching text. You can also use the Triggers entry in the left-hand menu.
If you haven’t done this before, there won’t be any triggers listed. Let’s create one by clicking the “Create trigger” button.
On the “add trigger” screen there are several fields to adjust. You can pick the type of issue to synchronize, using the drop-down box. This will include available entities. We’ve selected “Ticket” in the screenshot below.
You then need to enter a search query that matches the type of entities you want to send. You could sync all entities of a particular type, entities with a particular tag, or items assigned to a particular user. It’s up to you.
You can also set up multiple triggers to sync entities under different conditions. Triggers are defined using JQL. For more information on how to build them, read this article. Some example queries are:
If item.type = bug
If item.assignee = ‘Kevin’
If item.status = ‘open’
Each of those queries will automatically sync queries that match the condition. You can build more complex queries using logical operators, such as AND, OR, and IN. You can use comparison operators such as < and >, as well as symbols like ~ and !=. If you know how to use those in other programming languages, they work the same way here.
There’s also a description field for you to enter information about the trigger. As with connections, it is best to add as much information as possible here, to help you recall what the trigger is for, as well as help out anyone else who needs to work with it later.
Below the description field, there’s a switch to activate the trigger, which you’ll need to flip if you want it to work.
When you’ve got everything set how you want it, click the “Add” button to create the trigger. You should now see the trigger listed. Click the green “Publish” button to publish your changes.
As well as the standard fields listed you can synchronize custom fields by adding them to the sync rules. There is a customFields property in JQL which stores custom fields in an array. You can add a line of code like this:
replica.customFields. ”Custom field name” = issue.customFields. “Custom field name”
Here you replace the “Custom field name” with whatever your field is called. This kind of flexibility gives you fine control over how Exalate maps your data from one platform to the other.
Now we’ve got everything set up, we can start creating tickets. If we create a ticket in Zendesk that matches our conditions it will appear in Jira. It takes a few minutes for the syncing to take place, so leave it a while if you don’t see it straight away. Our platforms are now synchronizing tickets automatically without any manual intervention from us.
Zendesk has a pretty simple workflow, so it’s quite simple to align workflows when working in tangent with Jira and Zendesk.
However, there’s a caveat. Beware of the way Zendesk handles ‘closed’ tickets!
When you mark an issue as ‘closed’ in Jira, you can still edit the information as much as needed. However, the same is not true for Zendesk.
Once an issue has a ‘closed’ status on Zendesk’s side, it becomes read-only. This means you can no longer change any of the data on the ticket.
Take this into account before marking an issue as ‘closed’.
If you believe you still need to edit data on the Zendesk side, consider not closing the issue.
If, for some reason, you absolutely must mark the issue as ‘closed’ on Jira, consider disconnecting the issues so that the ticket remains open in Zendesk until you perform the necessary edits. Alternatively, you could give it a similar-sounding status, such as ‘Resolved’ or ‘Done’.
And that’s it! Now you’re ready to fully combine the power of Jira and Zendesk.
Here’s a quick recap of what we’ve covered:
- Why set up an integration between Jira and Zendesk in the first place
- How to use the synchronization tool, Exalate, to set up a live synchronization
- How to set up a connection between both systems
- How to automating Jira issue creation with triggers
- How to best align your workflows to make the most of Jira and Zendesk
- What common pitfalls to avoid in a Jira Zendesk workflow