Engineering MetricsMarch 16, 2026 · 14 min read

Jira + DORA Metrics: How to Track Lead Time and Deployment Frequency from Jira Data

Jira is where engineering work begins — requirements, stories, bugs, incidents. But Jira alone cannot give you DORA metrics. This guide explains exactly what Jira can contribute to each of the four DORA measures, the precise REST API endpoints and JQL queries you need, and how to wire Jira to GitHub and your CI/CD pipeline for complete DORA visibility.

What this guide covers

Why Jira alone is insufficient for DORA, which DORA metrics Jira can contribute to and how, the exact Jira REST API v3 endpoints to query, JQL queries for lead time and MTTR and CFR, how to link Jira issues to GitHub PRs and deployments via smart commits and the development info API, Jira webhook configuration for real-time sync, and why you need a GitHub or CI/CD integration alongside Jira for deployment frequency.

Why Jira Alone Is Not Enough for DORA

Jira is an issue tracker. It models work: epics, stories, tasks, bugs, and incidents move through states in a configured workflow. What Jira does not model — by design — is code changes, pipeline executions, or production deployments. Those events live in your version control system and your CI/CD platform.

The four DORA metrics each require timestamps from specific production events. Deployment Frequency counts successful production releases. Lead Time for Changes measures the elapsed time from a code commit reaching the main branch to that commit running in production. Change Failure Rate identifies deployments that introduced a regression. MTTR measures how quickly you restored service after an incident.

Jira has no native concept of a "production deployment." It has fix versions, release dates, and sprint completion events — but those are metadata that engineering managers set manually, not timestamps automatically generated by a deployment pipeline. If you try to calculate DORA from Jira alone, you end up measuring project management habits rather than delivery performance.

That said, Jira is genuinely valuable for three of the four DORA metrics when combined with the right data sources. The key is understanding which part of each metric comes from Jira and which part must come from GitHub or your CI/CD system.

What Jira CAN Contribute to DORA

Three of the four DORA metrics have a Jira component. One does not. Understanding this split is the foundation of a correct Jira DORA implementation.

Lead Time for Changes: The Issue-to-Deploy Pipeline

Lead Time for Changes measures how long it takes for committed code to reach production. Jira can anchor the start of that measurement. When a developer creates a Jira issue and begins work, that issue creation timestamp (created) or the transition to "In Progress" (statusCategoryChangedAt) represents the beginning of the delivery cycle.

The full issue-to-deploy pipeline looks like this: a Jira issue is created and moves to In Progress. The developer opens a branch named with the issue key (e.g., PROJECT-123-add-payment-retry). They open a pull request in GitHub and link it to the Jira issue via a smart commit or the Jira development panel. The PR is reviewed, merged, and a deployment pipeline runs. The deployment completes successfully in production.

The lead time for that change is the delta between the Jira issue creation and the production deployment timestamp. This is a richer view than commit-to-deploy alone — it captures time spent in planning, design, and backlog refinement that pure VCS-based lead time misses.

Change Failure Rate: Bug and Incident Tickets Linked to Deployments

Change Failure Rate (CFR) is the percentage of production deployments that cause a degradation requiring a hotfix, rollback, or incident. Jira is often where those degradations are first formally captured — as a Bug or Incident issue type created shortly after a deployment.

The correlation works like this: after every production deployment, you look at Jira for Bug or Incident tickets created in a short time window (typically 0–4 hours post-deploy). If a high-priority bug ticket appears within that window, it is counted as a deployment-related failure. The CFR denominator is total production deployments from your CI/CD system; the numerator is deployments with at least one linked failure ticket.

For this to be accurate, your team needs a consistent practice of labeling deployment-related bugs with a tag like deployment-regression or linking the Jira bug to the specific deployment that introduced it. Teams that do this consistently get CFR numbers that are significantly more accurate than pipeline-status CFR alone — because many production regressions are caught by users and reported as support tickets, not as automated pipeline alerts.

MTTR: P1/P2 Incident Tickets from Created to Resolved

Mean Time to Restore (MTTR) is the most natural Jira DORA metric. If your team creates Jira incident tickets for production outages, you have the timestamps you need: the ticket's created field (when the incident was detected and logged) and the transition to "Done" or "Resolved" (when the incident was confirmed closed).

