← All Kits · Excel Kit

Estimate vs Actual in Jira: Turning the Export Into a Variance You Can Defend

Michael Nocito · Updated August 2026 · Every number on this page was worked before it was published

Somebody asks how far the team ran over. Jira exports a CSV with four time fields on every ticket, and picking the wrong two turns a 40 percent overrun into a clean sprint. This page is about the choice, not the export.

What you do: variance is time spent - original estimate, in hours, on completed tickets only, with re-estimated tickets flagged rather than dropped. Below is a real-shaped sprint where each of the three candidate formulas gives a different answer.

The short version. Only the original estimate can carry a variance, because it is the only field that was fixed before the work happened.

The four fields, and what each one really is

Jira fieldExport columnWhat it isUse for variance?
Original estimatetimeoriginalestimateThe commitment made before work startedYes. This is the baseline.
Remaining estimatetimeestimateToday's belief about what is leftNo. It moves daily and ends at 0.
Time spenttimespentLogged work, summed from worklogsYes. This is the actual.
Story pointscustom fieldRelative size, no unitSeparate report. Never in the same column as hours.

All three time fields export in seconds. Divide by 3,600 before anything else, and do it in its own column so the raw value is still there when a number looks wrong. A "1,800 hour" ticket is half an hour that nobody divided.

One sprint, three answers

Eight completed tickets. Estimate and spent are in hours.

TicketOriginal estTime spentVarianceVariance %Note
PAY-101810.5+2.5+31%
PAY-1021614-2.0-13%
PAY-103413+9.0+225%Scope grew
PAY-1048800%Re-estimated on day 3
PAY-1052421.5-2.5-10%
PAY-10626+4.0+200%
PAY-10707.5+7.5no percentageNever estimated
PAY-1081211-1.0-8%
Total7491.5+17.5+24%

The sprint ran 17.5 hours over 74 estimated, which is 24 percent. Now the three ways that number gets reported wrong:

PAY-107 is the row worth a sentence in the report. Seven and a half hours of work that was never planned. A variance report that silently excludes zero-estimate tickets is reporting on the planned work only, and calling it the sprint.

The re-estimate problem, and how to detect it

Jira keeps a changelog. If your export tool can carry it, pull Issue history for the original estimate field, and flag any ticket where it changed after the sprint start date. Those tickets cannot support a variance, and they should appear in the report as a count, not be quietly dropped:

Completed tickets              8
  with an untouched estimate   7
  re-estimated in flight       1   (PAY-104)
  never estimated              1   (PAY-107)

If the changelog is not available in your export, you can still say the honest thing: state that re-estimates cannot be detected in this data, which is a limitation worth writing down rather than a reason to stay quiet. That habit is the subject of documenting data limitations.

The export, and the two columns to build first

From Jira: Issues, filter to the sprint, Export > CSV (all fields). Then in Excel, before any pivot:

Est_h    =IF([@timeoriginalestimate]="",0,[@timeoriginalestimate]/3600)
Spent_h  =IF([@timespent]="",0,[@timespent]/3600)
Var_h    =[@Spent_h]-[@Est_h]
Var_pct  =IF([@Est_h]=0,"",[@Var_h]/[@Est_h])
Flag     =IF([@Est_h]=0,"unestimated",IF(ABS([@Var_h])>=4,"review",""))

The blank check matters: an unlogged ticket exports as an empty cell, not a zero, and a subtraction against an empty cell silently treats it as zero anyway. Make that decision explicit so the next person can see it was a decision.

What to report, and in which order

  1. The total: 91.5 hours spent against 74 estimated, 24 percent over.
  2. The concentration: two tickets, PAY-103 and PAY-106, account for 13 of the 17.5 hours.
  3. The pattern: both were estimated at four hours or less. Small tickets are where estimation is worst, because nobody breaks down work they think is small.
  4. The coverage: one ticket carried no estimate at all and took 7.5 hours.

That order works because it goes from the number they asked for to the action they can take. A list of eight ticket variances is data. "Our small tickets are the ones we misjudge" is a finding.

How to apply this to your own work

  1. Export one closed sprint and check which estimate field your report is currently reading. If it is timeestimate, your overruns have been vanishing.
  2. Divide the seconds in a named column, and keep the raw seconds column next to it.
  3. Count the zero-estimate tickets before you filter anything. That count is a finding on its own.
  4. Sum hours before dividing. Never average a column of percentages.
  5. Sort by absolute hours, not by percent, and see which tickets actually moved the sprint.

The one habit to keep

Ask which field was editable while the work was happening. Anything that could be edited after the promise was made cannot measure whether the promise was kept. That question generalises well past Jira: it is the same question to ask of a forecast that gets restated, or a target that moves in July.

In your last sprint report, how many tickets carried no estimate at all?

Every number here was worked before it was published. 74 estimated, 91.5 spent, 17.5 over, 23.6 percent. Averaging the seven per-ticket percentages instead gives 60.7 percent, which is the same sprint measured wrongly.
The overrun is rarely hidden in the numbers. It is hidden in which field somebody updated.

Thinking Like an Analyst is about the part no tool does for you: framing the question, choosing the measure, saying what the data cannot support, and defending a number in a room.

Thinking Like an Analyst, $19 →
The reporting skill here is choosing the measure, not exporting it.

Defining metrics is the companion read, and operations analytics covers throughput and cycle time on the same kind of export. The Excel Kit has the pivot and lookup mechanics.

Read Defining Metrics →