How to Write Clear Acceptance Criteria | Agile Guide
Write testable acceptance criteria that eliminate rework. Define done before development starts using GIVEN-WHEN-THEN format, PO collaboration, and GitScrum tracking.
9 min read
Clear acceptance criteria align expectations. GitScrum helps track criteria completion and ensures nothing is missed before a story is marked done.
Acceptance Criteria Basics
Purpose
WHY ACCEPTANCE CRITERIA MATTER:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β WITHOUT CLEAR CRITERIA: β
β βββββββββββββββββββββββ β
β Developer: "I think it's done" β
β PO: "That's not what I meant" β
β Developer: "Back to the drawing board..." β
β β Rework, frustration, delays β
β β
β WITH CLEAR CRITERIA: β
β ββββββββββββββββββββ β
β Developer: "All criteria met and verified" β
β PO: "Great, let's ship it" β
β β First-time right, everyone aligned β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ACCEPTANCE CRITERIA DEFINE: β
β βββββββββββββββββββββββββββ β
β β
β BOUNDARIES: β
β What's in scope, what's not β
β "Password reset via email only (not SMS)" β
β β
β BEHAVIOR: β
β How the feature should work β
β "Shows error if email not found" β
β β
β CONDITIONS: β
β Edge cases and special scenarios β
β "Link expires after 24 hours" β
β β
β MEASURABLE OUTCOMES: β
β Performance, accessibility β
β "Page loads in under 2 seconds" β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β GOOD CRITERIA ARE: β
β ββββββββββββββββββ β
β β
Testable (can verify yes/no) β
β β
Clear (no ambiguity) β
β β
Concise (not a novel) β
β β
Independent (can test each one) β
β β
Focused on outcome (not implementation) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Writing Formats
Given-When-Then
GIVEN-WHEN-THEN FORMAT:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β STRUCTURE: β
β ββββββββββ β
β GIVEN [precondition/context] β
β WHEN [action/trigger] β
β THEN [expected outcome] β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β EXAMPLE: Password Reset β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β STORY: As a user, I want to reset my password ββ
β β ββ
β β ACCEPTANCE CRITERIA: ββ
β β ββ
β β 1. GIVEN I am on the login page ββ
β β WHEN I click "Forgot password" ββ
β β THEN I see the password reset form ββ
β β ββ
β β 2. GIVEN I entered a registered email ββ
β β WHEN I submit the reset request ββ
β β THEN I receive a reset email within 1 minute ββ
β β ββ
β β 3. GIVEN I entered an unregistered email ββ
β β WHEN I submit the reset request ββ
β β THEN I see "No account with this email" ββ
β β ββ
β β 4. GIVEN I click the reset link in email ββ
β β WHEN I set a new password ββ
β β THEN I can log in with the new password ββ
β β ββ
β β 5. GIVEN the reset link is over 24 hours old ββ
β β WHEN I click the link ββ
β β THEN I see "Link expired, request new reset" ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β BENEFITS: β
β β’ Structured and consistent β
β β’ Easy to convert to automated tests β
β β’ Clear preconditions β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Checklist Format
CHECKLIST FORMAT:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β STRUCTURE: β
β ββββββββββ β
β Simple list of conditions that must be true β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β EXAMPLE: User Profile Page β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β STORY: As a user, I want to view my profile ββ
β β ββ
β β ACCEPTANCE CRITERIA: ββ
β β ββ
β β β Profile shows name, email, and avatar ββ
β β β Avatar displays initials if no image uploaded ββ
β β β Edit button visible for own profile only ββ
β β β Last login date displayed ββ
β β β Page loads in under 2 seconds ββ
β β β Works on mobile (responsive) ββ
β β β Accessible via keyboard navigation ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β BENEFITS: β
β β’ Quick to write β
β β’ Easy to review in demos β
β β’ Simple pass/fail verification β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β WHEN TO USE WHICH: β
β ββββββββββββββββββ β
β β
β GIVEN-WHEN-THEN: β
β β’ Complex user interactions β
β β’ Many edge cases β
β β’ Will become automated tests β
β β
β CHECKLIST: β
β β’ Simpler features β
β β’ Non-functional requirements β
β β’ Quick verification needed β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Common Patterns
Criteria by Type
ACCEPTANCE CRITERIA PATTERNS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β HAPPY PATH: β
β βββββββββββ β
β The main success scenario β
β "When user enters valid data, record is created" β
β β
β ERROR HANDLING: β
β βββββββββββββββ β
β What happens when things go wrong β
β "When email is invalid, show specific error message" β
β β
β EDGE CASES: β
β βββββββββββ β
β Boundary conditions β
β "When 0 items in cart, show empty cart message" β
β "When 100+ items, show pagination" β
β β
β PERMISSIONS: β
β ββββββββββββ β
β Who can do what β
β "Only admin can delete users" β
β "Users can only edit their own profile" β
β β
β PERFORMANCE: β
β ββββββββββββ β
β Speed and scale requirements β
β "Search returns results in under 500ms" β
β "Supports 1000 concurrent users" β
β β
β ACCESSIBILITY: β
β ββββββββββββββ β
β Inclusive design requirements β
β "All forms navigable by keyboard" β
β "Images have alt text" β
β β
β SECURITY: β
β βββββββββ β
β Protection requirements β
β "Passwords stored hashed, not plaintext" β
β "Session expires after 30 min inactive" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Complete Example
COMPREHENSIVE STORY WITH AC:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β STORY-456: Shopping Cart Checkout β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β AS A customer ββ
β β I WANT TO complete checkout ββ
β β SO THAT I receive my order ββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β β ACCEPTANCE CRITERIA: ββ
β β ββ
β β CART REVIEW: ββ
β β β Shows all items with name, price, quantity ββ
β β β Can modify quantities (1-99) ββ
β β β Can remove items ββ
β β β Shows subtotal, tax, and total ββ
β β ββ
β β SHIPPING: ββ
β β β Address form validates required fields ββ
β β β Postal code validates format ββ
β β β Shows shipping options with prices ββ
β β β Saves address for future orders (opt-in) ββ
β β ββ
β β PAYMENT: ββ
β β β Accepts Visa, Mastercard, Amex ββ
β β β Card number validates with Luhn algorithm ββ
β β β CVV required and hidden ββ
β β β Shows card type icon based on number ββ
β β ββ
β β CONFIRMATION: ββ
β β GIVEN valid cart, shipping, and payment ββ
β β WHEN customer clicks "Place Order" ββ
β β THEN order is created and confirmation shown ββ
β β AND confirmation email sent within 1 minute ββ
β β ββ
β β ERROR HANDLING: ββ
β β β Payment failure shows "Payment declined" ββ
β β β Can retry payment without re-entering details ββ
β β β Out of stock items blocked with message ββ
β β ββ
β β NON-FUNCTIONAL: ββ
β β β Checkout flow completes in under 3 clicks ββ
β β β Works on mobile devices ββ
β β β Page load under 2 seconds ββ
β β ββ
β β OUT OF SCOPE: ββ
β β β’ PayPal (separate story) ββ
β β β’ Gift cards (separate story) ββ
β β β’ Multiple shipping addresses ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Common Mistakes
Anti-patterns
ACCEPTANCE CRITERIA ANTI-PATTERNS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β TOO VAGUE: β
β ββββββββββ β
β β "The form should be user-friendly" β
β β "Performance should be good" β
β β "Handle errors appropriately" β
β β
β β
"Form has inline validation" β
β β
"Page loads in under 2 seconds" β
β β
"Invalid email shows 'Enter valid email'" β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β IMPLEMENTATION DETAILS: β
β βββββββββββββββββββββββ β
β β "Use React for the frontend" β
β β "Store in PostgreSQL database" β
β β "Use REST API with JSON" β
β β
β β
"Data persists after page refresh" β
β β
"API returns response in under 200ms" β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β TOO MANY: β
β βββββββββ β
β β 25 acceptance criteria for one story β
β (story too big, split it) β
β β
β β
3-8 criteria per story is typical β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β TOO FEW: β
β ββββββββ β
β β No criteria at all ("we'll figure it out") β
β β Only happy path covered β
β β
β β
Cover happy path + key error cases β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β NOT TESTABLE: β
β βββββββββββββ β
β β "Users should like the new design" β
β β "System should be scalable" β
β β
β β
"User satisfaction survey scores 4/5+" β
β β
"System handles 1000 concurrent requests" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