For Jira-based MTTR, filter to issuetype in (Incident, Bug) with priority in (Highest, High) — these are your P1 and P2 incidents. The MTTR for each is the delta between created and the resolved state transition timestamp. Aggregate with the median, not the mean — a single multi-day outage will distort a monthly mean while the median remains representative.

The limitation: Jira MTTR ends when the ticket is closed, not when service is restored. If your team closes tickets after writing a post-mortem (which may happen days after recovery), your MTTR will be artificially inflated. Supplement Jira incident tickets with PagerDuty or incident.io data where available — those tools record the actual service restoration timestamp automatically.

Deployment Frequency: What Jira CANNOT Measure

Deployment Frequency is the one DORA metric Jira cannot contribute to meaningfully. Jira fix versions have a release date field, but that date is set manually by a project manager and often does not match when code actually deployed to production. Sprint completion events are planning boundaries, not deployment events.

Deployment Frequency must come from your actual deployment pipeline: GitHub Actions workflow runs, CircleCI, Jenkins, or your cloud provider's deployment service. Only those systems have the authoritative record of when code reached production and whether it succeeded. See our guide on calculating DORA metrics for the deployment frequency API queries specific to each CI/CD platform.

Jira REST API v3 Endpoints for DORA Data

Jira Cloud exposes a well-documented REST API at https://your-domain.atlassian.net/rest/api/3/. All requests require Basic Auth (email + API token) or OAuth 2.0. The following endpoints are the ones you will use for DORA metric extraction.

Issue Details: GET /rest/api/3/issue/{issueKey}

Fetch a single issue by key to get all timestamps and field values. This is useful when you have a known issue key from a PR description or branch name.

GET https://{domain}.atlassian.net/rest/api/3/issue/{issueKey}

# Key fields for DORA:
# fields.created              → when the issue was created (lead time start)
# fields.resolutiondate       → when the issue was resolved (MTTR end)
# fields.priority.name        → "Highest" / "High" / "Medium" / "Low"
# fields.issuetype.name       → "Bug" / "Story" / "Task" / "Incident"
# fields.status.name          → current status ("In Progress", "Done", etc.)
# fields.labels[]             → custom labels, e.g. "deployment-regression"
# fields.fixVersions[]        → linked fix versions / releases

Bulk Search: GET /rest/api/3/search?jql=...

For DORA calculations you need to query issues in bulk using JQL (Jira Query Language). The search endpoint supports pagination, field projection, and changelog expansion.

GET https://{domain}.atlassian.net/rest/api/3/search
  ?jql=issuetype%20%3D%20Bug%20AND%20priority%20%3D%20Highest%20AND%20created%20%3E%3D%20-30d
  &fields=summary,created,resolutiondate,priority,status,issuetype,labels
  &expand=changelog
  &maxResults=100
  &startAt=0

# Pagination: if total > maxResults, increment startAt by maxResults
# changelog expansion gives you state transition history for MTTR calculations

The expand=changelog parameter is important for MTTR. It returns the full history of status transitions, so you can find the exact timestamp when the issue transitioned to "Done" or "Resolved" rather than relying on the resolutiondate field (which may be null if your workflow uses a custom closed status).

Fix Versions: GET /rest/api/3/project/{key}/versions

Fix versions in Jira are the closest native concept to a release grouping. Each version has an optional releaseDate field and an archived and released boolean.

GET https://{domain}.atlassian.net/rest/api/3/project/{projectKey}/versions

# Key fields:
# versions[].id          → version ID (use in JQL as fixVersion = {id})
# versions[].name        → e.g. "v2.14.0"
# versions[].released    → true if marked released
# versions[].releaseDate → manually set release date (not reliable for DORA)
# versions[].archived    → true if archived

# Warning: releaseDate is a manual field — not set automatically by any deployment pipeline.
# Use it as a supplementary grouping label, not as the authoritative deployment timestamp.

Development Info API: Linking Issues to Commits and PRs

The most powerful Jira API for DORA purposes is the development information API, also called the devinfo API. This API is how Jira surfaces the GitHub branch, commit, and PR links you see in the Jira issue's "Development" panel. It requires the Jira Software API scope.

# Fetch development info for an issue
GET https://{domain}.atlassian.net/rest/dev-status/latest/issue/detail
  ?issueId={issueId}
  &applicationType=GitHub
  &dataType=branch

# Response includes:
# detail[].branches[].createPullRequestUrl → linked PR URL
# detail[].branches[].url                  → GitHub branch URL
# detail[].branches[].lastCommit.id        → commit SHA
# detail[].branches[].lastCommit.timestamp → last commit timestamp

