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.