How to Set Up a Bi-Directional Salesforce and Jira Integration
Learn how to build a reliable, two-way sync between Salesforce and Jira. Step-by-step guide on object mapping, webhooks, and preventing sync loops.

When sales, support, and engineering operate in silos, critical customer information gets lost in translation. A customer logs a high-priority bug or requests a custom feature in Salesforce, but the engineering team tracks everything in Jira. Without a reliable bridge, sales reps have to manually check with developers to see if a deal-blocking bug has been fixed.
A clean, bi-directional integration automates this exchange: pushing cases or opportunities from Salesforce into Jira as tasks or bugs, and automatically updating Salesforce records when engineering closes a ticket.
Here is a practical, step-by-step look at how to build a robust, two-way sync between Salesforce and Jira without breaking your data integrity.
Phase 1: Define Your Data Mapping and Triggers
Before touching any code or middleware, map out exactly how objects correspond between the two platforms. Trying to sync everything at once leads to messy data structures.
- Establish the Object Mapping Matrix: Decide what equates to what. Usually, a Salesforce Case or feature request maps to a Jira Issue (Task, Bug, or Epic), while Salesforce accounts tie into Jira projects.
- Determine System Ownership: Decide which system is the "source of truth" for specific fields. For example, descriptions and attachments might be created in Salesforce by the customer, while status updates and resolution notes are owned entirely by Jira and engineering.
Phase 2: Set Up Authentication and API Access
To allow both systems to communicate securely, you need proper credentials and authentication tokens established on both ends.
- Configure Salesforce Authentication: Go to Salesforce Setup, create a Connected App or External Client App, and enable OAuth settings with the required API scopes. It is best practice to create a dedicated Integration User profile so updates coming from Jira can be audited clearly in Salesforce history tracking.
- Generate Jira API Tokens: Log into your Atlassian account settings, navigate to security settings, and generate a dedicated API token. You will use this along with your admin email for REST API calls.
Phase 3: Build the Salesforce-to-Jira Outbound Sync
When a specific event happens in Salesforce—like a case being marked as "Escalated to Engineering"—it needs to trigger the creation of a corresponding issue in Jira.
- Trigger the Action: Use Salesforce Flow Builder or an outbound rule that fires when a case field changes to "Escalated."
- Format the Payload: Package relevant Salesforce data (Subject, Description, Priority, and Record ID) into a clean JSON structure.
- Execute the HTTP Callout: Send a request to Jira’s REST API endpoint to create the issue.
- Store the Jira Key: When Jira responds with the newly created issue key (e.g.,
PROJ-1042), write that key back into a custom field on the Salesforce Case (Jira_Issue_Key__c). This creates an immutable primary-key link between the two records.
Phase 4: Build the Jira-to-Salesforce Inbound Webhook
When developers update or close a ticket in Jira, Salesforce needs to know about it instantly.
- Configure a Jira Webhook: In Jira administration settings, create a webhook pointing to your integration middleware, serverless function, or custom Salesforce endpoint, listening for
Issue: updatedevents. - Map the Status Transition: When Jira sends a payload indicating an issue status changed to "Done," your script parses the payload, extracts the stored
Jira_Issue_Key__c, and updates the matching Salesforce Case. - Update Salesforce Fields: Transition the Salesforce case status to "Resolved" and append engineering's notes directly into the case comments.
Phase 5: Prevent Infinite Sync Loops and Handle Errors
Bi-directional integrations are notorious for creating accidental "sync loops"—where Salesforce updates Jira, Jira triggers a webhook back to Salesforce, which updates Salesforce again, triggering another outbound call into infinity.
- Implement Echo-Cancellation: Program your middleware to ignore incoming webhooks if the modifying user matches your dedicated integration user ID, or compare payload hashes to drop unchanged requests.
- Set Up Error Queues: If a webhook fails because a record was locked or deleted, route failed payloads to a dead-letter queue. Log the exact reason for failure and alert your support ops team so the issue can be re-triggered with one click.
Stop re-explaining your Salesforce org to every AI
Salesforce MCP Compass installs a living knowledge base into your org so Claude, Cursor, and Codex start every session with full context — field names, objects, conventions and all. Free and open source.
Get Salesforce MCP Compass Free →