Story point estimator

A shared definition of what 1, 2, 3, 5, 8 and 13 points actually mean, and a calculator that turns a sized backlog into working days including regression. The reference table is the half most teams skip, and it's the half that makes estimates comparable between people.

Reference scale

What each size means

Points measure effort, risk, repetition and complexity together, not hours. The time column is a sanity check, not a conversion rate.

PointsEffortTypical timeRiskComplexity & uncertainty
1Very lowMinutes to an hourMinimalStraightforward task with clear requirements and no expected challenges.
2LowHalf a dayLowMore involved than a 1-pointer but still routine. Minor uncertainties, predictable outcomes.
3ModerateOne dayModerateModerately complex, multiple steps, some dependencies that could affect completion.
5HighMore than a dayHighComplex work needing considerable time and resources, with notable uncertainty and room for surprises.
8Very highAbout a weekVery highConsiderable complexity, often several people involved. Significant unknowns and a high chance of change during testing.
13Extremely highMore than a weekExtremely highHighly complex, needs extensive coordination. Many unknowns and a high probability of scope change. Split it.

Scroll for more columns

Calculator

Turn a sized backlog into days

Ticket count by size (dev + QA)

PointsTicketsDays eachDays
10
20
30
50
80
130

Scroll for more columns

Full-pass testing before release. One day is a common minimum.
Used only to express the total in sprints.

Total estimate

-

Tickets-
Story points-
Build & test days-
Regression buffer-
Calendar weeks (5-day)-
Sprints-

The days column is editable. Derive your own numbers from finished tickets rather than inheriting mine - every team's point-to-day ratio is different, and that's fine as long as it's consistent.

Points measure size, not hours

The moment a team agrees that "3 points = one day", points stop being useful and become hours with extra steps. What makes the scale work is that it captures four things at once: effort, risk, repetition and complexity. A one-day task the team has done fifty times is not the same size as a one-day task nobody has attempted, and points can express that difference where hours cannot.

Estimate relatively, then convert once. Size tickets against each other in refinement, with no clock in the room. Convert to days later, at the backlog level, using your own historical ratio. That's what the calculator above is for, and it's why the conversion lives outside the sizing conversation.

The gaps in the sequence are the point. 1, 2, 3, 5, 8, 13 grows fast on purpose. The bigger a thing is, the less precisely anyone can size it, so the scale stops offering precision it can't deliver. Arguing between 5 and 8 is useful; arguing between 8 and 9 is theatre.

Everything at 13 is a research task in disguise. A 13 is the team saying "we don't understand this yet". Split it, or spike it first and size the pieces afterwards. Committing to a date that contains a 13 is committing to a number nobody in the room believes.

Include QA in the ticket, not after it. The count above is dev plus QA deliberately. Sizing development alone and treating testing as free is the most common reason sprint estimates come in optimistic by roughly a third.

Regression is a fixed cost, not a rounding error. Whatever the release contains, someone has to check the things it might have broken. Budget it explicitly - buried in the tickets, it silently eats the buffer you thought you had.

Embed this tool on your site

Free to use. The line under the frame is the only thing I ask for - please keep it.

<iframe src="https://veljkobarnic.com/tools/story-points/embed/"
        width="100%" height="940" style="border:1px solid #e1dad9;border-radius:12px"
        title="Story point estimator" loading="lazy"></iframe>
<p style="font:14px system-ui;color:#666">
  Story point estimator by
  <a href="https://veljkobarnic.com/tools/story-points/">Veljko Barnić</a>
</p>

Optional - add this if you would rather the frame resize itself to the result:

<script>
window.addEventListener("message", function (e) {
  if (!e.data || !e.data.vbEmbed) return;
  var f = document.querySelector('iframe[src*="/tools/' + e.data.slug + '/embed/"]');
  if (f) f.style.height = e.data.height + "px";
});
</script>