User Story Writing Best Practices | INVEST Criteria
Write effective user stories with INVEST criteria and acceptance conditions. GitScrum supports story points, sprint planning, and user-focused development.
11 min read
User stories are the fundamental unit of work in agile developmentβthey describe what users need in a way that developers can understand and deliver. Well-written stories are Independent, Negotiable, Valuable, Estimable, Small, and Testable (INVEST). GitScrum's task management features support story-driven development with acceptance criteria, story points, and sprint planning that keeps work focused on user value.
User Story Components
| Component | Purpose | Required |
|---|---|---|
| Title | Quick reference | Yes |
| User role | Who benefits | Yes |
| Action | What they want | Yes |
| Benefit | Why it matters | Yes |
| Acceptance Criteria | Definition of done | Yes |
| Notes | Context, details | Optional |
Story Format
USER STORY STRUCTURE
STANDARD FORMAT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β As a [user role] β
β I want [action/feature] β
β So that [benefit/value] β
β β
β Example: β
β As a project manager β
β I want to export sprint reports to PDF β
β So that I can share progress with stakeholders β
β who don't have system access β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
USER ROLES:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Be specific about who: β
β β
β β As a user... β
β β As a project manager... β
β β As a first-time visitor... β
β β As an enterprise admin... β
β β As a developer on the team... β
β β
β Different roles = different needs β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
THE "SO THAT" CLAUSE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Most important part - explains value β
β β
β β "So that I can export reports" β
β (just repeats the action) β
β β
β β "So that I can share progress with β
β stakeholders who don't have access" β
β (explains the real benefit) β
β β
β If you can't explain why, question if needed β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
INVEST Criteria
INVEST CHECKLIST
INDEPENDENT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Can be developed in any order β
β β No dependency on other stories β
β β Can be released independently β
β β
β β "Complete payment after checkout story" β
β β "Process payment for cart" β
β (includes what's needed to work alone) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
NEGOTIABLE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Details can be discussed β
β β Not a fixed specification β
β β Room for technical input β
β β
β β "Build exactly this wireframe" β
β β "Users need to reset password easily" β
β (team can propose solution) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
VALUABLE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Delivers value to user or business β
β β Stakeholder would pay for it β
β β Can explain why it matters β
β β
β β "Refactor auth module" β
β (technical, no user value stated) β
β β "Users can login in under 3 seconds" β
β (value is clear) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
ESTIMABLE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Team can estimate the effort β
β β Enough detail to size β
β β Not too vague β
β β
β β "Improve the dashboard" β
β (too vague to estimate) β
β β "Add export button to dashboard that β
β generates CSV of visible data" β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
SMALL:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Fits in a sprint β
β β Ideally 1-5 days of work β
β β Can be completed by 1-2 people β
β β
β β "Build the entire reporting module" β
β (epic, not a story) β
β β "Generate revenue summary report" β
β (one focused piece) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
TESTABLE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Clear pass/fail criteria β
β β Can verify it works β
β β No subjective measures β
β β
β β "Make the dashboard beautiful" β
β (subjective) β
β β "Dashboard loads in under 2 seconds" β
β (measurable) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Acceptance Criteria
WRITING ACCEPTANCE CRITERIA
GIVEN-WHEN-THEN FORMAT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Given [context/precondition] β
β When [action/trigger] β
β Then [expected outcome] β
β β
β Example: β
β Given I am on the dashboard β
β When I click "Export CSV" β
β Then a CSV file downloads with visible data β
β β
β Given I have no data for the date range β
β When I click "Export CSV" β
β Then I see "No data to export" message β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
CHECKLIST FORMAT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Acceptance Criteria: β
β β Export button visible on dashboard β
β β CSV includes all visible columns β
β β Filename includes current date β
β β Large exports (>10K rows) show progress β
β β Empty state shows helpful message β
β β Works in Chrome, Firefox, Safari β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
HOW MANY CRITERIA:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3-8 criteria is typical β
β β
β Too few (1-2): May miss important cases β
β Too many (10+): Story probably too big β
β β
β Focus on: β
β βββ Main success path β
β βββ Key error cases β
β βββ Edge cases that matter β
β βββ Non-functional requirements β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Story Types
DIFFERENT STORY TYPES
FEATURE STORY:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β As a project manager β
β I want to set task dependencies β
β So that my team knows what to work on next β
β β
β Acceptance Criteria: β
β β Can link task A as dependency of task B β
β β Dependent tasks show warning if blocked β
β β Can remove dependencies β
β β Circular dependencies are prevented β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
BUG-FIX STORY:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β As a user β
β I want the login to work on Safari β
β So that I can access my account from any β
β browser β
β β
β Current behavior: Login fails silently β
β Expected behavior: Login works like Chrome β
β β
β Acceptance Criteria: β
β β Login works in Safari 15+ β
β β Error messages display correctly β
β β Session persists correctly β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
TECHNICAL STORY:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β As a developer β
β I want automated tests for the payment module β
β So that we can refactor with confidence β
β β
β Note: Still has value statement β
β Note: Benefits developers as users β
β β
β Acceptance Criteria: β
β β 80% test coverage for payment service β
β β Tests run in under 60 seconds β
β β All edge cases documented β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
SPIKE (RESEARCH):
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Spike: Evaluate GraphQL for API β
β β
β Questions to answer: β
β βββ Does it meet our performance requirements? β
β βββ What's the learning curve for team? β
β βββ How does it integrate with auth? β
β βββ Estimated effort to migrate? β
β β
β Time-box: 3 days β
β Output: Decision document β
β β
β Note: Spikes are time-boxed research, β
β not deliverables β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Splitting Stories
BREAKING DOWN LARGE STORIES
WHEN TO SPLIT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Story is too big when: β
β βββ Can't complete in one sprint β
β βββ Estimate is "large" or "XL" β
β βββ Has many acceptance criteria β
β βββ Feels uncertain or vague β
β βββ Multiple user roles involved β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
SPLITTING PATTERNS:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β By workflow steps: β
β βββ Story 1: User can upload file β
β βββ Story 2: User can preview file β
β βββ Story 3: User can download processed file β
β β
β By user role: β
β βββ Story 1: Admin can manage users β
β βββ Story 2: User can update their profile β
β β
β By data variation: β
β βββ Story 1: Export to CSV β
β βββ Story 2: Export to PDF β
β β
β By complexity: β
β βββ Story 1: Basic search (text match) β
β βββ Story 2: Advanced search (filters, sort) β
β β
β By happy path vs edge cases: β
β βββ Story 1: Login with valid credentials β
β βββ Story 2: Handle login failures gracefully β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
SPLIT EXAMPLE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Original (too big): β
β "User can manage their profile" β
β β
β Split into: β
β βββ User can view their profile β
β βββ User can update name and email β
β βββ User can change password β
β βββ User can upload profile picture β
β βββ User can delete their account β
β β
β Each is now independent and small β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Common Mistakes
USER STORY ANTI-PATTERNS
TECHNICAL IMPLEMENTATION:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β "Create REST endpoint for user data" β
β β "Add React component for form" β
β β "Implement caching layer" β
β β
β These are tasks, not stories β
β Stories describe user value β
β β
β β "User can update their profile quickly" β
β (caching is implementation detail) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
SOLUTION IN STORY:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β "As a user, I want a dropdown menu with β
β exactly these options: A, B, C" β
β β
β Prescribes solution instead of problem β
β β
β β "As a user, I want to filter projects by β
β status so I can focus on active work" β
β (team decides dropdown vs tabs vs filters) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
MISSING VALUE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β "As a user, I want dark mode" β
β (no "so that" - why does it matter?) β
β β
β β "As a user working at night, I want dark β
β mode so that I can use the app without β
β eye strain" β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
TOO VAGUE:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β "As a user, I want the app to be fast" β
β (not estimable or testable) β
β β
β β "As a user, I want the dashboard to load β
β in under 2 seconds so I can start work β
β immediately" β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
TOO BIG (EPIC):
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β "As a user, I want a complete reporting β
β system" β
β (months of work) β
β β
β Break into: β
β βββ View basic report β
β βββ Filter report by date β
β βββ Export report to CSV β
β βββ Schedule automated reports β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Refinement Process
STORY REFINEMENT
BEFORE REFINEMENT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β PO prepares: β
β βββ Draft user story β
β βββ Initial acceptance criteria β
β βββ Context and background β
β βββ Questions that need team input β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
DURING REFINEMENT:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Team discusses: β
β βββ Clarifying questions β
β βββ Edge cases and error handling β
β βββ Technical considerations β
β βββ Splitting if too big β
β βββ Initial estimation β
β β
β Outcome: β
β βββ Story is clear and understood β
β βββ Acceptance criteria finalized β
β βββ Story is estimated β
β βββ Ready for sprint planning β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
DEFINITION OF READY:
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Story is ready for sprint when: β
β β User value is clear β
β β Acceptance criteria defined β
β β Team understands scope β
β β Story is estimated β
β β Dependencies identified β
β β Small enough for sprint β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Best Practices
Anti-Patterns
β Technical tasks as stories
β No user value stated
β Solution baked into story
β Too big to estimate
β Vague acceptance criteria
β Skipping refinement