Information continuously evolves and grows in organizations. This untapped information, if shared between teams using different applications like Azure DevOps and Salesforce, can increase business revenues and leave you with more satisfied customers. For this purpose, an Azure DevOps Salesforce integration seems like the best choice.
Such integration would mean the information exchange between Azure DevOps and Salesforce is automatic, bi-directional, and in real-time, so data is consistently accessible and up-to-date.
This guide will introduce you to a step-by-step Azure DevOps Salesforce integration. It will also help you understand the benefits of such integration and present the key drivers for choosing the correct integration technology.
Note: In this guide, we have used an integration solution called Exalate for implementing an Azure DevOps Salesforce integration. We will learn more about it on the way!
Why Integrate Azure DevOps and Salesforce
Azure DevOps has been a game-changer in bringing the development and operation teams together. It facilitates an end-to-end DevOps toolchain for developing and deploying software programs. Azure DevOps aims to bridge the gap between the once-siloed development, IT operations, engineering, and security teams, to help them collaborate and work together harmoniously.
It supports a gamut of applications through its marketplace.
Salesforce is a popular Customer relationship management (CRM) tool that sales, marketing, service, and IT teams rely on to strengthen customer bonds and relationships. It aims to provide a complete customer overview through a single Salesforce interface. It is a robust, customizable, and scalable cloud-based platform that can fulfill most of your business needs.
Salesforce also hosts a variety of best-in-class apps through AppExchange.
A common trait you can observe here is that both these applications can bridge the gap between teams and improve their communication, be it development and operations or sales and marketing. Therefore, they can share information and build on each other’s expertise to achieve common business improvement goals.
But this collaboration and communication between teams if not handled correctly can lead to a waste of time and effort of valuable human resources and will eventually reduce productivity.
This is because information exchange between teams occurs manually via phone calls and emails or meeting notes or by switching between applications. Then it is further absorbed and updated in respective platforms manually.
This causes costly manual data-entry errors in addition to misplaced, unused, redundant, and scattered information across different platforms.
So how do we let these teams exchange data automatically without having to leave their familiar environment?
An Azure DevOps Salesforce integration would make perfect sense here. It will allow for real-time, automatic two-way synchronization of information between Azure DevOps and Salesforce, leaving teams in a more streamlined and collaborative environment.
Choosing the right integration tool here is the next logical step. So let’s understand how we can do that.
How to Choose the Right Solution for an Azure DevOps Salesforce Integration
The possibilities and checklists for a suitable integration tool can be overwhelming. But to bring down the list to the bare minimum, here’s what you must consider.
Note: As mentioned above, we have chosen Exalate for implementing an Azure DevOps Salesforce integration and we will look at what it has to offer.
Security
Perhaps, this should be your top criterion for an integration tool since it involves disparate applications across companies sending and receiving business information. It’s important, then, to secure this critical business data from accidental misuse or sharing with unauthorized parties. Using secure transport protocols like HTTPS, encrypted file transfers, or controlling access to the data to authorized users only are important security mechanisms.
Tools that have the required certifications, like ISO 27001:2022, should also be at the top of your list.
You can read more about how Exalate implements security measures by reading its security and architecture whitepaper.
Decentralized Integration
It’s important for an integration tool to support decentralized integration. This means that both sides of the integration have complete control over incoming and outgoing data.
They can share or receive data they want independently without having to configure or inform the other side. This guarantees that both sides maintain autonomy.
Exalate achieves this with the help of its scripting engine that supports outgoing and incoming sync rules on both integration sides. These rules help control the information shared, thus ensuring decentralized integration.
Reliability
The way your integration tool handles downtime and system failures is also important. Sync updates or changes must be queued properly and applied in the same order as their initiation. All this must happen automatically without any manual intervention.
Exalate achieves this using an advanced transactional sync engine which breaks down all the synchronization requests in single atomic steps in the same order and retries once the system resumes after a downtime, even when upgrading a system to a new version or reconfiguring a firewall.
Flexibility
Your integration and synchronization requirements should change with time. It’s natural for you to expect your integration tool to adapt to these changing requirements with minimal configuration.
Exalate, for example, supports basic synchronization scenarios straight out of the box, so it works on a low-code non-configuration mode for simple use cases that you can set up in very little time and is also easy for business users to understand.
You can also use the AI Assist feature with the Script Mode to build custom synchronizations for unique or advanced integration cases. It helps you generate scripts or optimize existing snippets.
Another aspect of a tool being flexible is that it supports integrations with other popular applications like Jira, GitHub, Zendesk, and ServiceNow as well. Since Exalate already supports these integrations, it will be easy for you to integrate with another of your partners, vendors, customers, or suppliers who use one of these applications.
Having chosen the right tool for an Azure DevOps Salesforce integration, it’s now time we learn how to implement the integration.
How to Set up an Azure DevOps Salesforce Integration in 6 Steps
To begin with, you need to install Exalate on both Azure DevOps and Salesforce instances. This is an important part of Exalate’s distributed architecture feature. Installing it on both sides will mean that you can control the shared information from either end independently.
You then establish a connection between them, it’s like an initial handshake to know and acknowledge what instance you are integrating with.
And finally, you can configure the connection to control the incoming and outgoing data and then set automatic triggers to start syncing data.
So let’s dive right into it!
Step 1: Install Exalate on Azure DevOps
To install Exalate on Azure DevOps, request your trial first.
Note: You can install Exalate on Azure DevOps through its marketplace or on a docker. (Check out this guide for a detailed procedure on installing Exalate on Azure DevOps).
Once set with your trial, the Exalate team will help you with the following steps.
You will first be taken through the installation wizard. You need to select your organization type from the drop-down list. After that, click “Install”.
Follow the wizard next as it’s pretty straightforward.
Once done, you can access Exalate by going to the “Organization Settings” and clicking “Extensions”.
Then proceed to verify Exalate on your Azure DevOps instance.
Once you finish this, install it on the Salesforce side. You can skip this if you have already installed it and move to the next step.
Step 2: Install Exalate on Salesforce
To start installing Exalate on Salesforce, request your trial and the Exalate team will help you with the rest.
Note: Exalate accesses Salesforce through APIs. Salesforce has its guidelines for API Access add-ons. For example, API access is provided by default in Enterprise accounts, while it is not the case with other accounts like Professional. Visit this documentation page to learn about the different Salesforce editions Exalate supports.
You’ll need to choose where you want to install Salesforce: “Install in This Org” or in a Sandbox org. I chose to install it in this org.
Fill in the required fields, scroll down to the bottom of the screen, and agree to the terms and conditions. Then press “Confirm and Install”.
Choose for which users you want to install Salesforce. You can also change it later. I chose “Install for All Users” and clicked “Install”.
Then “Approve Third-party Access” and click “Continue”. Your installation is complete. Click on “Done”.
Go to your Salesforce instance and create a connected app. Once the connected app is set up make sure to save the “Consumer Secret and “Consumer Key”. Then in your Salesforce instance, click “Apps” and search for “Exalate”.
For requesting an Exalate node, enter the “Consumer Secret” and “Consumer Key” you’ve copied and click “Request Node” afterward.
Click “Allow” to grant access permissions to Exalate.
Go to “Setup” and search for “Trusted URLs”. Then, click “Add new trusted URL”.
Fill in the following information in the trusted URL section, API name: free input string and URL: *.exalate.cloud.
Don’t forget to check all the boxes in the “CSP Directives” section. Click “Save”.
Next, to configure Exalate for Salesforce, enter your details and click “Agree and Submit” to wait for an email from the Exalate License Manager.
In your inbox, click “Verify Exalate instance”. You will be redirected to the Exalate admin console.
From here, you can proceed to create a connection between Azure DevOps and Salesforce. Anytime you are logged out of your Salesforce instance, follow these steps to log in again.
Step 3: Connect Azure DevOps and Salesforce
On your Salesforce instance, you will be on the welcome screen. If not, click on the “Connections” tab on the left-hand menu.
Go to the “Connections” tab. Connections in Exalate define your scope of synchronization and specify how your synchronization must behave.
On the screen, you can see existing connections between Salesforce – ServiceNow, Salesforce – Zendesk, and Salesforce – GitHub. However, this screen will be empty if you haven’t worked with Exalate before and this is your first time creating connections.
Either way, click on “Initiate connection”.
With Exalate, one side initiates the connection and the other side accepts it. Exalate has a uniform interface so you will come across similar screens on either end.
Here, we start from the Azure DevOps side. But you can start from Salesforce as well.
You will then see a prompt to enter the destination instance URL. This will be the link to your Salesforce instance.
If you don’t know which link to enter, you can navigate to the left-hand “General Settings” Exalate menu and copy the URL from there.
After a brief pause, new fields will appear. These will prompt you to choose the configuration type.
Exalate comes in two configuration modes: Basic and Script.
The Basic mode allows you to work with default mappings and configurations that can’t be modified. It comes with the Free Plan that allows you to experience Exalate firsthand and offers up to 1000 free syncs per month. It is suitable for basic synchronization use cases.
The Script mode, on the other hand, offers the full functionality of Exalate with advanced configurations and AI-assisted scripting capabilities. With this mode, you can implement unique, complex, or advanced synchronization use cases using an AI assistant.
You can also choose to upgrade your existing Basic connection in Azure DevOps or Salesforce to a Scripted one if you want to use Exalate with all its features and configuration modes.
Both these modes have slightly different screens, so we will take a look at both of them one by one.
Continue with the Basic Mode
If you select “Basic” on the screen above and click “Next”, you will be asked to verify admin access to the destination instance, Azure DevOps in our case.
Click the “Yes, I have admin access” button if you have access. Then click “Initiate”. If you don’t have access, click “No, I don’t have admin access”. Exalate then generates a unique invitation code for you. You need to copy and paste this code manually on the Azure DevOps side.
After a quick verification, you will be redirected to the Azure DevOps side.
Select a project on the Azure DevOps side from a drop-down list. This would be the project whose work items you want to sync or the one in which you will receive incoming Salesforce entities.
Click “Next” after selecting the one you want.
A message stating that your connection has been established will be displayed.
You now need to enter the work item key you want to synchronize on the Salesforce side.
Click “Exalate” once you have entered it.
If you now navigate to the Salesforce instance, you will be shown the same screen asking you to enter the Case number you want to synchronize on the Azure DevOps side.
Note: The Case number must be copied from the URL of the Case you select to synchronize. This is shown in the image below.
Sit back and let Exalate do its work. Have a look at the status messages to know what’s happening.
After a while, see the successful synchronization status as shown below.
In the Basic mode, you can sync
- individual work items or Salesforce entities as shown above.
- by creating triggers for automatic synchronizations.
- work items using the Connect operation on the Azure DevOps side.
- the existing work items and Salesforce entities in bulk using the “Bulk Connect” operation.
We will see how to create triggers a bit further down.
Continue with the Script Mode
Moving on with the script mode, choose “Script” on the screen below and click “Next”.
Note: We are initiating the connection from the Azure DevOps side now so you know how it works on both ends. But the same screens will appear if you start from the Salesforce side.
After a brief pause, new fields will appear. These will prompt you to choose the configuration type.
Enter the local instance short name, Azure DevOps since that’s our local instance, and also the remote instance short name, Salesforce in our case.
A connection name joining the two names and appended with a “to” will be generated. You can choose to change it if you want.
Spend some time describing the connection. This will come in handy when you have a lot of them and don’t remember why you created a particular one in the first place.
Click “Next” when you are ready to move ahead.
Then select the project on the Azure DevOps side as you did for the Basic mode.
A unique invitation code will be generated. This code is one of Exalate’s security mechanisms, such that each connection established ensures that data is sent and received from the correct source and destination.
Click on “Copy invitation code” to copy it. Keep it somewhere safe.
Click on “Done” once you have copied it.
On the Salesforce “Connections” tab, click on “Accept invitation”.
After this, a multi-line text box will appear. Here, you paste the invitation code you had kept safe and click “Next”.
This will complete your connection process in Script mode. You can now proceed to configure the connection.
For this, you click on the “Configure Sync” button or edit the connection if you want to configure it later by closing this window.
Step 4: Customize the Connection to Decide What Information Gets Shared
Customizing or configuring the connection is necessary to control what information you want to send to the other side and how you want to deal with information coming from that side.
It also involves creating automatic synchronization triggers, so you set them once or as needed and experience a two-way synchronization that happens according to the conditions you have set.
As mentioned before, you can choose to configure or edit it using the “Configure Sync” button.
To edit the connection, navigate to the “Connections” tab and click on the edit icon in front of your connection name as shown below.
Editing can happen at both ends, but the outgoing and incoming information you set or triggers you create will be specific to your platform.
You can also go to the other side of the connection by clicking on the remote antenna icon shown below.
By clicking the 3 dots, you can either activate, deactivate, or delete the connection.
Any way you decide to go ahead, you get similar screens for configuring the connection.
It has 4 tabs: “Rules”, “Triggers”, “Statistics” and “Info”.
We will see rules here and triggers in the next step.
“Statistics” gives you an overview of your synchronizations, such as the number of issues under sync, the date of your last sync, etc.
The “Info” tab gives you information about your connection like the name, description, and type of connection. You can edit the description here if you want.
Let’s discuss the “Rules” tab now.
The screen above shows the rules on Salesforce and the one below shows them on Azure DevOps.
As seen, each side has a set of incoming and outgoing sync rules written in Groovy scripting language. It is pretty intuitive and easy to follow.
Incoming sync rules specify how you want to map the incoming information.
The Outgoing sync rules specify what information you want to sync with the other side.
You can edit the sync rules by adding scripts to send (Outgoing sync) or receive (Incoming sync) new information. Or by deleting the existing rules to stop sending (Outgoing sync) or receiving (Incoming sync) data, depending on whether you are editing it on the Azure DevOps side or the Salesforce side.
For sending or receiving new information, we add a script and make changes in the outgoing/incoming sync rules.
So in the screen shown above, if we want to synchronize “Opportunity” in addition to “Case”, we add the following code:
if(entity.entityType == "Opportunity") {
replica.key = entity.Id
replica.summary = entity.Name
replica.description = entity.Description
}
Here, entityType
is the Salesforce entity you want to sync. The ID, name, and description of “Opportunity” are synced with the key, summary, and description of work items.
Now if you want to stop the data exchange, delete those lines in the outgoing and incoming sync rules respectively.
If you prefer to keep the rules so that you can use them later, you can simply comment them as shown on the screen below.
To comment a single line, add “//” at the start of the line. To add a comment to multiple lines, add a “/*” at the start of the line and a “*/” wherever you want the comment to end. The commented lines will be ignored while synchronizing information.
For instance, we don’t want to sync the summary of work items, we simply comment on the line: //replica.summary = workItem.summary
.
Connections in Script Mode Using AI Assist
The Script Mode allows you to generate and optimize scripts using the AI Assist feature — which appears as a tab under both the incoming and outgoing sync rules.
How does it work?
Enter your sync requirements into the chat box, and AI Assist will generate scripts based on your input, existing configurations, and Exalate’s scripting API.
It is also important to note that AI is not perfect. So, you need precise and detailed prompts to ensure the best results.
Let’s say you want to sync statuses between Azure DevOps and Salesforce; the prompt could look something like this:
“I want to sync the status of my work item with the status of a Salesforce case.”
After a moment, the script will be generated, with suggested changes highlighted in green and red. The green scripts are suggested additions, while the red scripts are suggested deletions.
If the new snippet works for you, click on “Insert Changes”. Otherwise, you can discard the suggested code. If needed, you can refine your prompt and, once satisfied, publish the changes.
Proceed to create automatic synchronization triggers now.
Step 5: Set Conditions for Automatic Synchronization: Triggers
Sync rules control what information you send and receive. To start the synchronization, you need to create triggers. Triggers are conditions you set, which when met, exchange information based on the outgoing and incoming sync rules you have set.
To create triggers, click on the “Triggers” tab shown below.
Alternatively, you can also create triggers by clicking on “Triggers” in the left-hand menu of “Exalate”.
Both approaches send you to similar screens, but the latter one asks you to select the connection you want to create a trigger from since it is from the general tab.
You will see a list of triggers here. It will be empty if you haven’t created any.
Click on the “Create trigger” button.
An “Add trigger” pop-up will be displayed.
The first drop-down will ask you to select the entity type you want to create the trigger for.
On the Azure DevOps side, it is a “Work Item”.
On the Salesforce side, there are many entity types you can sync, but the most popular ones are Accounts, Products, Opportunities, Tasks, and Cases.
The “If” field is the condition of the trigger. In the above example, we created a trigger for the work item type “Task” i.e [Work Item Type] = ‘Task’
.
You can use platform-specific query language in the “If” section.
WIQL (Work Item Query Language) in the case of Azure DevOps and SOQL (Salesforce Object Query Language) in the case of Salesforce.
On the Salesforce side, you first select the Salesforce entity. We select “Opportunity” as shown below.
For Salesforce, there are 2 ways you can deal with the “If” section. The first is to fill in the text boxes with proper information about the Opportunity you want to filter, as shown on the screen above.
Or toggle the “Use search query” switch to enter a SOQL query as shown below.
To learn more about how to create them for specific platforms, refer to this one for Azure DevOps or this one for Salesforce.
Leave “Notes” so you know the purpose of your trigger.
There is a checkbox that lets you activate or deactivate a trigger. This is useful when you don’t need the trigger and don’t want to create it from scratch later. Click the “Add” button once you are done.
The trigger you have created will be listed as shown below.
You can choose to edit or delete the trigger from here. To synchronize existing work items matching your trigger criteria click on the 3 dots and select “Bulk Exalate”.
Once you are done, click on “Publish” to apply the changes to your connection.
Step 6: Synchronize Information between Azure DevOps and Salesforce
For the Basic mode connection, individual work items and Cases can be synced by following the procedure mentioned in Step 2.
You can also create triggers or use the “Bulk Connect” operation for syncing information with the Basic mode. There is also a “Connect” operation on the Azure DevOps side that you can use to synchronize work items.
Information in the Script mode connection can be shared by using the “Connect” operation in Azure DevOps, by creating triggers, or by using the “Bulk Connect” operation in both Salesforce and Azure DevOps. In addition to this, you can always edit what information leaves your system and how you interpret incoming information using the sync rules.
Exalate periodically checks for new synchronization requests or existing sync updates. So if you don’t see your sync result immediately, wait for some time and try again.
Common Use Case
Development and Sales Teams
An Azure DevOps Salesforce integration can be useful for both development and sales teams.
Suppose your sales team uses Salesforce and your development team uses Azure DevOps.
The sales team always has access to customer feedback, queries, and new feature requests. Integration between these applications would mean that they can request bug fixes and dev updates right from within Salesforce. This in turn would create a new work item in Azure DevOps.
The development team would then work on it and update the statuses while doing so. An automatic bi-directional synchronization here would mean the sales team having real-time updates about the work items they have raised, and always having the correct answers for their customers.
This would also hold in the opposite case. Suppose the development team is working on a frequently requested feature update. They send this across to the sales team on Salesforce, maybe as a “Task”. The comments, statuses, and other relevant information can then be exchanged between Salesforce and Azure DevOps, helping the sales teams to close deals that are pending due to that particular feature request faster and in a more organized manner.
Conclusion
This guide served to explain why an Azure DevOps integration is essential to bridge the gap between sales and development teams. How it helps alleviate problems these teams face due to manual data entry mistakes, thus wasting a lot of valuable time and effort.
We also saw how an automatic and real-time information exchange between Azure DevOps and Salesforce can help us have a consistent and reliable view of revenue-driving information.
We also discussed how Exalate offers features suitable for such an integration. Then finally had a look at how an Azure DevOps Salesforce integration can be implemented by following a few straightforward steps.
Frequently Asked Questions
Why integrate Salesforce and Azure DevOps?
You can integrate Azure DevOps and Salesforce to bring the development and delivery processes together and foster collaboration and visibility across both platforms. Overall, it improves efficiency and quality in delivering Salesforce solutions.
Can Salesforce connect with Azure DevOps?
Yes, Salesforce can connect with Azure DevOps. The most common reason to integrate these platforms is to escalate bugs or issues for the dev team to fix. For instance, you can sync cases from Salesforce to Azure DevOps work items and get real-time status updates on the bugs.
How to integrate Salesforce with Azure DevOps?
You can integrate Salesforce with Azure DevOps using third-party apps or REST APIs. However, integrating using REST APIs can require some development effort, so we advise you to use third-party apps.
What data can I sync between Salesforce and Azure DevOps?
You can sync any Salesforce objects(even custom ones) between Salesforce and Azure DevOps. You can also sync related Salesforce objects, e.g., cases linked to an account, and keep statuses updated on both systems. You can sync all types of work items from Azure DevOps to Salesforce.
Can I use Exalate to integrate Salesforce and Azure DevOps?
Yes, you can use third-party apps like Exalate to sync data between Salesforce and Azure DevOps. With Exalate, you can perform advanced integrations with the help of custom-built Groovy scripts.
Recommended Reads:
- How to set up a Jira Salesforce Integration
- Salesforce to Salesforce Integration: Sync Multiple Salesforce Instances Bidirectionally
- Jira Azure DevOps Integration
- GitHub Salesforce Integration: How to Set up a Sync in 6 Steps
- How to Set Up a Salesforce ServiceNow Integration
- Salesforce Zendesk Integration
- How to Set up a Zendesk Azure DevOps Integration
- How to Set Up an Azure DevOps ServiceNow Integration
- How to Set up an Azure DevOps GitHub Integration