Why this matters
Clear user stories align stakeholders, guide developers, and define when work is done. As a Business Analyst, you will use user stories to: capture requirements during discovery, prioritize backlog items, facilitate refinement with dev/design/QA, and agree on acceptance criteria that make testing objective.
- Reduce rework by stating value and boundaries upfront.
- Enable test planning through concrete acceptance criteria.
- Support incremental delivery with right-sized stories.
Concept explained simply
A user story is a short statement of a user’s need and the value it delivers. The classic format is:
As a [user/role], I want [capability], so that [benefit/value].
Acceptance criteria (AC) define how we’ll verify the story is done. They describe rules and scenarios, often using Given–When–Then.
Mental model: Story = Who + What + Why; AC = Proof
- Who: the role getting value (not a system component).
- What: the capability, not the implementation.
- Why: the outcome or business value.
- Proof: AC make value verifiable and set scope boundaries.
INVEST checklist (open to review)
- Independent: can be delivered without major dependencies.
- Negotiable: not a contract for features; details can evolve.
- Valuable: delivers value to the user or business.
- Estimable: team can size it reasonably.
- Small: can be done within a sprint/iteration.
- Testable: clear AC allow objective verification.
Patterns you’ll use
Story templates
- Standard: As a [role], I want [capability], so that [benefit].
- Job story (optional): When [situation], I want to [motivation], so I can [outcome].
Acceptance criteria styles
- Rules: bullet points for business rules and constraints.
- Scenarios (Given–When–Then): concrete flows that cover happy paths and edge cases.
- Non-functional: performance, security, accessibility stated in measurable terms.
When to add non-functional criteria
- Performance matters (e.g., response time, data size, concurrency).
- Security/compliance is required (e.g., MFA, audit trail).
- Accessibility targets (e.g., WCAG criteria) affect acceptance.
Worked examples
1) Export filtered report to CSV
Story: As a data analyst, I want to export the currently filtered report to CSV, so that I can analyze it in a spreadsheet.
Acceptance criteria (scenarios)
- Given a report with active filters, When I click Export CSV, Then the file contains only the filtered rows and selected columns.
- Given data with commas and quotes, When exported, Then values are properly escaped per CSV standard.
- Given a large dataset (up to 200k rows), When exported, Then the export completes within 60 seconds.
- Given I have no export permission, When I open the report, Then the Export CSV action is hidden.
Notes
Non-functional performance is explicit; permissions define scope.
2) Save item to wishlist
Story: As a shopper, I want to save items to a wishlist, so that I can buy them later.
Acceptance criteria
- Given I am logged in, When I click Save to wishlist, Then the item appears in my wishlist.
- Given the item is already in my wishlist, When I click Save to wishlist, Then I see a message that it’s already saved (no duplicates).
- Given I remove an item, When I view my wishlist, Then it no longer appears.
- Given I log in from another device, When I open wishlist, Then my saved items are present (server-side persistence).
3) Reset password
Story: As an account holder, I want to reset my password via email, so that I can regain access if I forget it.
Acceptance criteria
- Given I enter a registered email, When I request reset, Then I receive a reset link that expires in 30 minutes.
- Given the link is expired or used, When I click it, Then I see an error and can request a new link.
- Given I set a new password meeting policy (12+ chars, 1 number, 1 symbol), When I submit, Then I can sign in with the new password and not with the old one.
4) Save dashboard filter preset
Story: As a marketing analyst, I want to save dashboard filter presets, so that I can quickly reuse common views.
Acceptance criteria
- Given current filters, When I save as a preset with a unique name, Then it appears in my presets list.
- Given I select a preset, When applied, Then filters update to exactly the saved values.
- Given I attempt to save a duplicate name, When I confirm, Then I’m prompted to choose a different name.
- Given up to 20 presets limit, When I try to save the 21st, Then I see a clear message about the limit.
How to write a clear user story (step-by-step)
- Identify the real user (role, not a system). Who benefits?
- State the capability without dictating UI or technical solution.
- Write the value (so that …) as a concrete outcome.
- Draft acceptance criteria: rules and Given–When–Then scenarios (happy + edge cases).
- Add non-functional criteria if they affect acceptance (performance, security, accessibility).
- Apply INVEST and slice if too big (separate roles, workflows, or benefits).
- Review with the team to confirm feasibility and testability.
Mini template pack
- Primary: As a [role], I want [capability], so that [benefit].
- Constraint: Must [rule/limit] (e.g., up to N items; only for role X).
- Non-functional: [Metric] under [conditions] (e.g., <2s at 100 users).
- AC (GWT): Given [context], When [action], Then [observable outcome].
Exercises
Try these, then compare with the sample solutions.
Exercise 1 — Rewrite a vague request
Vague request: “Add export.”
Write a clear user story and 4–6 acceptance criteria that cover filtering, formatting, permissions, and large datasets.
Hints
- Pick a real role (e.g., data analyst, report viewer).
- State the value (why they need it).
- Include CSV formatting and permission rules.
- Add one non-functional criterion (time/size limits).
Exercise 2 — Add acceptance criteria
Given the story: “As a shopper, I want to save items to a wishlist, so that I can buy them later.” Write 6–8 AC covering: duplicates, removal, login requirement, device sync, limit, and empty states.
Hints
- Cover both happy path and edge cases.
- Spell out what happens when the user is not logged in.
- Consider a limit (e.g., 100 items) and messages.
Common mistakes
- Solution-first stories: “Add a blue button on the right.” Fix: focus on capability and value.
- Vague benefits: “so that it’s better.” Fix: name a measurable or observable outcome.
- No edge cases: Only happy path AC. Fix: add negative and boundary scenarios.
- Mixing tasks with AC: AC should be outcomes, not implementation steps.
- Oversized stories: Multiple roles/goals. Fix: split by role, workflow, or benefit.
- Missing non-functional needs: Performance/security omitted. Fix: add measurable criteria when relevant.
Self-check checklist
Who this is for
- Aspiring and practicing Business Analysts
- Product Owners and UX researchers writing requirements
- QA and Developers aligning on “done” criteria
Prerequisites
- Basic understanding of Agile/Scrum ceremonies
- Familiarity with product backlogs and sprint flow
Learning path
- Learn the story formula and INVEST.
- Practice writing AC with Given–When–Then.
- Add non-functional criteria when relevant.
- Split oversized stories; refine with the team.
- Validate with users/stakeholders and iterate.
Practical projects
- Draft a 10-item backlog for a simple e-commerce wishlist feature (stories + AC).
- Take an existing feature request from your workplace and convert it into 2–3 small user stories with measurable AC.
- Create a “story review” checklist and apply it to three of your stories.
Take the quick test
This quick test is available to everyone. Only logged-in users get saved progress.
How to use the results
Score 70% or higher to move on. If you don’t pass, revisit the exercises and common mistakes, then retry.
Next steps
- Practice splitting complex requests into smaller, value-focused stories.
- Deepen your acceptance criteria skills with more scenario coverage.
- Bring your stories to a refinement session and gather feedback from dev and QA.
Mini challenge
Pick any bug report or support ticket. Rewrite it as a user story with 5 acceptance criteria: 2 happy path, 2 edge cases, 1 non-functional. Use the self-check checklist to validate your result.