← Back to Blog

By David Nielsen · February 20, 2026 · 7 min read

How to Write Acceptance Criteria That Actually Work

Stop shipping half-built features: master the acceptance criteria patterns that reduce rework by 40% and align teams on what "done" actually means.

Key Takeaway

Bad acceptance criteria are the #1 source of sprint rework. They're either too vague ("make it faster"), too prescriptive ("use React hooks"), or untestable. This guide covers the two proven patterns—Given/When/Then and checklist style—plus the exact checklist to catch mistakes before code review.

Why Do Teams Struggle to Write Acceptance Criteria?

Most teams write criteria that sound reasonable but fail to answer developer questions, turning 2-day stories into 5-day rework cycles every sprint.

Here's what we see constantly: a product manager writes acceptance criteria that sound reasonable in isolation, but when developers start building, they realize the criteria don't actually answer the questions they need answered. Is the feature complete if it works on desktop but not mobile? What happens when the API times out? Does "intuitive UX" mean following Material Design or the company's design system?

The result? Developers guess, build it one way, get feedback, and rework it. A two-day story becomes a five-day story. Your sprint velocity tanks. Your team gets frustrated.

The root cause isn't laziness or incompetence—it's that most teams have never learned the patterns that make criteria testable, specific, and actually useful. They're writing criteria the way they'd write an email, not the way they'd write a test.

What Makes Acceptance Criteria Actually Testable?

Testable criteria describe observable behavior, use measurable outcomes instead of subjective adjectives, and can be verified by two people independently with identical results.

Testable acceptance criteria share three non-negotiable properties: they describe observable behavior (not implementation), they're specific enough that two people would test them the same way, and they can be verified without ambiguity.

Let's compare. "The login form should be fast" fails all three tests. Fast to whom? On what connection? Measured how? Now try: "The login form should submit within 2 seconds on a 3G connection." That's testable. You can measure it. You can automate it. You know when you're done.

The magic is moving from subjective adjectives (fast, intuitive, reliable) to measurable outcomes (2 seconds, 95th percentile latency, 3 retries). If your acceptance criteria contain words like "should be", "nice to have", "easy", or "smooth", you've probably missed the mark. Those are nice-to-haves for the retrospective, not criteria for done.

Should You Use Given/When/Then or Checklist Style?

Use Given/When/Then for complex multi-step workflows; use checklist style for features with discrete requirements where parallel testing by team members is easier.

There are two dominant patterns for writing acceptance criteria, and each works best in different contexts. Neither is universally superior—it's about matching the pattern to the work.

Given/When/Then (also called Gherkin syntax) structures criteria as scenarios: Given [precondition], When [user action], Then [expected result]. This pattern shines for behavior-driven features where the interaction matters more than the outcome. It's also great for complex workflows with multiple paths.

  • Example (Given/When/Then): Given a user is logged in, When they click "Forgot Password", Then they receive an email with a reset link within 2 minutes.
  • Checklist style is simpler and works better for features with discrete requirements. Instead of scenarios, you list what must be true: "Payment form accepts Visa, Mastercard, and Amex", "Confirmation email sends within 30 seconds", "User can update payment method without re-entering CVV". Checklist criteria are easier to scan, easier to parallelize across team members, and less likely to become overly prescriptive.
  • Example (Checklist): User can update their profile photo. New photo appears within 5 seconds. Old photo is deleted from CDN. File size is validated (max 5MB). Supported formats: JPG, PNG, WebP.

What Are the 7 Most Common Acceptance Criteria Mistakes?

The 7 acceptance criteria mistakes teams repeat: vague language, over-prescription, feature descriptions instead of behavior, no thresholds, hidden dependencies, untestable isolation, and estimation conflation.

We've reviewed thousands of backlog items, and the same mistakes appear again and again. Knowing them is half the battle.

First: criteria that are too vague. "The dashboard should load quickly" doesn't tell anyone when they're done. Second: criteria that are too prescriptive. "Use React hooks for state management" isn't a criterion—it's a technical decision that belongs in the description, not the acceptance criteria. You're defining what needs to happen, not how.

Third: criteria that describe the feature instead of the behavior. "A notification system" is not a criterion. "Users receive an email notification when someone comments on their post within 1 minute" is. Fourth: criteria with no acceptance threshold. "Reduce API latency" by how much? 5%? 50%? "Improve test coverage" to what percentage?

Fifth: criteria that depend on other incomplete stories. "Once the payment API is ready..." creates hidden blockers. Write criteria that stand alone. Sixth: criteria that are impossible to test without the full system. If your criteria require a production environment or manual verification every time, they're not testable—they're aspirational.

Seventh: criteria that conflate acceptance with estimation. "Complete in 3 days" is not a criterion. Neither is "Research React libraries." Those belong in the story description or as subtasks, not as criteria for done.

How Do You Know When Acceptance Criteria Are Ready for Sprint?

Criteria are ready when a QA engineer can test each one without clarification questions, and every criterion has a clear, unambiguous pass-or-fail result.

Before a story hits the sprint board, run it through this checklist. It takes 90 seconds and prevents hours of rework.