# Also query for PRs directly:
GET https://{domain}.atlassian.net/rest/dev-status/latest/issue/detail
  ?issueId={issueId}
  &applicationType=GitHub
  &dataType=pullrequest

# Returns:
# detail[].pullRequests[].id        → PR number
# detail[].pullRequests[].status    → "OPEN" / "MERGED" / "DECLINED"
# detail[].pullRequests[].url       → GitHub PR URL
# detail[].pullRequests[].lastUpdate → last update timestamp

The devinfo API requires that you have the Jira Software + GitHub integration configured. When a developer mentions a Jira issue key in a commit message or PR title, GitHub automatically pushes that linkage to Jira via the integration webhook, and it becomes visible through this API.

Webhooks: Real-Time Issue Event Sync

For real-time DORA calculations rather than batch polling, configure Jira webhooks to push events to your metrics pipeline as they happen.

# Register a webhook via the Jira REST API
POST https://{domain}.atlassian.net/rest/api/3/webhook

{
  "url": "https://your-metrics-service.com/webhooks/jira",
  "webhooks": [
    {
      "events": ["jira:issue_created", "jira:issue_updated"],
      "jqlFilter": "issuetype in (Bug, Incident, Story, Task) AND project = YOUR_PROJECT"
    }
  ]
}

# Key events for DORA:
# jira:issue_created  → fires when a new issue is created (lead time clock start)
# jira:issue_updated  → fires on any field change, including status transitions
#                       Check changelog.items[].field == "status" for transitions
#                       and changelog.items[].toString for the new status name

The jira:issue_updated event's payload includes a changelog object listing every field changed in that update. Filter for status transitions to "Done" or "Resolved" to capture MTTR resolution timestamps in real time without polling.

How to Link Jira Issues to GitHub PRs and Deployments

The critical integration for Jira DORA is establishing the link between Jira issues and the GitHub pull requests and deployments that implement them. There are three mechanisms for doing this, and they are not mutually exclusive.

Smart Commits

Smart commits are a Jira feature where mentioning an issue key in a Git commit message automatically links that commit to the issue. The format is simply including the project key and issue number anywhere in the commit message.

# Examples of smart commit messages that link to Jira issues:
git commit -m "feat: add retry logic for payment gateway PROJECT-123"
git commit -m "PROJECT-456 fix null pointer exception in checkout flow"
git commit -m "refactor: extract auth middleware [PROJECT-789]"

# Jira picks up the issue key via the GitHub-Jira integration
# and creates a development link visible in the issue's Development panel.
# This link is then queryable via the devinfo API shown above.

Smart commits work automatically once the GitHub–Jira integration is configured. Developers do not need to do anything special beyond including the issue key in their commit message — a practice many teams already follow for traceability.

PR Title and Branch Name Conventions

The same automatic linking applies to PR titles and branch names. A branch named PROJECT-123-add-retry-logic or a PR titled PROJECT-123: Add retry logic for payment gateway will trigger the Jira integration to link that PR to the issue. This is often more reliable than relying on commit messages alone because PRs are a more structured artifact.

Jira Deployments API

Jira Software supports a dedicated Deployments API that allows CI/CD systems to push deployment events directly into Jira. When a deployment completes, your pipeline can call this API and Jira will associate the deployment with any linked issues — giving you the issue-to-deployment link in a single queryable record.

# Push a deployment event to Jira
POST https://{domain}.atlassian.net/rest/deployments/0.1/bulk

{
  "deployments": [
    {
      "deploymentSequenceNumber": 42,
      "updateSequenceNumber": 42,
      "issueKeys": ["PROJECT-123", "PROJECT-456"],
      "displayName": "v2.14.0 → production",
      "url": "https://github.com/org/repo/actions/runs/123456",
      "description": "Deploy v2.14.0",
      "lastUpdated": "2026-03-16T10:30:00Z",
      "state": "successful",
      "pipeline": {
        "id": "github-actions-deploy",
        "displayName": "Deploy to Production",
        "url": "https://github.com/org/repo/actions"
      },
      "environment": {
        "id": "production",
        "displayName": "Production",
        "type": "production"
      }
    }
  ]
}

