

How to Sync GitHub Milestones to Jira Sprints with N8n
Automatically create and link Jira tickets when issues are added to GitHub milestones.
Steps and UI details are based on platform versions at time of writing β check each platform for the latest interface.
Best for
Development teams who need custom sprint creation logic and already use N8n for other automations.
Not ideal for
Teams wanting plug-and-play setup without code nodes or webhook troubleshooting.
Sync type
real-timeUse case type
syncReal-World Example
A 25-person SaaS development team uses this to automatically create Jira sprints when their PM assigns GitHub issues to milestones during weekly planning. Before automation, developers manually created sprints and copied issue details, taking 15-20 minutes per sprint. Now sprint setup happens instantly when milestones are assigned.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently β Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into n8n
Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured β you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Milestone Title | milestone.title | |
| Issue Title | issue.title | |
| Issue Number | issue.number | |
5 optional fieldsβΈ show
| Milestone Due Date | milestone.due_on |
| Issue Body | issue.body |
| Repository Name | repository.name |
| Issue Labels | issue.labels |
| Assignee | issue.assignee.login |
Step-by-Step Setup
Workflows > New > Triggers > GitHub
Create New Workflow
Start a new N8n workflow and add the GitHub trigger. This will monitor for changes to your repositories and fire when issues are added to milestones.
- 1Click 'New Workflow' from the N8n dashboard
- 2Drag the GitHub node from the trigger panel onto the canvas
- 3Select 'Repository' from the Events dropdown
- 4Choose 'Issues' as the specific event to monitor
GitHub Node > Credentials > New
Connect GitHub Account
Authenticate with GitHub using a personal access token. The token needs repo and issues permissions to read milestone data and issue assignments.
- 1Click 'Create New Credential' in the GitHub node
- 2Select 'GitHub OAuth2 API' from the credential type dropdown
- 3Generate a token at github.com/settings/tokens with 'repo' scope checked
- 4Paste the token into the 'Access Token' field and click 'Connect'
Nodes > Logic > IF
Filter for Milestone Events
Add an IF node to filter only events where issues are assigned to milestones. This prevents the workflow from firing on every issue change.
- 1Add an IF node after the GitHub trigger
- 2Set the condition to 'action' equals 'assigned'
- 3Add a second condition with 'milestone' is not 'null'
- 4Connect both conditions with AND logic
Nodes > Data > Set
Extract Milestone Data
Use a Set node to pull milestone title, due date, and description from the GitHub payload. These fields will map to Jira sprint properties.
- 1Add a Set node after the IF node's 'true' branch
- 2Add field 'milestone_title' with value '{{$node["GitHub Trigger"].json["issue"]["milestone"]["title"]}}'
- 3Add field 'milestone_due' with value '{{$node["GitHub Trigger"].json["issue"]["milestone"]["due_on"]}}'
- 4Add field 'issue_title' and 'issue_body' from the GitHub issue data
Nodes > Apps > Jira
Search Existing Jira Sprints
Add a Jira node to check if a sprint already exists for this milestone. This prevents creating duplicate sprints when multiple issues are added.
- 1Drag a Jira node onto the canvas after the Set node
- 2Choose 'Search' as the operation
- 3Set Resource to 'Sprint'
- 4Use JQL query: 'sprint.name ~ "{{$node["Set"].json["milestone_title"]}}'
Jira Node > Credentials > New
Connect Jira Credentials
Set up Jira authentication using your instance URL and API token. N8n supports both cloud and server instances with different auth methods.
- 1Click 'Create New Credential' in the Jira node
- 2Select 'Jira Software Cloud API' for cloud instances
- 3Enter your Jira domain (yourcompany.atlassian.net)
- 4Generate an API token from id.atlassian.com and paste it with your email
Nodes > Logic > IF
Add Sprint Creation Logic
Use another IF node to create a new Jira sprint only if the search returned no results. This handles the create-or-link logic cleanly.
- 1Add an IF node after the Jira search
- 2Set condition to check if search results array length equals 0
- 3Expression: '{{$node["Jira"].json.length === 0}}'
- 4Label the true branch 'Create Sprint' and false branch 'Use Existing'
Create Sprint Branch > Jira > Create
Create New Jira Sprint
On the 'true' branch, add a Jira node to create a sprint using the milestone data. Map the milestone due date to the sprint end date.
- 1Add a Jira node to the 'Create Sprint' branch
- 2Set Operation to 'Create' and Resource to 'Sprint'
- 3Map Sprint Name to '{{$node["Set"].json["milestone_title"]}}'
- 4Set End Date to '{{$node["Set"].json["milestone_due"]}}' if not null
Both Branches > Set > Merge
Get Sprint ID
Add Set nodes on both branches to normalize the sprint ID value. The create branch gets it from the new sprint, the existing branch from search results.
- 1Add Set node after 'Create Sprint' with field 'sprint_id' = '{{$node["Jira"].json["id"]}}'
- 2Add Set node after 'Use Existing' with field 'sprint_id' = '{{$node["Jira"].json[0]["id"]}}'
- 3Add a Merge node to combine both branches
- 4Connect both Set nodes to the Merge node
Merge > Jira > Create Issue
Create Jira Issue
Add a final Jira node to create the issue in the identified sprint. Map GitHub issue data to Jira fields and assign it to the sprint.
- 1Add a Jira node after the Merge
- 2Set Operation to 'Create' and Resource to 'Issue'
- 3Map Summary to GitHub issue title
- 4Set Sprint field to '{{$node["Merge"].json["sprint_id"]}}'
- 5Map Description to GitHub issue body
Workflow > Activate > Executions
Test the Workflow
Activate the workflow and test with a real GitHub issue assignment. Check both the create-new-sprint and use-existing-sprint paths.
- 1Click 'Activate' toggle in the top right
- 2Go to GitHub and assign an issue to a milestone
- 3Return to N8n and check the execution log
- 4Verify the Jira issue was created in the correct sprint
Drop this into an n8n Code node.
JavaScript β Code Node// Clean milestone title for Jira sprint namingβΈ Show code
// Clean milestone title for Jira sprint naming const milestoneTitle = items[0].json.milestone_title; const cleanTitle = milestoneTitle.replace(/[^a-zA-Z0-9\s-]/g, '').trim();
... expand to see full code
// Clean milestone title for Jira sprint naming
const milestoneTitle = items[0].json.milestone_title;
const cleanTitle = milestoneTitle.replace(/[^a-zA-Z0-9\s-]/g, '').trim();
const sprintName = `Sprint: ${cleanTitle}`;
return [{json: {sprint_name: sprintName}}];Scaling Beyond 50+ milestone assignments per day+ Records
If your volume exceeds 50+ milestone assignments per day records, apply these adjustments.
Batch Issue Processing
Group multiple issues assigned to the same milestone within a 5-minute window using N8n's wait node. This reduces duplicate sprint searches and API calls to Jira.
Cache Sprint Lookups
Store created sprint IDs in N8n's database using the sticky notes feature or external cache. This eliminates repeated Jira searches for popular milestones.
Rate Limit Handling
Add exponential backoff retry logic using code nodes when hitting Jira's 300 requests per minute limit. GitHub webhooks will retry failed deliveries automatically.
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use N8n for this if you need custom data transformation between GitHub milestones and Jira sprints, or if you're already running N8n self-hosted. The code nodes let you handle complex milestone-to-sprint mapping logic that Zapier can't touch. Skip N8n if you want zero maintenance - Make's visual debugging is better for non-technical team members who need to troubleshoot.
This workflow uses 4-6 executions per GitHub issue assignment. At 100 milestone assignments monthly, that's 500 executions total. N8n's starter plan at $20/month covers 2,500 executions easily. Make would cost $9/month for the same volume, and Zapier starts at $20 but limits you to 750 tasks. Make wins on price, but barely.
Make's GitHub integration includes a specific 'Issue added to milestone' trigger that's cleaner than N8n's generic webhook filtering. Zapier's Jira connector handles sprint creation more elegantly with built-in duplicate detection. But N8n's code nodes let you implement custom sprint naming conventions and complex milestone-to-sprint mappings that the other platforms can't handle without multiple scenarios.
GitHub's webhook payload structure changes between issue events - milestone assignments include different fields than regular issue updates. Jira's sprint API requires a board ID for creation, but GitHub milestones don't map to boards automatically. You'll need to hardcode the board ID or build lookup logic. The sprint search JQL is picky about exact name matches, so milestone titles with special characters break the duplicate detection.
Ideas for what to build next
- βAdd Slack Sprint Notifications β Send a message to your dev team channel when new sprints are created with issue counts and due dates.
- βSync Issue Status Changes β Build a reverse workflow that updates GitHub issue labels when Jira tickets move through workflow states.
- βAuto-assign Issues to Developers β Match GitHub issue assignees to Jira users and automatically assign tickets based on team capacity or expertise areas.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup