A User Story Acceptance Criteria Prompt That Locks Given-When-Then
A reusable user story acceptance criteria prompt that locks INVEST and Given-When-Then, with model behavior for Claude and ChatGPT. Copy the prompt and ship it.
A good user story acceptance criteria prompt does one unglamorous thing well: it returns the same shape every time. The standard "as a persona, wants a goal, for a reason" line on top, then acceptance criteria your QA lead can turn into test cases without rewriting them. Sounds simple. Most prompts don't manage it.
Paste "write a user story for password reset" into ChatGPT and you'll get something usable. Paste it forty times across a sprint backlog and you'll get forty slightly different formats. One story has Given-When-Then, the next has a bulleted checklist, a third buries the criteria in a paragraph. That drift is the real cost, and it's exactly what the listicles skip.
This walks through a reusable prompt that locks the structure, the model quirks that break it, and where it fits in an actual refinement workflow.
What you can do with this prompt
- Turn a one-line feature idea into a properly formed story with a persona and a benefit
- Generate acceptance criteria in Given-When-Then so each clause maps to a test
- Split a fat epic into thin, independently shippable stories
- Add edge-case criteria that engineers usually find in code review, earlier
- Keep every story in one format so the backlog reads consistently
- Hand QA criteria they can lift straight into a test plan
Why the same story comes back in three different shapes
Acceptance criteria are conditional logic written in English. "Given a logged-out user, when they submit a valid email, then a reset link is sent." That maps one-to-one onto a test. The trouble is that models treat format as a suggestion, not a rule, unless you make it one.
The fix is an output contract: a fixed block at the end of the prompt that says exactly what the response must contain and in what order. Without it, you're trusting the model to remember the shape. It won't, especially once the input gets long.
A story is worth shipping when it's Independent, Negotiable, Valuable, Estimable, Small, and Testable. Bake those six into the prompt as a self-check and the model rejects its own vague stories before you see them. The Testable criterion does the heavy lifting: if the model can't write a Given-When-Then clause for a story, the story isn't ready, and that's a signal worth catching at refinement instead of in sprint.
Anatomy of the prompt
Variables
{{feature_brief}} — the raw feature idea or ticket text
{{persona}} — who the story is for (e.g. "returning customer")
{{criteria_format}} — "given-when-then" or "checklist"
Prompt
Role: senior product owner writing refinement-ready stories.
Task: turn {{feature_brief}} into one user story for {{persona}}.
Self-check the story against INVEST; if it fails Small or
Testable, split it and return the split instead.
Output contract (return exactly this, nothing else)
Story: As a {{persona}}, I want <goal>, so that <benefit>.
Acceptance criteria ({{criteria_format}}):
- <clause 1>
- <clause 2>
- <clause 3+>
Out of scope: <one line, or "none">
The {{criteria_format}} variable is the part most templates miss. Conditional stories want Given-When-Then. A copy change doesn't. One prompt should handle both instead of forcing every story into the same mold.
How models behave on this specific job
Here's the part the generic guides skip. Behavior on story writing, not on coding in general:
| Behavior on user-story writing | Claude | ChatGPT (GPT-4o) |
|---|---|---|
| Holds Given-When-Then across a long backlog | Steady; rarely collapses to prose | Drifts to prose past several stories unless the contract is restated last |
| Splits an oversized epic when asked | Splits readily, sometimes too aggressively | Conservative; needs an explicit "split if larger than X" rule |
| Invents acceptance criteria for unstated behavior | Occasionally adds plausible criteria not in the brief | Sticks closer to the brief, fewer additions |
| Respects "out of scope" line | Consistent | Consistent when it's in the contract |
The takeaway isn't that one model wins. It's that GPT-4o needs the output contract on the final line of the prompt, while Claude tolerates it earlier. Pin whichever you standardize on, and keep an eye on invented criteria. Models will happily write a test for behavior nobody asked for.
1. Gather the brief
Drop the raw ticket or idea into {{feature_brief}}. Messy is fine. A half-sentence from a stakeholder works better than you'd think, because the prompt forces structure onto it.
2. Name the persona
Set {{persona}} to the actual user, not "user." "First-time buyer on mobile" produces sharper criteria than "customer." The benefit clause gets concrete when the persona does.
3. Pick the criteria format
given-when-then for anything with conditional behavior. checklist for flat changes. Don't default to Given-When-Then for a button color change; it reads as ceremony.
4. Run and read the split
If the model split the story, that's the prompt earning its keep. An epic that becomes three thin stories is three things you can actually estimate. Reading the split is faster than catching the same problem mid-sprint.
5. Sanity-check against reality
The model writes plausible criteria, not correct ones. It doesn't know your auth flow or your edge cases. Read every clause as a draft a teammate wrote, because in effect that's what it is.
Variables you'll set
| Variable | Required | What it is |
|---|---|---|
{{feature_brief}} | Yes | The raw feature idea, ticket, or stakeholder note |
{{persona}} | Yes | The specific user the story serves |
{{criteria_format}} | No | given-when-then or checklist; defaults to Given-When-Then |
An opinion worth holding
Stop asking the model to write "exhaustive" acceptance criteria. You'll get fifteen clauses, half of them restating the obvious, and refinement turns into a deletion exercise. Ask for the three to five criteria that would actually fail the story if they broke. Tight criteria that map to real tests beat an exhaustive list every time, and they cost fewer tokens. The padding isn't thoroughness. It's noise wearing a thoroughness costume.
A reusable prompt makes this enforceable. You write the contract once, set the cap, and every story respects it. That's the whole argument for a prompt pack over copy-pasting a fresh prompt each time: the rules live in one place, not in your memory.
Getting started
- Copy the prompt skeleton above into your model of choice.
- Fill
{{feature_brief}}and{{persona}}with one real ticket. - Set
{{criteria_format}}to match the story's complexity. - Run it, read the split if there was one, and edit the criteria for your actual system.
- Save the filled prompt as your team's template so stories stop drifting in shape.
- When you're refining a whole backlog, reach for a pack that carries the contract and the ticket-split logic for you, like the Connected Product Requirements Agent Pack.
The Connected Product Requirements Agent Pack does this end-to-end: it reads context, drafts the story with a locked acceptance-criteria contract, and breaks the work into linked engineering tickets in one pass, so you're not retyping the {{feature_brief}} into three separate prompts. It's part of The Complete AI Prompts Bundle, a one-time lifetime license to the whole catalog plus every pack added later, which pays off fast if you also run roadmap and backlog jobs.
Once your stories are clean, the next bottleneck is usually the backlog around them. The Backlog Cleanup Agent Pack flags duplicates and stale tickets with a keep/merge/archive verdict, which pairs naturally with sharper stories. For the document those stories roll up into, the writeup on a PRD prompt that holds its structure covers the section-level contract, and the Jira backlog cleanup prompt walks the grooming side.
Browse all product and developer prompt packs →Common questions
What is a user story acceptance criteria prompt?
Should acceptance criteria use Given-When-Then or a checklist?
Is Claude or ChatGPT better for writing user stories?
Get the prompt packs this guide is built on
Ready-to-paste prompts with documented variables and usage guides for ChatGPT, Claude, and Gemini. One-time payment, own it forever.
More prompt guides

Gemini vs Claude for Long-Context Code: Window or Accuracy
The honest framing of Gemini vs Claude for long-context code isn't which model is smarter. It's a tradeoff between two different things: how much code you can fit in one prompt, and how often the mode…

An OKR Drafting Prompt That Catches Vanity Key Results
An OKR drafting prompt has to fight the model's strongest instinct: handing back something that sounds like a goal but can't be measured. Ask any model for key results and you'll get "increase user en…

A Technical Design Doc Prompt That Holds the RFC Structure
A technical design doc prompt earns its keep when it stops every author from inventing a new doc structure. Context, the options you considered, why you picked one, what breaks, how you roll it out. S…