Beginner Product 7 min read

How to Write Good User Stories

Learn how to write clear, actionable user stories using the As a / I want / So that format, with acceptance criteria and real examples for product teams.

Published March 10, 2026

Why User Stories Matter

User stories are the primary unit of work in agile product development. A well-written user story answers three questions simultaneously: who needs this, what do they want to do, and why does it matter. When a story answers all three, engineers build the right thing, designers make the right tradeoffs, and QA knows exactly what to test.

A poorly written story - too vague, too large, solution-framed instead of problem-framed - is one of the leading causes of wasted engineering time. This guide walks through the six steps to writing user stories that actually work.

Step 1: Identify the User Persona

The most common mistake in user story writing is using the word “user” as if it means something. It does not. “User” could be a first-time visitor, a power user of 3 years, a system administrator, or an API consumer. Each has different needs and different contexts.

Replace “user” with a specific persona:

  • “marketing manager at a 10-person startup”
  • “developer integrating via API”
  • “customer support rep handling a refund request”

The more specific the persona, the easier it is for the whole team to make product decisions while building. Ask: who exactly is encountering this problem? Use your customer development data, not assumptions.

Step 2: Frame the Job to Be Done

Once you have a persona, write the story in the standard format:

As a [persona], I want to [action] so that [outcome].

The action describes what the user is trying to accomplish. The outcome - the “so that” clause - describes why, and it is the most important part of the sentence. Without the outcome, engineers cannot make sensible tradeoffs when constraints arise.

Bad vs. Good User Stories

Bad StoryWhy It Fails
”As a user, I want a dashboard.”’User’ is undefined; ‘dashboard’ is a solution, not a job to be done; no outcome stated.
”As a user, I want to see my data.”No persona, no specific action, no outcome. Could mean anything.
”As an admin, I want to export everything.”Solution-framed. What problem are they solving by exporting?
Good StoryWhy It Works
”As a finance manager, I want to export invoice data to CSV so that I can reconcile payments in our accounting software.”Specific persona, specific action, clear outcome that explains the why.
”As a new user in their first session, I want to connect my calendar so that I can see upcoming tasks without switching tabs.”Context-aware persona, action tied to a real job, outcome clarifies the integration value.

Step 3: Write the Acceptance Criteria

Acceptance criteria define what “done” means. The standard format is Given / When / Then:

  • Given [a specific starting condition or state]
  • When [the user takes a specific action]
  • Then [a specific, observable result occurs]

Example for the CSV export story:

  • Given the finance manager is on the Invoices page and has at least one invoice

  • When they click “Export to CSV”

  • Then a CSV file downloads containing all visible invoices with columns for ID, date, amount, and status

  • Given the finance manager has applied a date filter

  • When they click “Export to CSV”

  • Then only invoices within the filtered date range are included in the export

Write at least two criteria per story: one for the happy path and one for the main error state. Stories without acceptance criteria are requests, not requirements.

Step 4: Size the Story

Size stories using your team’s system - story points (Fibonacci: 1, 2, 3, 5, 8, 13) or T-shirt sizes (S, M, L, XL). The goal is not precision; it is identifying stories that are too big to complete in a sprint.

If a story is estimated above 8 points or L/XL, split it. Good ways to split:

  • By user scenario (happy path first, error states as follow-on stories)
  • By data type (export invoices before adding export for expenses)
  • By workflow step (create before edit before delete)

Never split a story into “front end” and “back end” - a back-end-only story delivers no user value and cannot be demonstrated in a sprint review.

Step 5: Add Edge Cases and Error States

Walk through the story with a “what could go wrong” lens before it enters the sprint. Common edge cases to consider:

  • What if the required data does not exist (empty state)?
  • What if the user has insufficient permissions?
  • What if the action takes longer than expected (loading states)?
  • What if the network fails mid-action?

Document each edge case as an additional acceptance criterion. A five-minute edge case review before development starts is far cheaper than a bug report after launch.

Step 6: Review With the Engineer Before Sprint Planning

Before a story enters the sprint, share it directly with the engineer who will build it. Ask:

  1. Do the acceptance criteria reflect how the system actually works?
  2. Is there anything technically ambiguous that needs clarification?
  3. Is the story the right size, or should it be split?

This conversation typically takes five minutes and eliminates the most common source of mid-sprint scope changes. Engineers who participate in story refinement build faster and ask fewer questions during implementation.

Definition of Done

A user story is complete when:

  • All acceptance criteria pass (verified by QA or the PM)
  • Edge cases documented in the story are handled
  • The feature is deployed to the correct environment
  • No new bugs were introduced (guardrail: automated tests pass)

“Done” does not mean “code merged.” It means the story is releasable to end users.

Key Takeaway

Good user stories are not a writing exercise - they are a communication tool. A well-written story gives engineers enough context to make good decisions independently, gives QA a clear testing checklist, and gives the PM a verifiable definition of done. The six steps in this guide - specific persona, jobs-to-be-done format, acceptance criteria, right sizing, edge cases, and engineer review - take less than 20 minutes per story and eliminate the most expensive category of product waste: building the wrong thing.

Frequently Asked Questions

What is a user story in product management?
A user story is a short, plain-language description of a feature or requirement written from the perspective of the end user. The standard format is: 'As a [persona], I want to [action] so that [outcome].' User stories replace lengthy requirements documents with concise, conversation-starting descriptions that keep development teams focused on user value rather than technical specifications.
What is the difference between a user story and an epic?
An epic is a large body of work that cannot be completed in a single sprint and must be broken into smaller user stories. For example, 'Users can manage their account settings' is an epic. Individual user stories within it might be 'change email address,' 'reset password,' and 'delete account.' Epics exist for planning and roadmap purposes; user stories are the units of work that actually enter a sprint.
What are acceptance criteria and why are they required?
Acceptance criteria are the specific, testable conditions that must be true for a story to be considered complete. They eliminate ambiguity about what 'done' means for engineers, QA, and the product manager. A story without acceptance criteria is a request, not a requirement - it will be interpreted differently by everyone on the team and almost always results in rework. Every user story must have at least two acceptance criteria: one for the happy path and one for the main failure case.
What makes a user story too big to implement?
A user story is too big if it cannot realistically be designed, built, and tested within a single sprint. Common signs of an oversized story include multiple 'and' clauses in the action ('I want to create, edit, and delete my profile'), acceptance criteria that span more than one screen or system, or an estimate higher than 8 story points. Split large stories by user scenario, data type, or step in the workflow - never by front end and back end, as that creates stories with no independently shippable value.

Share with your team

Create an account to track your progress across all lessons.

Comments

Log in to join the conversation.

Loading comments...