# After this call, Jira knows:
# - Which issues were in this deployment (issueKeys)
# - When the deployment happened (lastUpdated)
# - Whether it succeeded (state: "successful" | "failed" | "rolled_back")
# This enables precise issue-to-deploy lead time calculation.

This Deployments API is the most powerful Jira DORA integration available. It creates a first-class deployment record inside Jira, visible in the issue panel, and queryable via the devinfo API. Teams that configure their GitHub Actions or CI/CD system to call this API on every production deployment have a complete issue-to-deploy audit trail without building any custom correlation logic.

JQL Queries for DORA Calculation

JQL (Jira Query Language) is the query interface for the /rest/api/3/search endpoint. The following JQL queries are the ones you will use most frequently for DORA metric extraction.

Lead Time: Issues Completed in a Date Range

# Stories and Tasks that moved to Done in the last 30 days
issuetype in (Story, Task) AND status changed to Done after -30d

# With project scope:
project = "YOUR_PROJECT"
  AND issuetype in (Story, Task)
  AND status changed to Done after -30d
  AND status changed to Done before now()

# For issue-to-deploy lead time, pair each result with
# the linked deployment timestamp from the devinfo or Deployments API.
# Lead time = deployment.lastUpdated − issue.created

Change Failure Rate: Deployment-Linked Bug Tickets

# Bugs labeled as deployment regressions in the last 30 days
issuetype = Bug
  AND labels = "deployment-regression"
  AND created >= -30d

# Alternative: high-priority bugs created close to a deployment
issuetype = Bug
  AND priority in (Highest, High)
  AND created >= -30d
  AND created <= now()

# CFR = count of deployments with a linked bug ticket
#       ÷ total production deployments in the same window × 100
# The deployment count MUST come from your CI/CD system, not Jira.

MTTR: P1/P2 Incident Tickets

# P1 and P2 incidents created in the last 30 days
issuetype in (Incident, Bug)
  AND priority in (Highest, High)
  AND created >= -30d

# For resolved incidents only (to calculate completed MTTR):
issuetype in (Incident, Bug)
  AND priority in (Highest, High)
  AND created >= -30d
  AND status in (Done, Resolved, Closed)

# MTTR per ticket:
# Use expand=changelog to find the exact transition timestamp to Done/Resolved.
# Do not use resolutiondate alone — it may be null for custom closed statuses.
# MTTR = resolved_transition_timestamp − issue.created

Sprint-Scoped Lead Time

# Issues completed in a specific sprint
project = "YOUR_PROJECT"
  AND sprint = "Sprint 42"
  AND status changed to Done during (2026-03-01, 2026-03-15)

# For ongoing sprints, use the openSprints() function:
project = "YOUR_PROJECT"
  AND sprint in openSprints()
  AND status changed to Done after -14d

The Jira DORA Capability Matrix

Before wiring up your integration, it is worth being precise about which parts of each DORA metric Jira can provide natively, which require external data, and which Jira cannot contribute to at all.

DORA MetricJira ContributionRequires External Data
Deployment FrequencyNoneGitHub / CI/CD pipeline
Lead Time (issue-to-deploy)Start timestamp (issue.created)Deployment timestamp from CI/CD
Lead Time (commit-to-deploy)PR link via devinfo APICommit + deployment from GitHub
Change Failure RateFailure signal (bug tickets)Deployment count from CI/CD
MTTR (incident tickets)Full signal (created → resolved)Supplement with PagerDuty / incident.io

Limitations of Jira-Only DORA and Why You Need Full Data Integration

Even with the Deployments API configured and smart commits flowing, a Jira-only DORA implementation has several structural limitations that degrade measurement accuracy over time.

Manual data entry degrades reliability

Jira fix versions, release dates, and issue-to-deployment links are often maintained manually by engineering managers or through team conventions. When sprints get busy, those conventions slip. Issues are closed without linking PRs. Fix versions are applied retroactively. Labels are inconsistently applied. The result is DORA numbers that drift from reality as team discipline varies — something that automated pipeline data does not suffer from.

Jira does not know when code reached production

Even with the Deployments API, Jira only knows about deployments that your CI/CD system explicitly reports to it. Emergency hotfixes applied directly to production infrastructure, database patches run by an SRE, or deployments through a tool not integrated with Jira will be invisible. Your Deployment Frequency will be undercounted and your Lead Time distribution will be incomplete.

MTTR from Jira tickets lags real recovery

