Acceptance Criteria Best Practices for Agile Teams
Good acceptance criteria are the difference between a story that ships confidently and one that generates endless back-and-forth. Learn the formats, common mistakes, and how to write criteria that actually close the loop.
What Acceptance Criteria Are For
Acceptance criteria define the conditions under which a user story is considered complete and accepted by the product owner. They are not a specification of how to build something. They are a specification of what a correct implementation must do.
The practical purpose of acceptance criteria is to prevent the most common and expensive kind of rework: building the wrong thing correctly. A developer can implement a story flawlessly, ship it on time, and have it rejected at the sprint review because it did not handle an edge case the product owner assumed was obvious. Acceptance criteria surface those assumptions before development starts, not after.
Good acceptance criteria also enable meaningful testing. Each criterion should be directly testable — either with an automated test or a reproducible manual test case. If you cannot describe a test that would confirm a criterion is met, the criterion is too vague to be useful. The act of writing testable criteria often reveals requirements that were genuinely unclear and needed clarification.
The Given/When/Then Format
Given/When/Then (GWT) is the most rigorous format for writing acceptance criteria. It originated in behavior-driven development (BDD) and maps directly to test structure, which makes it valuable for teams who write automated tests.
The structure: Given [some initial context], When [an action is performed], Then [an observable outcome occurs].
Example: Given a logged-in user with an active subscription, when they click "Download Invoice" on any past payment, then a PDF invoice is downloaded with the correct amount, date, and billing address.
GWT is powerful because it forces you to be specific about three things: the state of the system before the action, the specific action taken, and the specific result expected. This precision eliminates the vagueness that kills most acceptance criteria. "The invoice downloads correctly" is not a criterion — it is a hope. The GWT version above is a testable assertion.
The format also makes edge cases explicit. You write one Given/When/Then for the happy path, then additional ones for edge cases: Given a logged-in user whose account has been downgraded, when they click "Download Invoice," then they see an error message explaining that invoices require an active subscription.
The Checklist Format
Not every story requires the full rigor of Given/When/Then. For many stories, a simple checklist of conditions is faster to write, easier to read, and just as effective. The checklist format works well when criteria are clear enough to not need the full context-action-result structure.
Example checklist for a password reset story:
- Reset email is sent within 30 seconds of the request
- Reset link expires after 24 hours
- Link can only be used once
- User is redirected to login after successfully resetting their password
- User receives a confirmation email after the reset is complete
- An error message is shown if the link has expired or already been used
This is readable, complete, and testable without requiring the GWT ceremony. Use GWT when the context matters — when the same action produces different results in different states. Use checklists when the conditions are straightforward and context-independent.
How Many Criteria Per Story
There is no universal answer, but there are useful heuristics. If a story has fewer than two acceptance criteria, it is probably either trivially small (fine — that is a feature, not a bug) or the criteria are too vague (a problem). If a story has more than ten acceptance criteria, it is probably too large to fit in a single sprint and should be split.
The most common mistake is confusing the number of criteria with the quality of criteria. A story with twelve acceptance criteria might be less well-specified than a story with four, if those four are precise, testable, and cover the meaningful edge cases. More is not better. Specific is better.
A practical guideline: three to six acceptance criteria per story. Enough to define the scope unambiguously, few enough to not create an implicit specification document. If you find yourself writing ten or more criteria, step back and ask whether the story should be split, whether some criteria are actually implementation details rather than acceptance conditions, or whether some criteria can be combined.
Who Writes Acceptance Criteria
The product owner is responsible for acceptance criteria in the sense that they ultimately own what "accepted" means. But "responsible" does not mean "writes them alone." In most healthy teams, acceptance criteria are a collaborative product of the product owner and the development team, with testers playing a particularly valuable role.
Testers think in edge cases by profession. They ask "what happens if the user does this unexpected thing?" and "what if the system is in this unusual state?" Those questions surface acceptance criteria that a product owner focused on the happy path would never think to write. Involving a tester in story refinement consistently produces better acceptance criteria than any other single practice.
Developers also contribute criteria, particularly around technical edge cases: "What should happen if the external payment service is unavailable?" or "What if two users submit the same form simultaneously?" These are acceptance criteria, not implementation details. The product owner needs to decide what the correct behavior is; the developer is right to surface the question before the sprint starts.
Common Mistakes
Too vague. "The form should be user-friendly" is not an acceptance criterion. It is an aspiration. Every piece of software shipped by a team that cared about its work was described as "user-friendly" at some point. What specifically should happen? How quickly should it load? What happens on validation errors? What error messages should appear? Vague criteria produce vague software.
Too implementation-specific. "The backend should use a Redis cache with a 15-minute TTL" is not an acceptance criterion — it is an implementation directive. Acceptance criteria describe observable outcomes, not internal architecture. The criterion should be "search results should return within 200ms for 95% of queries" — the implementation detail of how to achieve that is the team's decision, not the product owner's.
Missing edge cases. Happy-path acceptance criteria are necessary but not sufficient. Every form has invalid inputs. Every API has failure modes. Every feature has an empty state. Acceptance criteria that cover only the expected case leave the team guessing about what to do when things go wrong — and they always go wrong somewhere.
Written after the sprint starts. Acceptance criteria written during development rather than during refinement defeat the purpose. By the time a developer is writing code, the acceptance criteria should be agreed and stable. Writing them mid-sprint is a sign the story was not ready to be pulled in.
Testing Acceptance Criteria
The final check for any acceptance criterion is: can it be tested? Not "can we tell if it works" — can it be tested in a repeatable, unambiguous way? If the answer is no, the criterion needs revision.
For automated tests, this means you should be able to write a test case that directly maps to each criterion before the code is written. Behavior-driven development tools like Cucumber or Playwright test scripts can encode GWT criteria directly. This makes acceptance criteria living documentation — they describe the expected behavior and the tests verify it.
For manual tests, each criterion should translate to a reproducible test case with specific steps, specific inputs, and a specific expected outcome. "Tester navigates to the checkout page, adds item to cart, proceeds to payment with test card 4242 4242 4242 4242, confirms order, verifies confirmation email arrives within two minutes" is a manual test case. "Verify checkout works" is not.
When the sprint review comes, acceptance criteria become the script for the product owner's evaluation. If the story satisfies every criterion, it is accepted. If a criterion is not met, the story is not done — regardless of what the developer says. That clarity is the entire point. Well-written acceptance criteria eliminate subjective judgment from the acceptance decision and replace it with observable facts.
Ready to try planning poker?
Start a free estimation session with your distributed team in seconds. No signup required.
Start Planning PokerRelated Articles
ScrumChamps Team
Built by West 10 Tech — practical tools for agile teams.