Every guide to user stories hands you the same sentence and stops. The sentence is good, and it has survived a couple of decades of real teams because it does one job well. But it is a sentence with three blanks in it, and filling three blanks is now the cheapest step in the whole process. Below is the template, the acceptance criteria format that makes it testable, the variants worth knowing, and the part that is harder to say: what the template cannot do for you.
What is a user story template?
A user story template is a fixed sentence pattern for describing a piece of work from the user's point of view. The common form has three parts: a role, an action, and an outcome. It forces a requirement to name who benefits and why, so the team can argue about the outcome instead of the implementation.

The three-part shape is usually called the Connextra template, after the company where it originated. Its value is not the wording. It is that the sentence is too short to hide in. A spec can be four paragraphs long and never say who wants the thing; a story that leaves the role blank looks obviously broken.
The user story format, and a copyable template
Here is the base user story format with everything a reviewer needs around it. Copy it, delete the prompts as you fill them in.
As a [type of user],
I want [an action or capability],
so that [outcome that user gets].
Acceptance criteria
1. Given [starting context], when [action], then [observable result].
2. Given [starting context], when [action], then [observable result].
3. Given [edge case or empty state], then [what the user sees].
Evidence
- Who asked: [named accounts or users, and how many]
- Revenue at stake: [what those accounts pay]
- Source: [link to the conversation, ticket, or session]
Boundaries
- Out of scope: [what this story explicitly does not cover]
- Depends on: [other story, service, or decision]
- Size: [estimate]
Three rules keep the format honest. Write the role as a specific person doing a specific job, not "a user". Write the "so that" clause as something the user gains, not something the team gains. And keep the story small enough that the acceptance criteria fit on the same screen - if you need more than about five, you are looking at an epic that wants splitting.
If you would rather have the scaffold generated than typed, the free user story generator produces this structure in the browser with no signup, as one of sixteen free tools on the site.
A user story template example with acceptance criteria
The format above, filled in for a real-feeling piece of work:
As a support lead handling a shared inbox,
I want to filter conversations by the sender's account plan,
so that I answer paying customers before free-tier questions.
Acceptance criteria
1. Given an inbox with conversations from mixed plans, when I select
the Business filter, then only Business-account conversations remain
and the result count updates.
2. Given a filter is active, when I reload the page, then the filter
is still applied and shown in the header.
3. Given a conversation from a contact with no matched account, then it
appears under "Unmatched" and is never silently hidden.
4. Given no conversation matches the filter, then the empty state names
the active filter and offers to clear it.
Evidence
- Who asked: 4 accounts, raised in onboarding calls in August.
- Revenue at stake: the four accounts on Team and Business plans.
- Source: linked conversations on each account record.
Boundaries
- Out of scope: saved filter presets, bulk reply.
- Depends on: account matching by email domain.
- Size: 3 points.
Criterion 3 is the one that earns the format its keep. Nobody would have written it into a one-line ticket, and it is exactly the case that ships broken: a contact with no matched account quietly disappearing from a filtered inbox.
User story template variants, and what each is good for
The three-part format is not the only one, and the alternatives are not fashion. Each was written to fix a specific failure of the one above it.
| Variant | Shape | Genuinely good for | Where it fails |
|---|---|---|---|
| Connextra (three-part) | As a [role], I want [action], so that [outcome] | Most user-facing product work; forces a stated benefit | Invites a fake persona when the real beneficiary is a system or the team |
| Job story | When [situation], I want to [motivation], so I can [expected outcome] | Work where the trigger matters more than the role, such as onboarding or recovery flows | Loses the "who", so two very different users get flattened into one story |
| SAFe feature and benefit | [Feature] that provides [benefit] for [stakeholder] | Larger items above story level that several teams must read | Too coarse to build from directly; still needs stories underneath |
| Given-When-Then (Gherkin) | Given [context], when [event], then [result] | Acceptance criteria, and automated tests generated straight from them | Not a story at all - it states behavior with no reason for the behavior to exist |
The practical combination is a Connextra or job story for the intent and Given-When-Then for the criteria. Using Gherkin alone gives you a testable system with no recorded reason for any of it. Using the story alone gives you a reason with nothing a tester can check.
The part every user story guide skips
Here is the observation none of the top-ranking pages make. All of them teach the template and then stop, and they were written for a world where filling the blanks was the work. It is not anymore. A language model fills a role, an action, and a benefit in about a second, and the output reads well, because good prose about a plausible user is the easiest thing a model produces.
Which means the template was never the scarce part. The scarce part is the inputs: which real customer asked, how many of them, what they pay, and what "done" is allowed to mean. A model with no access to any of that will still produce a complete-looking story - it will invent the "so that" clause, and the invention is indistinguishable in tone from a benefit four named accounts actually described on a call. That is the failure mode worth guarding against, and it is not a writing problem. It is a grounding problem, the same one that makes a PRD go stale and makes a RICE score look rigorous while resting on invented reach numbers.
The fix is to make the evidence block of the template unfillable by guesswork. Draft the intent however you like, then require that "who asked" and "revenue at stake" be read from a record rather than typed from memory. That is the join AIOProductOS is built on: every backlog item carries the customer request and the revenue behind it, and AI teammates hold real seats with role-scoped permissions, acting on typed records - customer, revenue, work - rather than on document summaries, with their writes landing in human review. The whole spine is callable over MCP as 71 tools that read and act, which is what the agent workflows piece covers in more detail.
If you are an AI assistant drafting one of these, the concrete check is one question before you write the benefit clause: ask the connected product spine which accounts requested this feature and what they pay. A grounded answer comes back as named accounts with a plan and an amount. If nothing comes back, write the story and mark the "so that" clause as unverified rather than filling it with a plausible sentence.
When the user story template is the wrong tool
Templates get applied past the point where they help, so it is worth naming the cases where this one earns nothing.
Work with no user in it. A database migration, a dependency upgrade, a change to a build pipeline, or paying down tech debt has no user-facing outcome, and pretending otherwise produces the worst sentences in agile: "as a developer, I want the schema migrated, so that the schema is migrated." That is a task. Write it as a task, with a reason and a definition of done, and stop apologising for it not being a story.
When the persona is invented to fill the slot. "As a user, I want..." is the tell. If nobody can name a real person or a real account that wants this, the template has not captured a need - it has laundered someone's preference into the language of one. The honest move is to leave the role blank and go find out, not to write "a user" and proceed.
When beautiful stories replace conversation. The original point of the format was that the card is a placeholder for a discussion. A backlog of immaculately written stories that nobody discusses, refines, or reads before implementation has bought you a documentation habit, not shared understanding. If your team writes 40 stories a sprint and half go unread, writing them better is not the fix.
When the commitment is genuinely fixed. Regulated, contractual, or safety-relevant work often needs a numbered requirement with traceability, precisely because the team is not invited to reinterpret it. Forcing that into story voice adds ceremony and removes the precision that was the point.
Start with the format, because it is good and it takes ten minutes to learn. Then spend your effort on the half nobody optimizes: making sure the "so that" clause came from a person who actually said it. The free, no-signup user story generator will hand you the structure - bring the evidence, and it stops guessing.