How to Write User Stories That Developers Won't Hate
So you've Googled "how to write user stories" because your developers keep sighing in refinement sessions. You're probably expecting a nice template and some best practices.
Sorry. We need to have a harder conversation.
I've spent 10 years writing and reviewing user stories, and here's the truth: Most of them are garbage. Not because people are stupid, but because they're writing stories for the wrong audience: themselves.
The Template Trap
Yes, you know the format:
As a [user]
I want to [action]
So that [benefit]
Great. You've memorized a template. Now forget it.
Because here's what most people write:
As a user
I want to export my data to Excel
So that I can have my data in Excel
Congratulations. You've written absolutely nothing of value.
How to Actually Write User Stories
1. Start With "Why" (And Not Your Why)
Bad:
As a user
I want a dashboard
So I can see my data
Good:
As a sales manager doing monthly reporting
I want to see my team's key metrics in one place
So I can spot problems before they affect our targets and avoid
surprising my boss with bad news at month-end meetings
See the difference? The second one:
- Identifies a real user
- Explains their context
- Shows actual consequences
- Makes the value clear
2. Accept That "User" Is Not a Type of User
If you write "As a user" one more time, I swear to god...
Real users have:
- Job titles
- Responsibilities
- Problems
- Deadlines
- Bosses to please
- Mistakes they fear making
Write for them.
3. Make the Pain Clear
Bad:
As a marketing manager
I want to schedule social media posts
So I can post on social media
Good:
As a marketing manager juggling 6 social channels
I want to schedule posts across all platforms at once
So I can stop wasting 2 hours every morning copying and pasting
between different tools and actually focus on creating content
The pain is what matters. Show it.
4. Acceptance Criteria Is Not Optional
A user story without acceptance criteria is just a wish list.
Bad acceptance criteria:
- Data should export
- UI should be user friendly
- System should be fast
Good acceptance criteria:
- Export includes all fields selected by user
- Export completes in <30 seconds for up to 10,000 rows
- Progress bar shows estimated completion time
- User can cancel export while in progress
- Failed exports show specific error message
- Exported file name includes date and report type
5. Edge Cases Are Not "Edge" Cases
You know what developers hate? When you say "nobody will ever try that" and then it happens in production.
Include:
- What happens if it fails?
- What if the user does it twice?
- What if the data is empty?
- What if it's too large?
- What if they lose connection?
- What about mobile?
6. Context Is Everything
Bad context:
Background: User needs to export data
Good context:
Background:
Sales team currently exports data from our system, reformats it
in Excel, and sends it to clients every Monday. Process takes
2-3 hours. They often miss data points and have to resend.
Clients complain about inconsistent formatting.
Current manual steps:
1. Export from our system (15 mins)
2. Clean up formatting (1 hour)
3. Add calculations (30 mins)
4. Create charts (30 mins)
5. Send to client
6. Resend when they find mistakes (40% of the time)
Real Examples That Don't Suck
Example 1: Report Generation
Bad:
As a user
I want to generate reports
So I can see my data
Good:
As a finance manager preparing monthly board reports
I want to generate standardized performance reports with one click
So I can stop spending 3 hours every month copying numbers
between systems and focus on actual financial analysis
Acceptance Criteria:
- Generate report for selected time period
- Include standard metrics (revenue, costs, margins)
- Apply consistent formatting to all tables
- Show YoY comparisons automatically
- Export in board-ready PDF format
- Include data sources and timestamp
- Complete generation in <2 minutes
Edge Cases:
- Handle missing data points
- Account for different fiscal years
- Warning if data looks anomalous
- Ability to regenerate if needed
Example 2: Login Feature
Bad:
As a user
I want to log in
So I can access my account
Good:
As a remote sales rep working across devices
I want secure but convenient access to my account
So I don't waste time with login issues while at client sites
or risk unauthorized access to client data
Acceptance Criteria:
- Login with email/password
- Optional 2FA via authenticator app
- "Remember me" on trusted devices
- Session persists across tabs
- Auto-logout after 12 hours
- Force logout on password change
- Clear error messages for wrong credentials
Edge Cases:
- Handle expired passwords
- Detect unusual login locations
- Block after 5 failed attempts
- Recovery process for locked accounts
- Handle offline access needs
The Truth About Good User Stories
They're not about features. They're about:
- Real people
- Real problems
- Real impact
- Real constraints
If your story could apply to any product, it's not specific enough. If it doesn't mention time saved or pain removed, it's not valuable enough. If it doesn't include edge cases, it's not complete enough.
How to Know If Your Story Is Good Enough
Ask yourself:
- Could someone explain why this matters to a real user?
- Could a developer build it without asking questions?
- Could a tester verify it's working?
- Could support explain it to a user?
If any answer is no, keep writing.
The Real Secret
Want to write better user stories? Stop writing about what you want to build and start writing about who needs it and why.
Your developers don't hate user stories. They hate trying to build solutions when they don't understand the problem.
Tired of writing user stories that make developers want to quit? Try Refinewise - we help you write stories that actually make sense. No signup needed.