First, read each criterion aloud. If you stumble or feel the need to add explanation, it's not clear enough. Second, ask: "Could a QA engineer test this without asking me questions?" If the answer is no, it needs more specificity. Third, check: does this criterion describe behavior or implementation? If you see "use", "build", "create", or "implement", you've slipped into implementation details.

Fourth, verify that each criterion is independent. You shouldn't need to complete criterion #2 before testing criterion #1. Fifth, make sure there's a clear pass/fail. If you can't imagine a test result that definitively passes or fails the criterion, it's not ready. Sixth, confirm that all criteria together define "done". If you shipped a story that met all criteria but the feature still felt incomplete, your criteria were incomplete.

Finally, ask your team. The developers who'll build it and the QA who'll test it should be able to read the criteria and nod. If anyone looks confused, workshop it together before the sprint starts.

How Does AI-Powered Backlog Refinement Help?

AI-powered refinement tools apply consistent testability standards across every item, automatically flagging vague language and suggesting Given/When/Then breakdowns before sprint planning.

Writing good acceptance criteria is a skill, but it's also repetitive. You're applying the same patterns, asking the same questions, and catching the same mistakes over and over. That's where structured tools help.

Refine Backlog's AI-powered backlog refinement API transforms messy backlog items into structured, actionable work items with properly formatted acceptance criteria, estimates, priorities, and tags. Instead of spending refinement sessions debating whether criteria are testable enough, the API helps surface the patterns automatically—suggesting Given/When/Then breakdowns for complex behaviors, flagging vague language, and ensuring each criterion is independent and measurable.

The real win is consistency. When your backlog is refined with the same standards applied across every item, developers spend less time guessing and more time building. Rework drops. Velocity stabilizes. Teams actually enjoy sprint planning because the work is clear.

What's the Difference Between Good and Bad Acceptance Criteria in Practice?

Bad criteria are subjective and vague; good criteria specify exact behaviors, measurable thresholds, and edge cases so developers know precisely when they're done.

Let's make this concrete with a real example: a feature to add a "save for later" button to product listings.

Bad criteria: "Users can save products. Saved products appear in their profile. The feature should be fast and intuitive." This fails on multiple counts. It's vague (what does "appear" mean—instantly? in a list? sorted how?). It's subjective (fast and intuitive to whom?). It doesn't specify the interaction (click where? does it show confirmation?). It doesn't cover edge cases (what if they save the same product twice? what if they're not logged in?).

Good criteria: "User clicks heart icon on product card. Product is added to 'Saved' list within 1 second. Heart icon changes to filled state. User can navigate to 'Saved' section in their profile to view all saved products, sorted by most recently saved. Attempting to save a product already in 'Saved' shows a toast notification: 'Already saved.' Unauthenticated users see a login modal when clicking the heart icon." Each criterion is testable, specific, and covers the actual user interaction.

The difference isn't length—it's precision. Good criteria make the feature obvious. Bad criteria leave room for interpretation, which is where rework lives.

How Should Your Team Approach Acceptance Criteria in Refinement?

Co-create criteria in refinement: product defines the happy path, engineering challenges it with edge cases, and QA confirms each criterion can be tested independently.

Acceptance criteria aren't something the product manager writes and throws over the wall. They're a conversation between product, engineering, and QA. Here's how to structure it:

Start with the user story itself. What problem are we solving? Who's the user? What's the outcome they need? Then, product describes the happy path: the main scenario where everything works. Engineering challenges it: what about edge cases? What about error states? QA asks: how do we know this is done? What do we test?

This conversation often surfaces missing criteria. Maybe you thought the feature was simple, but engineering points out that it needs to handle offline scenarios. Maybe QA realizes you need criteria for different user roles. This is the refinement working as intended—catching gaps before the sprint starts.

If your team is distributed or async, document the criteria in a shared space and use comments to debate specifics. The goal is alignment, not perfection. If criteria are 80% clear and the team agrees on what they mean, you're good to go. You can refine further during the sprint if needed, but the big ambiguities should be resolved in refinement.

What's the Cost of Skipping Good Acceptance Criteria?

Poor acceptance criteria turn 2-day stories into 5-day stories—with 30% rework rate across 10 sprint stories, teams lose 450+ engineering days per year.

If you're tempted to rush acceptance criteria or skip refinement, consider the math. A two-day story that gets reworked becomes a five-day story. That's three extra days of engineering capacity per story. If you have 10 stories per sprint and 30% of them get reworked due to unclear criteria, you're losing 9 days of capacity per sprint. Over a year, that's 450+ lost days—nearly two full engineers.

Beyond capacity, unclear criteria erode team morale. Developers get frustrated building features twice. QA gets frustrated testing incomplete work. Product gets frustrated explaining what they meant. Everyone's slower, everyone's grumpier, and the culture shifts toward blame instead of collaboration.

Good acceptance criteria cost almost nothing upfront—maybe 15 minutes per story in refinement. The payoff is enormous: fewer surprises, faster delivery, happier teams. It's one of the highest-ROI practices in product development, and yet it's one of the most neglected.

Start refining smarter

Let AI handle the structure. You handle the strategy.

Try Refine Backlog Free