Writing Effective User Stories | INVEST Criteria Guide
Master user stories with INVEST criteria and Given-When-Then acceptance criteria. Learn story splitting techniques. GitScrum tracks stories in sprints.
9 min read
User stories are not requirements documentsβthey're placeholders for conversations. A good user story captures who needs what and why, is small enough to complete in a sprint, and invites discussion about the details. This guide covers writing stories that actually help teams build the right thing.
Story Elements
| Element | Purpose | Example |
|---|---|---|
| User Role | Who benefits | "As a customer..." |
| Goal | What they want | "...I want to save my cart..." |
| Benefit | Why it matters | "...so I can return later" |
| Criteria | Definition of done | "Cart persists for 30 days" |
Story Format
The Classic Template
USER STORY TEMPLATE
βββββββββββββββββββ
FORMAT:
βββββββββββββββββββββββββββββββββββββ
As a [user type]
I want [goal/desire]
So that [benefit/value]
Acceptance Criteria:
βββ Given [context], when [action], then [outcome]
βββ Given [context], when [action], then [outcome]
βββ ...
EXAMPLE:
βββββββββββββββββββββββββββββββββββββ
As a frequent shopper
I want to save items to my wishlist
So that I can easily find them later for purchase
Acceptance Criteria:
βββ Given I'm on a product page
β When I click "Add to Wishlist"
β Then the item appears in my wishlist
β
βββ Given I'm viewing my wishlist
β When I click "Add to Cart" on an item
β Then the item moves to my cart
β
βββ Given I have items in my wishlist
β When I return next week
β Then my wishlist items are still there
β
βββ Given an item becomes unavailable
When I view my wishlist
Then I see "Out of stock" on that item
COMPONENTS EXPLAINED:
βββββββββββββββββββββββββββββββββββββ
USER TYPE:
βββ Who is this for?
βββ Be specific: "New user" vs "Admin" vs "Premium subscriber"
βββ Persona if you have them
βββ Helps prioritize and design
GOAL:
βββ What do they want to do?
βββ Functional capability
βββ Not HOW, just WHAT
βββ User language, not technical
BENEFIT:
βββ Why does this matter?
βββ The real motivation
βββ Helps understand trade-offs
βββ Sometimes reveals better solutions
INVEST Criteria
Story Quality Check
INVEST CRITERIA
βββββββββββββββ
I - INDEPENDENT
βββββββββββββββββββββββββββββββββββββ
Stories should be completable on their own.
Not: "User can pay (requires cart story)"
Yes: Each story deliverable independently
If dependencies exist, note them but minimize.
N - NEGOTIABLE
βββββββββββββββββββββββββββββββββββββ
Stories are conversation starters, not contracts.
Details emerge through discussion.
Don't over-specify upfront.
Room for team input on implementation.
V - VALUABLE
βββββββββββββββββββββββββββββββββββββ
Each story delivers value to someone.
Not: "Install database" (no user value directly)
Yes: "User can save preferences" (value)
Technical work can be stories, but link to value.
E - ESTIMABLE
βββββββββββββββββββββββββββββββββββββ
Team can estimate the effort.
If not estimable:
βββ Too vague β Need more detail
βββ Too big β Need to split
βββ Too new β Need spike/research
βββ Team must understand scope
S - SMALL
βββββββββββββββββββββββββββββββββββββ
Completable in a sprint, ideally 1-5 days.
If larger: Split into multiple stories.
Smaller stories = faster feedback.
T - TESTABLE
βββββββββββββββββββββββββββββββββββββ
Clear acceptance criteria.
You can verify it works.
Not: "Fast performance" (vague)
Yes: "Page loads in under 2 seconds" (testable)
Acceptance Criteria
Writing Good Criteria
ACCEPTANCE CRITERIA
βββββββββββββββββββ
PURPOSE:
βββββββββββββββββββββββββββββββββββββ
βββ Define "done" for the story
βββ Enable testing
βββ Clarify requirements
βββ Prevent scope creep
βββ Agreement between team and PO
FORMAT (Given-When-Then):
βββββββββββββββββββββββββββββββββββββ
Given [precondition/context]
When [action/trigger]
Then [expected outcome]
EXAMPLE STORY:
βββββββββββββββββββββββββββββββββββββ
As a user
I want to reset my password
So that I can regain access to my account
Acceptance Criteria:
β Given I'm on the login page
When I click "Forgot Password"
Then I see a form requesting my email
β Given I enter a registered email
When I submit the form
Then I receive a password reset email within 5 min
β Given I click the reset link in email
When the link is less than 24 hours old
Then I see a form to enter new password
β Given I click the reset link in email
When the link is more than 24 hours old
Then I see "Link expired" with option to request new
β Given I enter a new valid password
When I submit
Then my password is changed and I can log in
β Given I enter invalid password (too short)
When I submit
Then I see validation error, password unchanged
CRITERIA GUIDELINES:
βββββββββββββββββββββββββββββββββββββ
βββ 3-8 criteria per story typically
βββ Cover happy path AND edge cases
βββ Specific and measurable
βββ Written before development
βββ Refined in grooming
βββ Team and PO agree
Splitting Stories
When and How
STORY SPLITTING TECHNIQUES
ββββββββββββββββββββββββββ
SPLIT WHEN:
βββββββββββββββββββββββββββββββββββββ
βββ Story is > 8 points (too big)
βββ Can't estimate (too vague)
βββ Multiple acceptance criteria clusters
βββ Different user flows
βββ Takes more than one sprint
βββ Team feels uncertain
SPLITTING PATTERNS:
βββββββββββββββββββββββββββββββββββββ
1. BY WORKFLOW STEP
Original: "User can purchase product"
Split:
βββ User can add to cart
βββ User can enter shipping
βββ User can enter payment
βββ User can confirm purchase
2. BY DATA VARIATION
Original: "User can log in"
Split:
βββ User can log in with email/password
βββ User can log in with Google
βββ User can log in with SSO
3. BY BUSINESS RULE
Original: "User can apply discount"
Split:
βββ User can apply percentage discount
βββ User can apply fixed amount discount
βββ User can apply free shipping discount
4. BY OPERATION (CRUD)
Original: "User can manage contacts"
Split:
βββ User can create contact
βββ User can view contact
βββ User can edit contact
βββ User can delete contact
5. BY PLATFORM
Original: "User can view dashboard"
Split:
βββ User can view dashboard (web)
βββ User can view dashboard (mobile)
βββ User can view dashboard (tablet)
6. BY COMPLEXITY
Original: "User can search products"
Split:
βββ User can search by name (simple)
βββ User can filter by category
βββ User can use advanced filters
BAD SPLITS:
βββββββββββββββββββββββββββββββββββββ
β Frontend / Backend (not independent)
β Design / Development (not independent)
β Happy path / Error handling (both needed)
β Implementation phases (not valuable alone)
Common Mistakes
What to Avoid
USER STORY MISTAKES
βββββββββββββββββββ
TOO VAGUE:
βββββββββββββββββββββββββββββββββββββ
β "As a user, I want the system to be fast"
β "As a user, I want search results in < 1 second"
TOO TECHNICAL:
βββββββββββββββββββββββββββββββββββββ
β "As a developer, I want to refactor the auth module"
β "As a user, I want login to work reliably"
(refactoring is HOW, not WHAT)
NO BENEFIT:
βββββββββββββββββββββββββββββββββββββ
β "As a user, I want a blue button"
Why? What value does blue provide?
β "As a user, I want clear call-to-action
so I know what to do next"
SOLUTION IN STORY:
βββββββββββββββββββββββββββββββββββββ
β "As a user, I want a dropdown menu with..."
That's a solution. What's the need?
β "As a user, I want to select my country
so I see relevant content"
(dropdown might not be the best solution)
TOO BIG:
βββββββββββββββββββββββββββββββββββββ
β "As a user, I want to complete the checkout process"
This is an epic, not a story. Split it.
NO ACCEPTANCE CRITERIA:
βββββββββββββββββββββββββββββββββββββ
β Story with no criteria = no definition of done
Team guesses what's expected
Arguments at demo
FAKE USER:
βββββββββββββββββββββββββββββββββββββ
β "As a system, I want to send emails"
Systems don't "want" things
β "As a customer, I want email confirmation
so I know my order was received"
GitScrum Stories
Story Management
GITSCRUM STORY FEATURES
βββββββββββββββββββββββ
CREATING STORIES:
βββββββββββββββββββββββββββββββββββββ
Task β Type: User Story
Fields:
βββ Title: "As a... I want... so that..."
βββ Description: Full story text
βββ Acceptance Criteria: Checklist format
βββ Story Points: Estimate
βββ Labels: Feature area
βββ Sprint: When planned
ACCEPTANCE CRITERIA AS CHECKLIST:
βββββββββββββββββββββββββββββββββββββ
In description or custom field:
β Given logged in, when click wishlist, then see items
β Given item unavailable, when view wishlist, then see status
β Given 30 days passed, when return, then items still there
Check off as you complete.
All checked = story done.
STORY HIERARCHY:
βββββββββββββββββββββββββββββββββββββ
Epic: User Authentication
βββ Story: Login with email/password
βββ Story: Login with Google
βββ Story: Password reset
βββ Story: Remember me
βββ Story: Logout
Each story independent and valuable.
REFINEMENT WORKFLOW:
βββββββββββββββββββββββββββββββββββββ
Status: Draft β Refined β Ready β Sprint
Draft: Initial capture
Refined: Discussed, criteria added
Ready: Estimated, team understands
Sprint: Committed to sprint
Best Practices
For User Stories
Anti-Patterns
STORY MISTAKES:
β Requirements documents disguised as stories
β Technical tasks as user stories
β No acceptance criteria
β Epic-sized stories
β Solution before problem
β No user benefit stated
β Written in isolation (no team input)
β Never refined before sprint