Writing User Stories That Don't Suck
- user stories
- agile
- requirements
Most teams can recite INVEST (Independent, Negotiable, Valuable, Estimable, Small, Testable) without being able to say whether the story on their screen actually meets it. The checklist isn't the hard part — applying it under deadline pressure is.
The template is the easy 20%
As a [persona]
I want to [action]
So that [benefit]Teams rarely get stuck writing this line. They get stuck because the line hides a missing decision: who exactly is the persona, and does "benefit" describe a real outcome or just restate the action?
A weak version:
As a user
I want to filter the report
So that I can filter it the way I wantA stronger version:
As a regional sales manager
I want to filter the pipeline report by close date and owner
So that I can spot deals at risk before my Monday forecast callThe second version tells engineering why the filter matters, which changes how they'll build it — and gives QA something concrete to test against.
Where INVEST actually bites
- Independent — if finishing this story requires another unfinished story to merge first, it's not really one story. Split it or sequence it explicitly.
- Negotiable — a story that specifies exact button placement isn't a requirement, it's a design decision wearing a requirement's clothes. Leave room for the how.
- Valuable — "so that the system is more maintainable" isn't a user value. If you can't name a human who benefits, it's a task, not a story.
- Estimable — if the team can't size it, the story is usually too vague, not too hard. Vague stories hide unanswered questions.
- Small — if it won't fit in one sprint with room to spare, split by workflow step or by data variation, not by technical layer.
- Testable — acceptance criteria should read like a checklist someone else could run without asking you what you meant.
Acceptance criteria carry the real weight
The story sets direction; the acceptance criteria make it testable:
- Given a sales manager viewing the pipeline report
- When they select a close-date range and an owner
- Then only deals matching both filters are shown, and the total updates to match
Three lines like that resolve more ambiguity than a paragraph of prose ever will, because they force you to name the exact inputs and the exact expected result.
A quick pre-sprint-planning check
Before a story goes into planning, confirm:
- A specific persona is named, not just "user"
- The benefit describes an outcome, not a restatement of the action
- Acceptance criteria are written as given/when/then or a numbered list
- Nothing in the story depends on a story that isn't already done
If a story fails more than one of these, it's worth another pass before the team estimates it.