The gap between service restoration and ticket closure is a well-known bias in Jira-based MTTR. Engineers restore service first, then update the ticket — sometimes hours or days later. If your team writes post-mortems before closing incidents, your Jira MTTR may be 2–10× longer than your actual time to restore service. Dedicated incident management tools like PagerDuty and incident.io record the "resolved" event at the moment the on-call engineer acknowledges the outage is over, not when the paperwork is done.

CFR requires temporal correlation with deployments

Linking a bug ticket to a deployment causally — rather than just temporally — is hard to automate from Jira alone. Two bugs created on the same day as a deployment might have been pre-existing and only discovered because monitoring was checked, not because the deployment introduced a regression. Without deployment-scoped test coverage data or change correlation from your GitHub diff, the CFR signal from Jira has a meaningful false positive rate.

The fundamental constraint

Jira is a work management system, not a deployment pipeline. It can contribute valuable timestamps and failure signals to DORA calculations, but it cannot be the sole data source for any of the four metrics without introducing significant measurement bias. Accurate DORA requires at minimum a Jira + GitHub integration, and ideally a Jira + GitHub + incident tool integration for complete coverage.

DORA Benchmarks: How Does Your Jira Team Compare?

Once you have your four DORA numbers calculated from the combined Jira + GitHub + CI/CD data, compare them against the DORA research performance tiers. These benchmarks apply regardless of which tools you use.

MetricEliteHighMediumLow
Deployment FrequencyMultiple/dayDaily – weeklyWeekly – monthly< Monthly
Lead Time for Changes< 1 hour1 day – 1 week1 week – 1 month> 6 months
Change Failure Rate0–5%5–10%10–15%> 15%
MTTR< 1 hour< 1 day1 day – 1 week> 6 months

Teams using Jira for project management tend to have longer measured Lead Times than teams using lighter-weight issue trackers — not because their delivery is slower, but because Jira projects often accumulate "created" issues that sit in backlog for weeks before anyone starts working on them. If you are using issue creation as your lead time start, filter to issues that were actually started (transitioned to "In Progress") rather than just created. This gives you a delivery-cycle lead time rather than a backlog-to-production lead time.

How Koalr Automates Jira + GitHub DORA in Minutes

Building and maintaining the Jira + GitHub DORA integration described in this guide is a significant engineering investment: API polling, webhook handlers, changelog parsing, devinfo queries, deployment event processing, and the correlation logic to join it all together. And that is before you add incident tool integration for accurate MTTR.

Koalr's Jira integration handles all of this automatically. Connect your Jira Cloud workspace and your GitHub organization in a single OAuth flow, and Koalr begins calculating all four DORA metrics immediately — using the correct data sources for each metric rather than approximating from Jira alone.

Specifically, Koalr's combined Jira + GitHub DORA pipeline does the following out of the box:

  • Deployment Frequency — pulled from GitHub Actions workflow runs and deployment events, not from Jira fix versions. Filtered to production environment and successful status only.
  • Lead Time — calculated from Jira issue creation (or "In Progress" transition, configurable) to the GitHub deployment timestamp. Uses smart commit links and PR-issue associations to build the full issue-to-deploy chain automatically. Also surfaces the narrower commit-to-deploy lead time for teams that want both views.
  • Change Failure Rate — combines GitHub deployment status with Jira bug tickets created in the post-deployment window. Configurable time window (default: 4 hours) and issue type filters to match your team's incident process.
  • MTTR — sources from Jira incident tickets when that is your team's primary incident channel, with optional PagerDuty and incident.io integration for more precise restoration timestamps. Koalr uses whichever source gives the highest-fidelity signal.
  • Deploy risk scoring — surfaces a pre-deployment risk score before each GitHub deployment reaches production, based on commit entropy, file churn, test coverage delta, and author file expertise. Jira issues linked to the PR are shown in context so engineers can assess whether the scope of the change matches the risk score.

For teams evaluating DORA measurement approaches, the complete DORA metrics guide covers the full methodology across all toolchains, and the lead time for changes deep dive covers every measurement decision in detail — including the tradeoffs between issue-to-deploy and commit-to-deploy lead time definitions.

Get complete DORA metrics from Jira + GitHub without building the pipeline yourself

Koalr connects Jira, GitHub, and your incident tools in one OAuth step and calculates all four DORA metrics automatically — with correct lead time anchoring, deployment frequency from actual pipeline data, and deploy risk scoring on every release.