← All articles
  • Backlog
  • Scrum

How to write a user story a developer can actually build

How to write a user story that is clear enough to build: the As a / I want / so that format, when to drop it, writing acceptance criteria, and splitting stories that are too big.

6 min readThe Scrumpy team
How to write a user story a developer can actually build

A developer picks up a ticket that reads, in full: "Improve the dashboard." They now have two options. Guess what that means and risk building the wrong thing, or walk over and ask the person who wrote it, which is the conversation that should have happened before the ticket existed. Multiply that by a whole backlog and you have the quiet tax a team pays for vague stories: rework, interruptions, and features nobody actually asked for.

Writing a good user story is how you stop paying it. It is not a documentation exercise, and it does not need to be long. It needs to leave the next person knowing what to build and why.

What is a user story?

A user story is a short description of a piece of work, told from the point of view of the person who wants it. Not a spec, not a task list. A sentence or two that captures who needs something, what they need, and why. That third part, the why, is the one most teams drop, and it is the one that does the most work later.

The point of a story is not to write down every detail up front. It is to hold a place for a conversation, and to give that conversation enough context that it starts in the right place.

The "as a, I want, so that" format

The template most teams reach for is deliberately plain:

As a [type of user], I want [some goal], so that [some benefit].

Each clause pulls its weight:

  • As a names the person, so the work stays tied to someone real rather than an abstract feature.
  • I want states the goal in plain language, without prescribing the implementation.
  • So that gives the reason, and the reason is what lets a developer make good decisions when the wireframe runs out of answers.

Compare "Improve the dashboard" with "As a team lead, I want the dashboard to show which stories are blocked, so that I can unblock people before standup." The second one is buildable. It tells you who, what, and why, and it quietly rules out a hundred things that would not have served that goal.

When to drop the template

Here is the part the format guides tend to skip: the template is a tool, not a rule, and forcing it produces nonsense. "As a developer, I want to upgrade the framework, so that the framework is upgraded" helps no one. Plenty of real work, technical debt, infrastructure, a config change, has no external user and no benefit that survives the sentence.

When that happens, drop the ceremony and write a plain, clear sentence instead. "Upgrade to the new framework major version before its security support ends in March" is a fine story. The goal is clarity, and if the template is fighting clarity, the template loses.

What makes a story good

You do not need a scorecard. A good story passes a few quick checks, and a story that fails one is telling you something:

  • Small enough to finish in a sprint. If it cannot fit, it is not one story. It is several wearing a trench coat.
  • Valuable on its own. Finishing it should leave something better than before, even if the rest of the feature is not done yet.
  • Testable. If nobody can describe how they would confirm it works, nobody can confirm it is done.
  • Independent where possible. Stories that can only ship in a rigid chain turn a backlog into a single-file queue.

Most estimation pain traces back to a story that failed one of these before anyone tried to size it. A vague story produces a guess-shaped estimate, which is why story points work best on a backlog that has already been refined.

Acceptance criteria: where "done" gets specific

The story sells the idea. The acceptance criteria pin down what "done" means, so the answer is not decided by whoever demos it on Friday. If the story is "a user can reset their password," the criteria are the specifics: the reset link expires after an hour, an unknown email shows a neutral message rather than confirming the account exists, the old password stops working the moment the new one is set.

Write these as a short list of conditions that are true or false, not as prose. They are not the same thing as a definition of done or a definition of ready, which apply to every story on the board. Acceptance criteria are specific to this one, and they are where most of the "wait, that is not what I meant" moments get caught before code is written instead of after.

Splitting a story that is too big

The most common problem is not a vague story. It is a story that is genuinely clear and genuinely too big. When a story cannot fit in a sprint, resist the urge to cram it in. Split it, and split along a seam that still leaves each piece shippable:

  1. By workflow step. "Check out and pay" becomes "add to cart," then "enter shipping," then "take payment."
  2. By data or variation. Handle the common case first, then the currencies, edge cases and error states as their own stories.
  3. By happy path first. Build the version where everything goes right, then the stories that handle what happens when it does not.

A story reaching for your largest point value is a signal, not an estimate. It is telling you there are smaller stories hiding inside, and sizing it against a capped scale is often what surfaces them.

The story is the start, not the end

A good user story is not a contract that removes the need to talk. It is the thing that makes the talking short, because everyone starts from the same who, what and why. Get that right and most of the arguing you assumed was part of the job simply stops happening.

None of this needs heavy tooling. In Scrumpy a story has room for a description, acceptance criteria and a size in one place, and if the wording is the part you dread, the built-in writing assistant will turn your rough notes into a clear draft you can edit down. But the tool is not the point. The point is that the next person to open the story should know what to build, and why, without getting up from their desk.

Frequently asked questions

What is a user story?

A user story is a short description of a piece of work told from the point of view of the person who wants it. It captures who needs something, what they need, and why, usually in a sentence or two. It is a starting point for a conversation, not a full specification.

What is the user story format?

The common template is: as a [type of user], I want [some goal], so that [some benefit]. The role sets context, the goal says what to build, and the benefit explains why it matters. The benefit is the most useful and most often skipped part, because it lets a developer make sensible calls when the details run out.

What makes a good user story?

A good story is small enough to finish inside a sprint, valuable enough to be worth doing on its own, and clear enough to test. If nobody can say how they would check it is done, it is not ready. If it is too big to finish in a sprint, it is hiding several smaller stories.

What is the difference between a user story and acceptance criteria?

The story is the short why-and-what; the acceptance criteria are the specific conditions that must be true for it to be accepted. The story says a user can reset their password. The criteria spell out the reset link expiring after an hour, the error shown for an unknown email, and so on. One sells the idea, the other pins down done.

Keep reading