Actionable User Stories | INVEST Criteria Guide
Write user stories developers can immediately implement using INVEST criteria and acceptance criteria templates. GitScrum bridges requirements and working software.
16 min read
A well-written user story is the difference between a developer asking clarifying questions for days and immediately starting productive work. This guide covers the complete framework for creating user stories that are truly actionableβclear enough to code from, small enough to complete in a sprint, and valuable enough to matter to users.
The Anatomy of Actionable Stories
What makes a story actionable:
| Element | Purpose | Example |
|---|---|---|
| User role | Who benefits | "As a project manager..." |
| Action | What they want to do | "...I want to export reports..." |
| Benefit | Why it matters | "...so I can share progress with stakeholders" |
| Acceptance criteria | Definition of done | Given/When/Then statements |
| Size | Sprint-completable | 1-8 story points typically |
The User Story Format
Standard Template
USER STORY STRUCTURE:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TITLE: [Verb] + [Object] + [Context] β
β Example: "Export Sprint Report to PDF" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β USER STORY: β
β As a [type of user], β
β I want to [perform action], β
β So that [achieve benefit]. β
β β
β EXAMPLE: β
β As a project manager, β
β I want to export my sprint report as a PDF, β
β So that I can share progress with stakeholders β
β who don't have GitScrum access. β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ACCEPTANCE CRITERIA: β
β β
β β Given I am on the Sprint Report page β
β When I click "Export to PDF" β
β Then a PDF downloads with all visible report data β
β β
β β Given the report has charts β
β When I export to PDF β
β Then charts render correctly in the PDF β
β β
β β Given the sprint has 100+ tasks β
β When I export to PDF β
β Then export completes within 30 seconds β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β TECHNICAL NOTES (optional): β
β - Use existing report data endpoint β
β - PDF library: jsPDF or similar β
β - Include company logo from settings β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β DEPENDENCIES: β
β - Requires: Sprint Report UI (completed) β
β - Blocked by: None β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ESTIMATE: 5 story points β
β PRIORITY: Medium β
β LABELS: Feature, Reports, Sprint-24 β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The INVEST Criteria
Evaluating Story Quality
INVEST CHECKLIST:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β I - INDEPENDENT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Can be developed without depending on other stories β
β β
β β BAD: "As a user, I want the login button to work" β
β (depends on auth system, session management, etc.) β
β β
β β
GOOD: "As a user, I want to log in with email/password" β
β (complete feature, self-contained) β
β β
β TEST: Can this story be developed and deployed alone? β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β N - NEGOTIABLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Details can be discussed and refined with the team β
β β
β β BAD: "Implement login exactly as shown in wireframe v2.3"β
β (too prescriptive, no room for improvement) β
β β
β β
GOOD: "Users need secure, quick access to their account" β
β (outcome-focused, implementation negotiable) β
β β
β TEST: Could a developer suggest a better approach? β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β V - VALUABLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Delivers value to user or business (not just technical) β
β β
β β BAD: "Refactor database connection pool" β
β (technical task, no user value stated) β
β β
β β
GOOD: "Improve page load time from 3s to under 1s" β
β (user experiences faster loading) β
β β
β TEST: Would a user/stakeholder care about this? β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β E - ESTIMABLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Team can estimate effort with reasonable confidence β
β β
β β BAD: "Integrate with third-party analytics" β
β (too vague - which provider? what data?) β
β β
β β
GOOD: "Send page view events to Google Analytics 4" β
β (specific, known scope) β
β β
β TEST: Can the team agree on story points within 5 min? β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β S - SMALL β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Completable within a single sprint (ideally 1-3 days work) β
β β
β β BAD: "As a user, I want a complete dashboard" β
β (too large - weeks of work) β
β β
β β
GOOD: "As a user, I want to see my task count widget" β
β (one component, few days) β
β β
β TEST: Can one developer complete this in 3 days or less? β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T - TESTABLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Clear criteria for determining when story is done β
β β
β β BAD: "Make the UI more intuitive" β
β (subjective, no clear pass/fail) β
β β
β β
GOOD: "User can complete checkout in 3 clicks or less" β
β (measurable, verifiable) β
β β
β TEST: Can you write an acceptance test for this? β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Writing Acceptance Criteria
Given-When-Then Format
ACCEPTANCE CRITERIA TEMPLATE:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STRUCTURE: β
β β
β Given [precondition/context] β
β When [action is performed] β
β Then [expected result] β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β EXAMPLE STORY: Password Reset β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β HAPPY PATH: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Given I am on the login page ββ
β β When I click "Forgot password" ββ
β β Then I see a form to enter my email ββ
β β ββ
β β Given I have entered my registered email ββ
β β When I click "Send reset link" ββ
β β Then I see confirmation message ββ
β β And I receive email with reset link within 2 minutes ββ
β β ββ
β β Given I clicked the reset link in email ββ
β β When I enter new password meeting requirements ββ
β β Then my password is updated ββ
β β And I can log in with new password ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ERROR CASES: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Given I enter an unregistered email ββ
β β When I click "Send reset link" ββ
β β Then I see same confirmation (security - no email leak) ββ
β β ββ
β β Given I have a reset link older than 24 hours ββ
β β When I click the link ββ
β β Then I see "Link expired" message ββ
β β And I can request a new link ββ
β β ββ
β β Given I enter password not meeting requirements ββ
β β When I try to submit ββ
β β Then I see specific requirement that failed ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β EDGE CASES: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Given I request password reset twice ββ
β β When I use the first link ββ
β β Then only the second (latest) link works ββ
β β ββ
β β Given I am already logged in ββ
β β When I access reset password page ββ
β β Then I am redirected to change password (not reset) ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Criteria Completeness Checklist
ACCEPTANCE CRITERIA COVERAGE:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VERIFY ALL SCENARIOS ARE COVERED: β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β HAPPY PATH β
β Main use case works as expected β
β β
β β ERROR HANDLING β
β What happens when things go wrong β
β - Invalid input β
β - Network failure β
β - Server error β
β β
β β EDGE CASES β
β Boundary conditions β
β - Empty states β
β - Maximum limits β
β - Concurrent actions β
β β
β β PERMISSIONS β
β Who can/cannot do this β
β - Admin vs. regular user β
β - Owner vs. team member β
β - Logged in vs. anonymous β
β β
β β PERFORMANCE β
β Response time expectations β
β - Page load time β
β - API response time β
β - Batch operation limits β
β β
β β ACCESSIBILITY β
β Inclusive design requirements β
β - Keyboard navigation β
β - Screen reader support β
β - Color contrast β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Story Splitting Techniques
Vertical Slicing
SPLITTING LARGE STORIES:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BEFORE: Epic-sized story (too big) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β "As a user, I want to manage my profile settings" β
β Estimate: 40 points (way too big!) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β AFTER: Vertical slices (right-sized) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Story 1: View Profile (3 pts) β
β "As a user, I want to view my current profile info" β
β β
β Story 2: Edit Name (2 pts) β
β "As a user, I want to change my display name" β
β β
β Story 3: Upload Avatar (5 pts) β
β "As a user, I want to upload a profile picture" β
β β
β Story 4: Change Email (5 pts) β
β "As a user, I want to change my email with verification" β
β β
β Story 5: Change Password (3 pts) β
β "As a user, I want to change my password" β
β β
β Story 6: Notification Preferences (3 pts) β
β "As a user, I want to control email notifications" β
β β
β Story 7: Delete Account (5 pts) β
β "As a user, I want to delete my account permanently" β
β β
β TOTAL: 26 points across 7 stories β
β Each story: Independently deployable, testable, valuable β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Splitting Strategies
STORY SPLITTING PATTERNS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. BY WORKFLOW STEPS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Original: "User checkout process" β
β Split: β
β βββ Add items to cart β
β βββ Enter shipping address β
β βββ Select shipping method β
β βββ Enter payment info β
β βββ Review and confirm β
β βββ Order confirmation email β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 2. BY OPERATIONS (CRUD) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Original: "Manage projects" β
β Split: β
β βββ View list of projects β
β βββ Create new project β
β βββ Edit project details β
β βββ Archive project β
β βββ Delete project β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 3. BY DATA TYPES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Original: "Import data from file" β
β Split: β
β βββ Import CSV format β
β βββ Import Excel format β
β βββ Import JSON format β
β βββ Import from Google Sheets β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 4. BY USER TYPES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Original: "Dashboard for all users" β
β Split: β
β βββ Admin dashboard (all data) β
β βββ Manager dashboard (team data) β
β βββ Developer dashboard (my work) β
β βββ Guest dashboard (public data) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 5. BY HAPPY PATH vs. EDGE CASES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Original: "Upload file with validation" β
β Split: β
β βββ Upload valid file (happy path) β
β βββ Handle file too large β
β βββ Handle invalid file type β
β βββ Handle upload interruption/retry β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 6. BY PLATFORM/DEVICE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Original: "Responsive photo gallery" β
β Split: β
β βββ Desktop layout β
β βββ Tablet layout β
β βββ Mobile layout β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
User Personas in Stories
Defining User Types
USER PERSONA EXAMPLES:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GITSCRUM USER TYPES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β AGENCY OWNER (Admin) β
β βββ Full access to all projects β
β βββ Billing and subscription management β
β βββ User management β
β βββ Company-wide reports β
β β
β PROJECT MANAGER β
β βββ Create and manage projects β
β βββ Sprint planning and tracking β
β βββ Team assignment β
β βββ Client communication β
β β
β DEVELOPER β
β βββ View assigned tasks β
β βββ Update task status β
β βββ Track time β
β βββ Participate in discussions β
β β
β CLIENT (External) β
β βββ View project progress β
β βββ Submit feedback via Form2Task β
β βββ Approve deliverables β
β βββ Limited visibility (ClientFlow) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β USING PERSONAS IN STORIES: β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β VAGUE: "As a user, I want to see reports" β
β β
β β
SPECIFIC: β
β "As an agency owner, I want to see revenue by project..." β
β "As a project manager, I want to see sprint burndown..." β
β "As a developer, I want to see my time logged this week..." β
β "As a client, I want to see my project's progress..." β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Common Anti-Patterns
Stories to Avoid
USER STORY ANTI-PATTERNS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β TECHNICAL TASK DISGUISED AS STORY β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BAD: "As a developer, I want to refactor the auth module" β
β β
β PROBLEM: Developer isn't the end user, no user value β
β β
β BETTER: Break into valuable stories OR make it a task: β
β - Story: "As a user, I want login to be faster (<2s)" β
β - Task: "Refactor auth module (enables login speed story)" β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β SOLUTION-FOCUSED (Not problem-focused) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BAD: "As a user, I want a dropdown menu for categories" β
β β
β PROBLEM: Prescribes specific implementation β
β β
β BETTER: "As a user, I want to quickly filter by category β
β so I can find relevant items faster" β
β (Team can propose dropdown, tags, search, etc.) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β EPIC DISGUISED AS STORY β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BAD: "As a user, I want a complete project management tool" β
β β
β PROBLEM: Months of work, impossible to estimate β
β β
β BETTER: Break into specific, valuable features β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β MISSING "SO THAT" (No value statement) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BAD: "As a user, I want to export data" β
β β
β PROBLEM: Why? What problem does this solve? β
β β
β BETTER: "As a project manager, I want to export data β
β so that I can create custom reports in Excel" β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β VAGUE ACCEPTANCE CRITERIA β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BAD: "Works correctly", "Fast", "User-friendly" β
β β
β PROBLEM: Not testable, subjective β
β β
β BETTER: Specific, measurable criteria β
β - "Returns results in < 500ms" β
β - "Form submits without page reload" β
β - "Accessible with keyboard only" β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GitScrum Task Creation
Story to Task Mapping
CREATING STORIES IN GITSCRUM:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TASK FIELDS MAPPING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β TITLE: β
β Format: [Action] [Object] [Context] β
β Example: "Export Sprint Report to PDF" β
β β
β DESCRIPTION: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ## User Story ββ
β β As a **project manager**, I want to **export sprint ββ
β β reports as PDF** so that I can **share progress with ββ
β β stakeholders who don't have GitScrum access**. ββ
β β ββ
β β ## Acceptance Criteria ββ
β β - [ ] Export button visible on Sprint Report page ββ
β β - [ ] PDF includes all visible charts and tables ββ
β β - [ ] Export completes within 30 seconds for 100+ tasks ββ
β β - [ ] PDF is downloadable and shareable ββ
β β ββ
β β ## Technical Notes ββ
β β - Use existing report data endpoint ββ
β β - Consider jsPDF library ββ
β β - Include company logo from project settings ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β STORY POINTS: 5 β
β PRIORITY: Medium β
β LABELS: Feature, Reports, Sprint-24 β
β ASSIGNEE: Set during sprint planning β
β DUE DATE: End of sprint β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Story Refinement Process
Pre-Planning Checklist
DEFINITION OF READY:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BEFORE A STORY ENTERS SPRINT PLANNING: β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β USER STORY COMPLETE β
β - Clear user role identified β
β - Action described (what user wants to do) β
β - Value stated (why it matters) β
β β
β β ACCEPTANCE CRITERIA DEFINED β
β - Happy path covered β
β - Error cases identified β
β - Edge cases considered β
β β
β β SIZED APPROPRIATELY β
β - Team has estimated (story points) β
β - Fits within single sprint β
β - No unknown dependencies β
β β
β β DEPENDENCIES CLEARED β
β - No blocking work from other teams β
β - Required APIs/services available β
β - Design/UX assets ready β
β β
β β QUESTIONS ANSWERED β
β - Product owner clarified requirements β
β - Technical spikes completed if needed β
β - No open questions blocking start β
β β
β IF ANY β IS UNCHECKED: β
β β Story goes to backlog refinement, not sprint β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