

How to sync GitHub milestones with Jira sprints with Pipedream
Automatically create and link Jira tickets when GitHub issues are added to 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 plan in GitHub but track work in Jira and need instant sync between milestone changes and sprint tickets
Not ideal for
Teams that only use one tool or prefer manual sprint planning sessions without automation
Sync type
real-timeUse case type
syncReal-World Example
A 12-person product team at a B2B SaaS company uses GitHub for code and issues but Jira for sprint tracking and reporting to stakeholders. Before automation, the scrum master spent 30 minutes each morning manually creating Jira tickets for new GitHub issues added to the current milestone. Now when developers add issues to the Sprint 24 milestone, corresponding Jira tickets appear in 15 seconds with proper sprint assignment.
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 Pipedream
Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 | ||
| Issue Title | summary | |
| Milestone Name | customfield_10001 | |
| Issue URL | customfield_10002 | |
5 optional fields▸ show
| Issue Description | description |
| Issue Labels | labels |
| Issue Creator | customfield_10003 |
| Issue Number | customfield_10004 |
| Repository Name | customfield_10005 |
Step-by-Step Setup
Pipedream Dashboard > New Workflow
Create new Pipedream workflow
Go to pipedream.com and click New Workflow in your dashboard. You'll see a blank workflow canvas with a trigger step placeholder. This workflow will listen for GitHub milestone events and create corresponding Jira tickets when issues are added.
- 1Click the 'New Workflow' button on your dashboard
- 2Click the trigger step placeholder that says 'Select a trigger'
- 3Search for 'GitHub' in the app list
- 4Select 'GitHub' from the results
Workflow > Trigger Step > GitHub > New Milestone Event
Configure GitHub milestone webhook
Select the 'New Milestone Event' source from GitHub's trigger options. This fires whenever milestone events occur in your repository. You'll need to connect your GitHub account and specify which repository to monitor for milestone changes.
- 1Choose 'New Milestone Event' from the trigger list
- 2Click 'Connect GitHub' to authenticate
- 3Select your target repository from the dropdown
- 4Choose 'Issues' in the events filter
Trigger Step > Connect Account > GitHub
Add GitHub authentication
Pipedream will prompt you to authenticate with GitHub. Click the authentication button and authorize Pipedream to access your repositories. Make sure you grant access to the specific organization or repository where your milestones live.
- 1Click 'Connect a new account' in the auth section
- 2Select required scopes: repo, read:org
- 3Click 'Authorize Pipedream' in GitHub
- 4Return to Pipedream and confirm connection
Workflow > + Add Step > Filter
Add filter for issue additions
Click the plus button below your trigger to add a new step. Search for 'Filter' and add a Filter step. This prevents the workflow from running on milestone events that aren't about adding issues - like milestone creation or closing.
- 1Click the + button below the GitHub trigger
- 2Search for 'Filter' in the step library
- 3Select the 'Filter' step type
- 4Name it 'Filter for issue additions'
Filter Step > Condition Configuration
Configure issue addition filter
Set up the filter condition to only continue when issues are added to milestones. The GitHub webhook sends different action types - you want to filter for when action equals 'milestoned' and the issue object exists in the payload.
- 1Set condition to 'Equal'
- 2In left field, select steps.trigger.event.action
- 3In right field, type 'milestoned'
- 4Click 'Continue' to save the filter
Workflow > + Add Step > Code
Add Node.js code step for data preparation
Add a Code step to extract and format the GitHub issue data before sending to Jira. This step will grab the issue title, description, labels, and milestone name from the GitHub webhook payload and prepare them for Jira's expected format.
- 1Click + below the Filter step
- 2Search for 'Node.js' in the step library
- 3Select 'Run Node.js code'
- 4Name the step 'Prepare Jira data'
This Node.js code goes in the data preparation step to extract GitHub issue data and format it for Jira. Paste it into the code editor and update the project key to match your Jira project.
JavaScript — Code Stepexport default defineComponent({▸ Show code
export default defineComponent({
async run({ steps, $ }) {
const { issue, milestone, repository } = steps.trigger.event;... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
const { issue, milestone, repository } = steps.trigger.event;
// Prevent processing if issue doesn't exist
if (!issue || !milestone) {
$.flow.exit('No issue or milestone data in event');
return;
}
// Convert GitHub markdown to Jira markup
const convertMarkdown = (text) => {
if (!text) return '';
return text
.replace(/\*\*(.*?)\*\*/g, '*$1*') // Bold
.replace(/\*(.*?)\*/g, '_$1_') // Italic
.replace(/([\s\S]*?)/g, '{code}$1{code}') // Code blocks
.replace(/`(.*?)`/g, '{{$1}}'); // Inline code
};
// Extract labels and convert to Jira format
const labels = issue.labels?.map(label => label.name) || [];
// Prepare Jira ticket data
const jiraData = {
summary: issue.title,
description: convertMarkdown(issue.body),
labels: labels,
milestone: milestone.title,
githubUrl: issue.html_url,
githubNumber: issue.number,
creator: issue.user?.login,
repository: repository.name,
projectKey: 'YOUR_PROJECT_KEY' // Update this
};
// Return data for next step
return jiraData;
}
});Code Step > Editor
Write data transformation code
Replace the template code with logic to extract GitHub issue data and format it for Jira. The code will access the webhook payload from previous steps and structure it as a Jira ticket object with proper field mapping.
- 1Clear the existing template code
- 2Paste the data transformation code from the pro tip section
- 3Update the Jira project key to match your project
- 4Test the step to verify data extraction
This Node.js code goes in the data preparation step to extract GitHub issue data and format it for Jira. Paste it into the code editor and update the project key to match your Jira project.
JavaScript — Code Stepexport default defineComponent({▸ Show code
export default defineComponent({
async run({ steps, $ }) {
const { issue, milestone, repository } = steps.trigger.event;... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
const { issue, milestone, repository } = steps.trigger.event;
// Prevent processing if issue doesn't exist
if (!issue || !milestone) {
$.flow.exit('No issue or milestone data in event');
return;
}
// Convert GitHub markdown to Jira markup
const convertMarkdown = (text) => {
if (!text) return '';
return text
.replace(/\*\*(.*?)\*\*/g, '*$1*') // Bold
.replace(/\*(.*?)\*/g, '_$1_') // Italic
.replace(/([\s\S]*?)/g, '{code}$1{code}') // Code blocks
.replace(/`(.*?)`/g, '{{$1}}'); // Inline code
};
// Extract labels and convert to Jira format
const labels = issue.labels?.map(label => label.name) || [];
// Prepare Jira ticket data
const jiraData = {
summary: issue.title,
description: convertMarkdown(issue.body),
labels: labels,
milestone: milestone.title,
githubUrl: issue.html_url,
githubNumber: issue.number,
creator: issue.user?.login,
repository: repository.name,
projectKey: 'YOUR_PROJECT_KEY' // Update this
};
// Return data for next step
return jiraData;
}
});Workflow > + Add Step > Jira > Create Issue
Add Jira connection step
Add a new Jira step to create the ticket. Click the plus button and search for Jira, then select the 'Create Issue' action. This will prompt you to authenticate with your Jira instance and configure the ticket creation parameters.
- 1Click + below the code step
- 2Search for 'Jira' and select it
- 3Choose 'Create Issue' from actions
- 4Click 'Connect Jira' to authenticate
Jira Step > Authentication
Authenticate Jira connection
Connect your Jira account by providing your Jira domain and API credentials. For Jira Cloud, you'll need an API token from your Atlassian account. For Jira Server, use your username and password or API token depending on your configuration.
- 1Select 'Jira Cloud' or 'Jira Server'
- 2Enter your Jira domain (yourcompany.atlassian.net)
- 3Provide email and API token for authentication
- 4Test the connection
Jira Step > Create Issue Configuration
Configure Jira ticket creation
Map the prepared data from your code step to Jira ticket fields. Select your target project and issue type, then map the summary, description, and other fields using the data prepared in the previous code step.
- 1Select your target project from the dropdown
- 2Choose issue type (usually 'Story' or 'Task')
- 3Map Summary field to steps.prepare_jira_data.summary
- 4Map Description to steps.prepare_jira_data.description
- 5Set any required custom fields for your project
Workflow > Save > Test
Test and deploy the workflow
Save your workflow and test it with a real GitHub milestone event. Add an issue to a milestone in your connected repository to trigger the workflow. Check both the Pipedream execution logs and your Jira project to confirm the ticket was created correctly.
- 1Click 'Save' in the top right
- 2Go to your GitHub repository
- 3Add an issue to any milestone
- 4Return to Pipedream and check execution history
- 5Verify the Jira ticket was created
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 Pipedream for this if your team lives in code and needs instant webhook processing with custom data transformation. The Node.js code steps let you handle GitHub's complex milestone webhook payloads and convert markdown to Jira markup without external tools. You also get instant webhook processing - Jira tickets appear within 15 seconds of milestone changes. Skip Pipedream if your team prefers visual workflow builders over writing code.
At 100 milestone events per month, you'll use about 300 credits (3 per execution for the multi-step workflow). That's $15/month on Pipedream's paid plan. Zapier costs $20/month for the same volume on their Professional plan. Make starts at $9/month but charges per operation, hitting $18/month at this volume. Pipedream wins on cost and webhook speed.
Zapier handles Jira custom field mapping better with their visual field picker - no need to look up field IDs. Make's scenario builder makes complex conditionals easier to visualize than Pipedream's code-first approach. N8N's GitHub and Jira nodes have better built-in error handling for API timeouts and rate limits. But Pipedream's instant webhooks and unlimited workflow complexity make it the best choice when you need real-time sprint sync and don't mind writing JavaScript.
You'll hit GitHub's webhook retry logic if your workflow fails - they'll send the same payload 3 times over 24 hours. This creates duplicate Jira tickets unless you add deduplication checks. Jira Cloud rate limits API requests to 300 per minute, so batch processing breaks at high volume. The GitHub milestone webhook also fires for milestone metadata changes (title, due date) not just issue assignments, so your filter logic needs to be specific or you'll create tickets for irrelevant events.
Ideas for what to build next
- →Add reverse sync for status updates — Create a second workflow that updates GitHub issue labels when Jira ticket status changes from In Progress to Done.
- →Include sprint points estimation — Extract story points from GitHub issue descriptions or labels and map them to Jira's story point field for sprint planning.
- →Set up milestone completion notifications — Build a digest workflow that notifies Slack when all issues in a milestone are marked complete in both systems.
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