BA AI Collective
Menu

How to write acceptance criteria that testers and business owners agree on

Requirements table from the sample functional specification, showing requirement IDs with approval, priority and delivery status, statements, and acceptance criteria for REQ-001, REQ-009 and REQ-002
From the Starter toolkit: the sample functional specification, with acceptance criteria beside each requirement. The firm and names are fictional.

Most disputes at UAT are really disagreements about what "done" meant, and nobody wrote it down in a form both sides could check. Acceptance criteria are where that agreement lives. When they are vague, the tester reads one thing, the business owner expects another, and you spend the last week of the sprint refereeing.

This article shows what weak criteria look like, how to rewrite them, and where Given/When/Then helps and where it just adds length. The example is a fictional firm, Northgate Bank, and a story about handling payment instructions that arrive late.

Last reviewed: October 2026.

What acceptance criteria are for

They answer one question: how will we know this story is finished? Each criterion should be something a tester can check and a business owner can read without a translator. If either of them has to ask what a word means, the criterion is not finished.

They are not a design document, and they are not a list of everything the system does. They cover the behaviour that matters for this story.

Three weak criteria and why they fail

Take the story: "As an operations analyst, I want late payment instructions handled automatically, so that I do not release them by hand."

"The system handles late instructions correctly." Correctly according to whom? A tester cannot fail this, so it tests nothing.

"Late instructions are processed quickly." Quickly is a feeling. Ten seconds and ten minutes could both be quick, depending on who is asked.

"The system rejects invalid instructions." Invalid in which way? A missing field, a closed account, a breached limit? Each needs its own expected result.

The common fault is that each one hides a decision. Somebody has to say what "late" means, what "processed" means and what happens next. Your job is to drag those decisions into the open.

Want these as files? Starter has the requirements backlog, trace register and a full worked project in Word and Excel.

Starter, £30 (41 files, discovery to a tested set of requirements) · Complete, £80 (59 files, adds governance and assurance). Prices include UK VAT: Starter £25 + VAT, Complete £66.67 + VAT. Payhip may show the price before VAT. One payment, no subscription.

Sold by Quantum Sphere Consulting Limited; your statutory rights apply.

Rewriting them

Start by asking the owner the awkward questions. For Northgate the answers were: the cut-off for same-day payments is 15:30 on a business day; anything received after that goes into the next business day's batch; the sender gets a notification; nothing is rejected for lateness alone. Whether that is true for a real scheme is a matter for the real rulebook. Here it is the invented rule, and each answer has a source in the project register (S-014, the operations procedure).

Now the criteria become checkable:

  1. An instruction received at 15:30:00 or earlier on a business day is included in that day's batch.
  2. An instruction received after 15:30:00 is included in the next business day's batch.
  3. An instruction received after 15:30:00 on a Friday is included in the Monday batch, unless Monday is a bank holiday, in which case it goes into the next business day.
  4. The sender receives a "scheduled for next business day" notification within five minutes of receipt.
  5. An instruction is never rejected solely because it arrived after cut-off.

A tester can pass or fail each line. An owner can read each one and say yes or no.

When Given/When/Then helps

Given/When/Then is useful when the behaviour depends on a starting state. It is less useful for simple rules, where a plain sentence is shorter and clearer.

The format is: Given a starting condition, When something happens, Then an observable result. Here it is applied to the same story:

#GivenWhenThen
1The time is 15:29 on a business dayA valid instruction is receivedIt is placed in today's batch
2The time is 15:31 on a business dayA valid instruction is receivedIt is placed in the next business day's batch and the sender is notified
3The time is 16:00 on Friday and Monday is a bank holidayA valid instruction is receivedIt is placed in the Tuesday batch
4The time is 15:31An instruction with a closed debit account is receivedIt is rejected with reason code "account closed", not "late"
5The notification service is unavailableA late instruction is receivedThe instruction is still scheduled and the failed notification is logged for retry

Rows 3 to 5 are the ones a rushed team misses. Row 4 separates two failure reasons that are easy to confuse. Row 5 covers what happens when something around the story breaks.

A quick test for each criterion

Before you hand criteria over, check each one against these questions:

  • Can it fail? If every outcome passes, rewrite it.
  • Does it contain a number, a time, a state or a named message in place of an adjective?
  • Does it say who or what acts, in the present tense?
  • Is there one behaviour per line?
  • Could a tester run it without asking you what you meant?

Getting agreement, not just writing

The words matter less than who has read them. Sit with the tester and the owner together for twenty minutes and read the criteria aloud. The tester will say "how would I set that up?" and the owner will say "no, that is not what happens on a holiday". Both comments improve the criteria far more than another round of editing alone.

Record any change with the person who asked for it. If an owner adds a rule in the meeting, note it with their name and mark it proposed until they confirm it in writing.

Common mistakes

Writing the solution. "The batch job runs at 15:31" is a design choice. The criterion is about what the sender and operations see.

Leaving out the negative case. Every positive rule has a side where it does not apply. State it.

Too many criteria on one story. More than eight usually means two stories.

Copying criteria between stories. The same line in three places will drift. Link to one version.

Try it

Choose one story from your current backlog and mark every adjective in its criteria. Replace each with a value, a state or a message, and ask the owner to confirm the ones you had to guess.

The Starter toolkit includes a User Story and Acceptance Criteria Library with worked examples.

See the Starter toolkit

Spotted a mistake? Tell us

More guides

All guides →