User story template
Copy the user story template below, or paste a feature idea, a Slack thread or customer feedback and get stories with acceptance criteria your team can estimate.
This is the User Story snippet. In Snippetbar, copy the Slack thread, run it, and paste the stories into a new Linear or Jira issue.
The template
**Title:** Short verb phrase, e.g. “Bulk download invoices for a month” **User story** As a [specific user], I want [one behavior], so that [the outcome they get]. **Acceptance criteria** - Given [starting state], when [action], then [observable result]. - Given [starting state], when [action], then [observable result]. - Given [edge case], when [action], then [observable result]. **Notes** Context, links to research, designs or the Slack thread. **Out of scope** What this story deliberately doesn't cover. **Done when** - Acceptance criteria pass - Tested on [platforms] - Copy and empty states reviewed - [Docs / help article] updated
User story template examples
From a feature request
Feature request
Customers keep asking if they can export their invoices as PDF. Finance teams want to download them all at once at month end instead of one by one.
After
Story 1: Export an invoice as PDF
As a finance lead, I want to download any invoice as a PDF, so that I can send it to our accountant without taking screenshots.
Acceptance criteria
- Given I'm viewing an invoice, when I choose Download PDF, then a PDF of that invoice downloads.
- Given the invoice is in {which currencies?}, when I download it, then amounts match what the app shows.
Story 2: Download a month of invoices at once
As a finance lead, I want to download all invoices for a month in one file, so that month-end close isn't one download per invoice.
Acceptance criteria
- Given I pick a month, when I choose Download all, then I get one {ZIP or single PDF?} with every invoice issued that month.
- Given a month has no invoices, when I choose Download all, then I see “No invoices for this month” and nothing downloads.
Open questions: Which time zone defines the month? Is there a limit on invoices per download?
From customer feedback
Customer feedback
Feedback from Hannah (ops lead, 40-person team): 'I can't tell who changed a shift after it's published. Someone moved Marco to Saturday and nobody knew until he didn't show up.'
After
Story 1: See who changed a published shift
As an ops lead, I want to see who changed a published shift and when, so that I can follow up before it causes a no-show.
Acceptance criteria
- Given Marco's shift was moved to Saturday after publishing, when I open the shift, then I see who moved it, when, and from which day.
- Given a shift has had no edits since publishing, when I open it, then I see “No changes since published”.
Story 2: Notify people when a published shift changes
As a scheduled employee, I want to be told when my published shift changes, so that I show up on the right day.
Acceptance criteria
- Given my published shift is moved, when the change is saved, then I get a notification {which channel?} with the old and new times.
- Given I change my own shift, when I save it, then I don't get notified about my own edit.
From a vague ticket
Jira ticket
Improve search. Users complain it's bad.
After
Story 1: Find projects by partial name
As a {which user?} with {how many?} projects, I want search to match part of a project name, so that I can find “Q3 Brand Refresh” by typing “brand”.
Acceptance criteria
- Given a project named “Q3 Brand Refresh”, when I search “brand”, then it appears in the results.
- Given no project matches, when I search, then I see “No projects match ‘{term}’” and a link to clear the search.
Open questions: Which complaints are these? Is the problem matching, speed, or ranking?
Bad vs good user story lines
| Vague | Specific | Why |
|---|---|---|
| As a user, I want a dashboard. | As a store owner, I want to see today's orders and revenue on one screen, so that I know by 9am whether yesterday's promo worked. | A real user, one behavior, a reason you can check |
| As an admin, I want a Postgres table for audit logs. | As a workspace admin, I want to see who removed a member and when, so that I can answer our security team's questions. | Describes the need, not the implementation |
| As a customer, I want to manage my subscription so that it's better. | As a customer on the monthly plan, I want to switch to annual billing myself, so that I get the discount without emailing support. | “Manage” hides five stories. Pick one |
Splitting an epic into stories
Epic
Epic: Team invites. Admins can invite people by email, set their role, and resend or cancel invites.
After
Story 1: Invite a teammate by email
As a workspace admin, I want to invite someone by email, so that they can join without me sharing a password.
Story 2: Choose a role when inviting
As a workspace admin, I want to set Member or Viewer when I send an invite, so that new people only see what they need.
Story 3: Resend or cancel a pending invite
As a workspace admin, I want to resend or cancel an invite that hasn't been accepted, so that a wrong address doesn't stay open.
Story 1 is useful on its own, even if 2 and 3 slip a sprint.
How to write a user story with this template
Write for a real user, not “a user”
“As a workspace admin” tells the team whose problem this is. “As a user” tells them nothing and leads to generic solutions.
Put the outcome in “so that”
The “so that” is why the story is worth building. If it just repeats the “I want” line, you don't know the reason yet.
Make acceptance criteria testable
Given / When / Then forces a starting state, an action and a result someone can check. “Search works well” can't pass or fail. “Searching ‘brand’ returns Q3 Brand Refresh” can.
One story, one behavior
An “and” in the “I want” usually means two stories. Small stories are easier to estimate, test and ship.
Keep implementation out
Describe what the user needs, not the table, endpoint or component. Engineers will find a better solution when they aren't handed one.
Check it against INVEST
A good user story is Independent, Negotiable, Valuable, Estimable, Small and Testable. If the team can't estimate it, it's too big or too vague. Split it, or add the missing detail.
The snippet
This is the exact prompt the tool above runs. Save it as a snippet in Snippetbar and it works on any text you select.
You are a senior product manager. Turn the text below into user stories a team can estimate and build.
Rules:
- Use only information in the text. Keep every detail it gives (names, numbers, timings) exactly. Never invent users, limits, or business goals. Mark anything missing in the story or criteria as a short {placeholder}, e.g. {which plan?} or {how many days?}.
- Each story: As a {specific user}, I want {one behavior}, so that {outcome}. Name the real user from the text ("finance lead", "trial user"), never just "a user".
- The "so that" is the outcome that solves the problem in the text, not the feature restated.
- One story, one behavior. Write a separate story for each distinct thing the text asks for, up to 3. If the text describes one problem, write one story. Don't add stories the text doesn't ask for.
- Under each story, 2–3 acceptance criteria in Given / When / Then, one line each. Each must be testable, pass or fail. Include one realistic edge case, not generic error handling.
- Keep implementation out: no databases, APIs, or component names.
- After the stories, add "Out of scope:" (one line) only if the text mentions something that can wait. Add "Open questions:" with at most 3 plain questions, only for real gaps.
- Plain, neutral tone. Drop urgency and frustration from the source.
Return in markdown. For each story: "**Story N: short title**", the story sentence, "**Acceptance criteria**" as a bulleted list. Then Out of scope and Open questions if needed. Return only the stories. No other text.Use it where you work
New issue in Linear or Jira
Write the rough idea in the description field, select it, and run the snippet. The story and acceptance criteria replace it in place, with gaps marked so you know what to ask before refinement.
In a Notion PRD
Select the requirements section of a PRD and turn it into numbered stories the team can size in planning, without leaving the doc.
From a Slack thread
Copy the thread where the idea came up, run the snippet, and paste the stories into your tracker. Each ask in the thread becomes its own story.
More snippets
All snippets →Bug report template
Copy the template below, or paste a messy bug description from Slack, email or a customer, and get a clean, reproducible report.
Persona generator
Paste research notes, interview snippets or a description of your audience, and get a structured persona you can share with the team.
Meeting agenda generator
Before the meeting, paste a Slack thread, a list of topics or an invite, and get a focused agenda. After it, paste your notes and get decisions and action items.
Questions
Run it in any app
Select the text, pick User story template from the menubar or press its shortcut, and the result replaces it in place.
From “can we add…” to a ready story in one shortcut.
Snippetbar runs your snippets on anything you copy, in any Mac app. $29, one-time purchase.