Intermediate~15 min setupDeveloper Tools & Project ManagementVerified April 2026
GitHub logo
Jira logo

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-time

Use case type

sync

Real-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.

/mo
505005K50K

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

Skip the setup

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.

GitHub repository admin access to install webhooks and read milestone/issue data
Jira project administrator permissions to create issues and configure custom fields
Jira API token from your Atlassian account settings for authentication
Active milestones in your GitHub repository that represent sprints or planning periods

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Issue Titlesummary
Milestone Namecustomfield_10001
Issue URLcustomfield_10002
5 optional fields▸ show
Issue Descriptiondescription
Issue Labelslabels
Issue Creatorcustomfield_10003
Issue Numbercustomfield_10004
Repository Namecustomfield_10005

Step-by-Step Setup

1

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.

  1. 1Click the 'New Workflow' button on your dashboard
  2. 2Click the trigger step placeholder that says 'Select a trigger'
  3. 3Search for 'GitHub' in the app list
  4. 4Select 'GitHub' from the results
What you should see: You should see the GitHub app selected with trigger options displayed below.
2

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.

  1. 1Choose 'New Milestone Event' from the trigger list
  2. 2Click 'Connect GitHub' to authenticate
  3. 3Select your target repository from the dropdown
  4. 4Choose 'Issues' in the events filter
What you should see: The trigger shows 'Connected' status and displays your selected repository name.
Common mistake — The milestone webhook fires for all milestone events - you'll filter for 'issues added' in the next step.
3

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.

  1. 1Click 'Connect a new account' in the auth section
  2. 2Select required scopes: repo, read:org
  3. 3Click 'Authorize Pipedream' in GitHub
  4. 4Return to Pipedream and confirm connection
What you should see: You see a green checkmark next to your GitHub username in the account dropdown.
Common mistake — Without repo scope, you can't read milestone or issue data from private repositories.
4

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.

  1. 1Click the + button below the GitHub trigger
  2. 2Search for 'Filter' in the step library
  3. 3Select the 'Filter' step type
  4. 4Name it 'Filter for issue additions'
What you should see: A new Filter step appears with condition configuration options.
Common mistake — Skip this filter and you'll create Jira tickets for every milestone event, including deletions.
GitHub
GI
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Jira
JI
notified
5

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.

  1. 1Set condition to 'Equal'
  2. 2In left field, select steps.trigger.event.action
  3. 3In right field, type 'milestoned'
  4. 4Click 'Continue' to save the filter
What you should see: The filter shows your condition: 'action equals milestoned' with a green save confirmation.
Common mistake — GitHub also sends 'demilestoned' actions - make sure you use exact string matching for 'milestoned'.
6

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.

  1. 1Click + below the Filter step
  2. 2Search for 'Node.js' in the step library
  3. 3Select 'Run Node.js code'
  4. 4Name the step 'Prepare Jira data'
What you should see: A code editor appears with a basic Node.js template and access to the $ helper object.

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;
  }
});
7

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.

  1. 1Clear the existing template code
  2. 2Paste the data transformation code from the pro tip section
  3. 3Update the Jira project key to match your project
  4. 4Test the step to verify data extraction
What you should see: The step output shows formatted Jira ticket data with summary, description, and labels properly mapped.
Common mistake — Jira project keys are case-sensitive - double-check your exact project key in Jira settings.

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;
  }
});
8

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.

  1. 1Click + below the code step
  2. 2Search for 'Jira' and select it
  3. 3Choose 'Create Issue' from actions
  4. 4Click 'Connect Jira' to authenticate
What you should see: The Jira step loads with authentication options for cloud or server instances.
9

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.

  1. 1Select 'Jira Cloud' or 'Jira Server'
  2. 2Enter your Jira domain (yourcompany.atlassian.net)
  3. 3Provide email and API token for authentication
  4. 4Test the connection
What you should see: Authentication succeeds and you see available projects in the configuration dropdown.
Common mistake — Jira API tokens expire - save your token securely and update it in Connected Accounts when needed.
10

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.

  1. 1Select your target project from the dropdown
  2. 2Choose issue type (usually 'Story' or 'Task')
  3. 3Map Summary field to steps.prepare_jira_data.summary
  4. 4Map Description to steps.prepare_jira_data.description
  5. 5Set any required custom fields for your project
What you should see: All required Jira fields show mapped values with green validation checkmarks.
Common mistake — Missing required custom fields will cause ticket creation to fail - check your Jira project's required fields list.
11

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.

  1. 1Click 'Save' in the top right
  2. 2Go to your GitHub repository
  3. 3Add an issue to any milestone
  4. 4Return to Pipedream and check execution history
  5. 5Verify the Jira ticket was created
What you should see: The workflow execution shows green checkmarks for all steps and a new Jira ticket appears in your project.
Common mistake — Test with a non-critical milestone first - failed executions might create duplicate tickets if you rerun them.
Pipedream
▶ Deploy & test
executed
GitHub
Jira
Jira
🔔 notification
received

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 updatesCreate a second workflow that updates GitHub issue labels when Jira ticket status changes from In Progress to Done.
  • Include sprint points estimationExtract story points from GitHub issue descriptions or labels and map them to Jira's story point field for sprint planning.
  • Set up milestone completion notificationsBuild a digest workflow that notifies Slack when all issues in a milestone are marked complete in both systems.

Related guides

Was this guide helpful?
GitHub + Jira overviewPipedream profile →