How to Write Better User Stories
The "As a...I want...So that" template is just the beginning. Learn the INVEST criteria, vertical slicing, and the habits that separate stories that drive alignment from stories that create confusion.
The Template and Its Limitations
The "As a [user], I want [goal] so that [benefit]" template is everywhere in agile teams, and for good reason: it works as a forcing function. It forces whoever is writing the story to name a user, articulate a goal, and justify the benefit. That is three more pieces of information than most ad-hoc feature requests contain.
But the template is not magic, and treating it as sufficient is one of the most common story-writing mistakes. You can write grammatically correct stories in the template that are still hopelessly vague, technically biased, or completely disconnected from actual user needs. "As an admin, I want to configure settings so that I can configure things" satisfies the template and says nothing useful.
The template is a starting point, not a destination. A good story uses the template as a scaffold and then builds something specific, testable, and genuinely user-centered on top of it. The template gets you to ask the right questions. The quality of your answers determines whether the story is useful.
The INVEST Criteria
Bill Wake's INVEST criteria give you a practical checklist for evaluating story quality. Each letter stands for a property a good story should have.
Independent. Stories should be deliverable in any order. If story B can only be built after story A, you have a dependency that complicates sprint planning and creates bottlenecks. Strive to organize work so that stories can be pulled in any sequence.
Negotiable. A story is not a contract. It is an invitation to a conversation. The details — scope, implementation approach, edge cases — are negotiable between the team and the product owner until the story is pulled into a sprint. If a story feels like a specification that must be followed to the letter, it is a spec, not a story.
Valuable. Every story should deliver something a user or the business cares about. Pure technical stories — "refactor the authentication module" — are not user stories. They may be necessary work, but they belong in a different category with different justification.
Estimable. If the team cannot estimate a story, either it is too vague (needs more information from the product owner) or too large (needs to be split). Stories that cannot be estimated are a red flag, not a reason to push harder for a number.
Small. Stories should be completable within a single sprint. The smaller, the better — smaller stories are easier to estimate, faster to review, and less likely to get stuck partway through. A story that takes the full sprint creates more risk than three stories that each take a third of the sprint.
Testable. Every story needs acceptance criteria that define what done looks like. If you cannot write a test — automated or manual — that confirms the story is complete, the story is too vague.
Vertical Slicing
Vertical slicing is the technique that separates teams who deliver value continuously from teams who spend entire sprints on work that produces nothing demonstrable until the last day.
A vertical slice cuts through all layers of the stack to deliver a thin but complete piece of functionality. A horizontal slice works on one layer in isolation — all the database work for a feature, then all the backend work, then all the frontend work. Horizontal slicing feels efficient because engineers can batch similar work. It is actually terrible for feedback, risk, and demonstrating value.
Consider a reporting feature. A horizontal approach might have the team spend Sprint 1 on the database schema, Sprint 2 on the API, and Sprint 3 on the UI. No value is delivered until Sprint 3, and if the requirements were wrong, you find out three sprints too late. A vertical approach would deliver a minimal but working report in Sprint 1 — perhaps only one report type, with basic filters, with a simple table output — and iteratively expand from there. The feedback comes early, the risks are smaller, and something demonstrable exists after week two.
When splitting large stories, always split vertically. Ask: "What is the thinnest slice of this feature that still delivers something a user can interact with?" That is your first story. Everything else is a follow-on.
Avoiding Technical Stories
Technical stories are stories written from the perspective of the code rather than the user. They are endemic in teams where developers write their own backlog items without product owner involvement. "Migrate database to PostgreSQL," "Upgrade authentication service," "Refactor payment module to use strategy pattern" — these are technical stories, and they create several problems.
First, they are invisible to stakeholders. A product owner cannot explain to a business why the team is spending a sprint on a database migration. This makes prioritization political and difficult.
Second, they are unmeasurable by user value. You cannot A/B test whether the refactored payment module is better for users. You can measure whether the payment module is more maintainable, but that value accrues to developers over time, not users immediately.
The alternative is to frame technical work in terms of the user outcome it enables. "Migrate database to PostgreSQL" becomes "Support 10x more concurrent users during peak traffic" — the same technical work, justified by a user-facing outcome. This framing makes the work easier to prioritize, easier to explain, and easier to validate. If you cannot explain what user outcome a technical task enables, that is worth understanding before you commit sprint capacity to it.
Writing Stories for Different Audiences
Different users have different goals, and a backlog that conflates them produces stories that satisfy no one. The most common mistake is writing all stories from the perspective of "the user" as if users are a homogeneous group. They are not.
An e-commerce platform has shoppers, sellers, and administrators. Each group has distinct goals, distinct workflows, and distinct definitions of value. A story written for "a user" might make sense to a shopper but be irrelevant to a seller. Precision about the user type produces stories that can be prioritized meaningfully, because the product owner can weigh a story's value against the importance of that user segment.
Personas are useful here, but they do not have to be elaborate. Even simple user role names — "a returning shopper," "a seller with multiple product listings," "a site administrator managing refunds" — anchor the story to a specific person with specific needs. The more specific the user, the more specific the acceptance criteria can be, and the easier the story is to test.
Good Stories vs. Bad Stories
The fastest way to improve story quality is to compare examples. Here is a bad story: "As a user, I want the system to be faster so that I can use it better." It is technically in the template. It is utterly useless. The user is undefined, "faster" is not measurable, and "use it better" means nothing.
Here is a better version: "As a returning customer, I want the checkout page to load within two seconds on a 4G connection so that I can complete purchases without abandoning the cart." Now the user is specific (returning customer), the goal is measurable (two seconds, 4G connection), and the benefit is tied to a real business outcome (cart abandonment). You can write acceptance criteria for this. You can test it. You can validate whether it was worth building.
Another example pair. Bad: "As an admin, I want to manage users." Good: "As an admin, I want to deactivate a user account immediately so that a terminated employee loses access before leaving the building." The bad story is a category. The good story is a specific scenario with a real-world trigger and a clear outcome.
The Story Is a Conversation Placeholder
This is the most important thing to understand about user stories: the card is not the requirement. The card is a reminder that a conversation needs to happen. Ron Jeffries described stories as having three components — Card, Conversation, Confirmation. The card captures the essence. The conversation fills in the details. The confirmation (acceptance criteria) records what agreement looks like.
Teams that treat the card as a complete specification skip the conversation and then wonder why they build the wrong thing. Teams that treat the card as so lightweight it contains nothing useful waste time in conversations that could have been shorter with better upfront framing.
The right posture is this: write enough on the card to have a useful conversation, not enough to replace the conversation. The goal of writing a story is not to eliminate ambiguity — it is to surface it in a controlled environment where the team can resolve it before the sprint starts. A story that prompts five good questions in refinement is more valuable than a story that prompts none because it looked complete but was not.
Ready to try planning poker?
Start a free estimation session with your distributed team in seconds. No signup required.
Start Planning PokerRelated Articles
ScrumChamps Team
Built by West 10 Tech — practical tools for agile teams.