Guide
User stories, from format to splitting to acceptance criteria.
Most teams write user stories. Far fewer write stories that survive contact with a sprint: small enough to finish, specific enough to test, honest enough about who wants them and why. This guide covers the whole craft, with worked examples of stories that fail and exactly why they fail.
Written by Israel Bankole, founder of Backlog.cloud. Last updated 9 August 2026.
In this guide
Definition
What a user story actually is
A user story is a short description of a change, told from the perspective of the person who wants it. Not a specification. Not a contract. A placeholder for a conversation the team will have when the work gets close. Atlassian's guide to user stories describes them as informal, general explanations of a feature written from the end user's point of view, and that word informal is doing real work. The informality is a feature. It stops teams from pretending they know everything up front.
The story exists to keep three things attached that most delivery processes tear apart: the person who wants something, the thing they want, and the reason they want it. When those three travel together, an engineer three weeks later can make a sensible judgement call without a meeting. When they separate, you get software that technically matches the ticket and helps nobody.
One more thing worth being blunt about. Stories are a tool from Extreme Programming that agile teams adopted widely. The Scrum Guide never mentions them. If the format is not serving a particular piece of work, you are allowed to not use it. More on that in the comparison section below.
Format
The format, and when to break it
The canonical shape has three clauses:
As a <specific role>,
I want <capability>,
so that <observable benefit>.
Each clause has a job. The role clause forces you to name a real person with real context, and "user" is not a real person. The want clause states a capability, not a solution, which keeps design options open. The so-that clause is the one teams mumble through, and it is the most important of the three: it is the only place the story justifies its own existence. A story whose so-that clause you cannot finish honestly is a story you should question.
When to break the format: when it adds ceremony without information. Bugs need reproduction steps, not personas. Technical enablers deserve to be honest tasks rather than "As a developer, I want to refactor the billing module". And when context matters more than identity, the job story format (covered below) swaps the persona for a situation. The format is scaffolding. The attached who, what and why is the actual requirement.
The 3Cs
Card, Conversation, Confirmation
Ron Jeffries, one of the founders of Extreme Programming, described a user story as three Cs, and the framing has outlived almost every other piece of agile vocabulary because it describes what stories are for rather than what they look like.
Card
The written artefact, deliberately too small to hold a full specification. The original medium was an index card, and the constraint was the point: if it does not fit on a card, you are writing a document, and documents get skimmed, not discussed.
Conversation
Where the real specification happens. The team and the person who wants the change talk through edge cases, constraints and trade-offs shortly before the work starts, when the details are freshest and cheapest to change. Teams that skip this step and treat the card as complete are doing waterfall with smaller documents. Knowing which questions to ask in that conversation is most of the skill.
Confirmation
The acceptance criteria: concrete checks that record what the conversation agreed. This is the part of the story that becomes tests. Without confirmation, done is a matter of opinion, and opinions differ most at the worst possible moment, the sprint review.
Worked examples
Two stories that fail, one that works
Bad stories are more instructive than good ones, because every team recognises them from their own backlog. Here are two common failures and a rewrite that would survive refinement.
Fails refinement
As a user, I want a dashboard, so that I can see my data.
Why it fails
- "A user" is nobody. An account admin, a finance lead and a new signup all want completely different dashboards.
- "A dashboard" is a solution, and an enormous one. This card hides ten stories: which metrics, which time ranges, which permissions.
- "See my data" restates the want. There is no benefit to weigh against other work, so it cannot be prioritised, estimated or tested.
Fails refinement
As a product owner, I want users to complete onboarding, so that activation goes up.
Why it fails
- The persona is the person writing the card. A story about what the business wants users to do is an objective, not a user need.
- There is no behaviour to build. "Complete onboarding" names an outcome the team should discover stories for, not a change anyone can implement.
- This is an epic, or a quarterly goal, in a story costume. Put it where goals live and derive real stories from the friction users actually hit.
Survives refinement
As a returning customer, I want to reuse the delivery address from my last order, so that I do not retype it at every checkout.
Acceptance criteria
- Given a signed-in customer with at least one completed order, when they reach the delivery step, then the most recent delivery address is offered as the default.
- Given the offered address, when the customer edits any field, then the edited address is used for this order and saved as the new most recent.
- Given a customer with no completed orders, when they reach the delivery step, then the empty address form is shown with no prefill.
Why it works
- The persona is narrow enough to imply context: signed in, has history.
- The want is a capability, not a widget. Prefill, picker or autofill stays a design decision.
- The benefit is concrete and checkable: a cost the customer stops paying at every checkout.
- Three scenarios cover the happy path, the override and the empty state. A tester could start today.
Quality checklist
INVEST in practical depth
Bill Wake's INVEST acronym is the standard health check for a story. Most write-ups stop at defining the six words. The useful version pairs each one with the symptom you will actually observe when it is violated, because that is how problems present in real backlogs.
Independent
Means: The story can be built and released without waiting on a sibling story.
Symptom when violated: Sprint planning turns into dependency Tetris. Story B is blocked until story A merges.
Fix: Split along a different axis. If two stories share a data model change, pull the shared change into the first story and let the second consume it.
Negotiable
Means: The story is an invitation to a conversation, not a signed contract.
Symptom when violated: The card specifies button colours and API field names before an engineer has seen it.
Fix: Strip implementation detail back out. Keep the outcome fixed and the mechanism open until the team discusses it.
Valuable
Means: Someone outside the team would notice, and care, if this shipped.
Symptom when violated: The so-that clause restates the want clause. "So that the database is migrated" is not value.
Fix: Ask "who complains if we never do this?" If the honest answer is nobody, it is a task or it is nothing.
Estimable
Means: The team can size it without a research project.
Symptom when violated: Estimation sessions stall on "well, it depends what we find". Ranges span an order of magnitude.
Fix: Extract the unknown into a timeboxed spike. Estimate the story after the spike answers the question.
Small
Means: It fits comfortably inside one sprint with room to spare.
Symptom when violated: The story rolls over two sprints in a row. Standup updates are "still on the export story".
Fix: Split it. The five techniques below exist precisely for this. A story that fills a whole sprint is an epic wearing a disguise.
Testable
Means: There is a concrete way to demonstrate it is done.
Symptom when violated: Acceptance criteria say "works correctly" or "is fast". Nobody can write the test.
Fix: Rewrite each criterion as Given/When/Then with an observable result. If you cannot phrase the Then, you do not understand the story yet.
Treat INVEST as a smoke test during refinement, not a gate. A story failing one letter is a prompt for a two-minute conversation. A story failing four is not ready and should not be argued into a sprint.
Confirmation
Acceptance criteria with numbered Gherkin scenarios
Acceptance criteria are the Confirmation in the 3Cs: the concrete checks that make done a fact instead of an opinion. The most reliable format is Gherkin, the Given/When/Then structure borrowed from behaviour-driven development, written as a numbered list so individual scenarios can be referenced in review and in test names.
The anatomy of one scenario
Given <a precondition that sets the scene>,
when <the user or system does one thing>,
then <an observable, checkable result>.
Each clause earns its place. Given pins down the state, which is where most testing ambiguity hides: signed in or not, data present or empty, feature flag on or off. When names exactly one action, and if you need "and then they also" you probably have two scenarios. Then must be observable from outside the system. "Then the record is updated correctly" is not observable. "Then the confirmation page shows the new address" is.
Three habits separate useful criteria from decorative ones:
- Cover the unhappy paths. A story with only a happy-path scenario has not been thought through. The empty state, the permission failure and the invalid input are where the real engineering effort lives, so they belong in the criteria.
- Number them. "AC 3 fails on Safari" is a useful bug report. "The acceptance criteria are not met" is a shrug. Numbers also map cleanly onto automated test names.
- Keep them free of implementation. Criteria describe behaviour at the boundary of the system. The moment a scenario names a database table or a component, it will break the first time the implementation changes, and the team will learn to ignore criteria.
If a story arrives without criteria and you want a starting point faster than a blank page, the free acceptance criteria generator drafts numbered Gherkin scenarios from a pasted story, which you then edit in the conversation rather than accept wholesale.
Splitting
Five ways to split a story that is too big
The wrong way to split a story is horizontally, by architectural layer: a backend story, a frontend story, a database story. Each slice is unshippable on its own, nothing is demonstrable until all of them land, and the integration risk you were trying to manage arrives all at once at the end anyway.
Split vertically instead: every slice cuts through the whole stack and delivers something a user could touch. The running example below is one oversized story, "account admins can export the audit log for compliance reviews", split five different ways.
By workflow step
Use when: The story describes a journey with a beginning, middle and end.
How: Ship the thinnest end-to-end path first, then widen each step in later stories.
Export audit log: story 1 exports the last 30 days as CSV from a button. Story 2 adds a date range picker. Story 3 adds scheduled recurring exports.
By business rule
Use when: One capability behaves differently under different policies or conditions.
How: Take the simplest rule first. Each additional rule becomes its own story with its own criteria.
Export audit log: story 1 covers admins exporting their own organisation. Story 2 adds the rule that support staff can export any organisation, with an access log entry.
By data variation
Use when: The same behaviour must handle several formats, types or locales.
How: Pick the variation that covers most users, ship it, then add the rest one at a time.
Export audit log: story 1 exports CSV. Story 2 adds JSON. Story 3 adds the timezone-normalised variant compliance asked for.
By interface
Use when: The capability is wanted in more than one place: web, API, mobile, email.
How: Ship one surface first. The others become follow-on stories that reuse the same backend.
Export audit log: story 1 is the dashboard download. Story 2 exposes the same export through the public API for customers with SIEM tooling.
Spike extraction
Use when: The story is unestimable because a technical unknown sits inside it.
How: Pull the unknown into a timeboxed spike with a question to answer, not a thing to build. Estimate the story once the spike reports back.
Export audit log: nobody knows whether the log table can be queried for a year of data without timeouts. Spike: measure it, recommend pagination or a warehouse export. Two days, answer required.
Rule of thumb for choosing: ask which slice you would ship if the project were cancelled next Friday. That slice is story one. Everything else is negotiable, which is the whole point of splitting.
Boundaries
Story vs requirement, task, epic and job story
Teams waste real time forcing everything into story format or, in the other direction, calling everything a requirement. These artefacts differ in grain, voice and lifespan, and each earns its keep in a different situation.
| Artefact | Grain | Written in the voice of | Lifespan |
|---|---|---|---|
| User story | One user-visible change, days of work | The user ("As a returning customer...") | Dies when it ships. The conversation was the point. |
| Requirement | A binding statement the system must satisfy | The system ("The system shall retain audit records for 7 years") | Lives as long as the obligation does. Versioned, referenced, audited. |
| Task | One unit of work for one person, hours to a day | The team ("Add index on audit_events.org_id") | Dies when done. No user ever sees a task. |
| Epic | A goal spanning many stories, weeks to months | The business ("Self-serve compliance exports") | Lives across sprints as a container and a progress marker. |
| Job story | Same grain as a user story, different framing | The situation ("When an auditor emails me on deadline day...") | Same as a story. Use it when context matters more than persona. |
Story vs requirement. A requirement is a binding statement about what the system must do, written in the system's voice and kept as a record: "the system shall retain audit records for 7 years". It survives after delivery because the obligation survives. A story is disposable by design. Regulated environments usually need both: requirements as the durable contract, stories as the delivery-sized slices that implement them.
Story vs task. A task is a unit of work in the team's voice: add an index, update the config, write the migration. No user ever sees a task. The clean rule is that stories describe changes users can observe and tasks describe work the team must do, sometimes as children of a story and sometimes standalone.
Story vs epic. An epic is a goal too big for a sprint that acts as a container for related stories: "self-serve compliance exports" holds the five audit-log stories from the splitting section. The practical test is time: if it plausibly fits one sprint it is a story, if it obviously spans several it is an epic and needs breaking down before anyone estimates it.
Story vs job story. The job story format, popularised by the jobs-to-be-done community, replaces the persona with a situation: "When an auditor emails me on deadline day, I want to export the full log in one action, so I can respond before end of day." Use it when the trigger matters more than who the person is. It is a different lens on the same grain of work, not a different artefact.
Template
A story template you can copy
A compact shape that carries everything the 3Cs need and nothing else. Paste it into your tracker of choice and delete the angle brackets.
Title: <verb phrase naming the outcome, under 10 words> Story: As a <specific role, never "user">, I want <capability, not solution>, so that <benefit the role would recognise>. Context: <one or two sentences: where this came from, who raised it, the quote or ticket if you have one> Acceptance criteria: 1. Given <precondition>, when <action>, then <observable result>. 2. Given <the unhappy path>, when <action>, then <observable result>. 3. Given <the empty or edge state>, when <action>, then <observable result>. Out of scope: <what this story deliberately does not cover> Notes: <dependencies, flags, open questions for the conversation>
The two lines teams skip are the two that pay for the rest. Context is what lets an engineer answer "who asked for this?" without archaeology. Out of scope is what stops the story quietly reabsorbing everything it was split from.
Anti-patterns
Seven mistakes that ruin otherwise good stories
Writing the persona as "user"
A story for everyone is a story for no one. "As a user" tells the team nothing about context, permissions or motivation, so they guess, and the guess is usually themselves.
Instead: Name the narrowest role that wants this: "as an account admin", "as a first-time buyer on mobile". If two roles want different things, that is two stories.
The circular so-that clause
"I want to filter the list, so that the list is filtered" smuggles a solution through without ever stating a benefit. Nobody can challenge the priority of a story with no stated value.
Instead: The so-that must name something the person could not do before, or a cost they no longer pay. If you cannot finish the clause honestly, question the story.
Specifying the solution in the story
"I want a dropdown with the last five addresses" locks the design before the conversation happens. The team builds the dropdown even when an autofill would have been better.
Instead: State the outcome, not the widget. "I want to reuse a previous delivery address" leaves the mechanism to the people building it.
Acceptance criteria written after development starts
The criteria end up describing what was built rather than what was wanted. Testing confirms the code matches the code.
Instead: Write criteria before the story enters a sprint. They are the definition of the finish line, not the race report.
One story carrying ten scenarios
A story with ten acceptance criteria is several stories in a trench coat. It will not fit a sprint and it cannot fail partially: one broken criterion blocks nine finished ones.
Instead: Around 3 to 5 criteria is a healthy story. Past that, split by business rule or data variation.
Dressing technical work as a fake story
"As a developer, I want to upgrade the framework, so that the framework is upgraded" fools nobody and clutters velocity data. It also teaches stakeholders that stories are theatre.
Instead: Call it a task or an enabler and let it be honest. Not every backlog item needs the story costume.
Losing the source of the story
Three weeks later an engineer asks "who wanted this and why?" and nobody remembers. The story gets built on a guess or thrown away on a guess.
Instead: Record where each story came from: the meeting, the support ticket, the quote. A story that can cite its origin survives scrutiny.
In practice
Where stories actually come from: meetings
Almost no story is born at a keyboard. It is born in a refinement session, a discovery call or a support escalation, as a sentence someone says out loud. The gap between that sentence and a well-formed story in the backlog is where most teams leak requirements: someone scribbles a note, the note loses the context, and three days later a story appears that says half of what was meant.
Everything in this guide is a manual discipline for closing that gap. There is also a tooling answer. Backlog.cloud listens to the meeting, or reads the transcript afterwards, and drafts stories in the shape this guide describes: specific personas, honest so-that clauses, numbered Gherkin criteria, each item anchored to the verbatim quote it came from. The drafts land in a review queue where a human applies exactly the judgement described above, then pushes the survivors to the backlog. The AI user story generator page shows the output shape in detail, and transcript to user stories covers the paste-a-transcript route if no bot was on the call.
The point is not that a machine writes your stories. It is that the raw material, the actual words people said, stops evaporating between the meeting and the backlog. What a production-ready generated story looks like, field by field, is documented on the user stories artefact page.
FAQ
User stories, answered
- Who should write user stories?
- Anyone close to the need can draft one: product managers, business analysts, engineers, support staff. The product owner curates and orders them, but writing is not a licence-holder activity. What matters is that the team discusses each story before building it, because the conversation is where the real specification happens.
- Does the Scrum Guide require user stories?
- No. The Scrum Guide defines the product backlog and its items but never mentions user stories, story points or the As-a format. Stories are a widely adopted practice from Extreme Programming that most Scrum teams use because they work, not because the framework demands them.
- How many acceptance criteria should a story have?
- Around 3 to 5 Gherkin scenarios is the healthy range. One criterion usually means the edge cases have not been thought about. Eight or more usually means the story should be split, most often by business rule or data variation.
- Should bugs be written in user story format?
- No. A bug needs reproduction steps, expected versus actual behaviour, and severity. Forcing "As a user, I want the page not to crash" adds ceremony without information. Keep the story format for new behaviour and give bugs their own shape.
- What is the right size for a user story?
- Small enough that the team would happily take two or three of them into a sprint alongside other work, which for most teams means one to three days of effort. If a single story dominates a sprint, split it using the workflow, business rule, data variation or interface techniques.
- What is the difference between a user story and a use case?
- A use case is a formal document describing every path through an interaction: actors, preconditions, main flow, alternate flows, postconditions. A story is deliberately lighter, a placeholder for a conversation. Use cases suit contractual or safety-critical work. Stories suit iterative product delivery where the team fills detail in as it goes.
- Can AI write user stories from a meeting transcript?
- Yes, if the meeting contained the substance. An extraction engine can turn a refinement discussion into stories with personas, so-that clauses and numbered Gherkin criteria, each anchored to the verbatim quote it came from. What it cannot do is invent context nobody discussed, which is why generated stories should land in a review queue for a human to approve before they reach the backlog.
Keep going
Related workflows and resources
AI user story generator
Turn meetings and transcripts into INVEST stories with Gherkin criteria.
User stories artefact
The exact fields a generated story carries, with examples.
Product backlog guide
Refinement, prioritisation and Definition of Ready, in depth.
Good questions for user stories
The questions that turn a story card into a real conversation.
Backlog refinement meetings
What a refinement session should produce, and how to capture it.
Acceptance criteria generator
Draft numbered Gherkin scenarios from a pasted story, free.
Write the story once, in the meeting where it was born
Backlog.cloud turns refinement sessions and discovery calls into INVEST stories with numbered Gherkin criteria, each anchored to the quote it came from. 3 free generations, no card.