Of all the sections in a BRD, acceptance criteria is the one that causes the most rework. Not because it’s the most important section — functional requirements are — but because it’s the section most teams write last, write quickly, and write vaguely. And then spend the next three weeks in argument about what “done” actually means.

I’ve managed a pipeline of 140+ tracked initiatives across seven internal stakeholder groups. The projects that came back for rework — the ones that hit “delivered” and then immediately spawned a follow-on ticket for everything the delivery team thought was out of scope — almost always had the same problem: acceptance criteria that left too much room for interpretation. Not bad developers. Not even bad requirements. Just criteria that a reasonable person on either side of the delivery handoff could read differently.

This is the fix. It’s not complicated, but it requires a mindset shift: acceptance criteria aren’t a summary of the requirements. They’re a test. Every criterion should be a statement that can be evaluated as pass or fail on the day of delivery, by someone who wasn’t in the room when the BRD was written.

Why Vague Criteria Are a Structural Problem, Not a Writing Problem

When I see acceptance criteria that say things like “the dashboard should be user-friendly” or “the report should load quickly” or “data should be accurate,” the instinct is to flag them as bad writing. But they’re usually a symptom of something deeper: the BRD was written before the team actually agreed on what success looks like.

Vague criteria are what happen when the requirements conversation was skipped and the acceptance criteria section got filled in from memory. The stakeholder knows what they want. The writer knows what was discussed. But neither of them has made it explicit enough for a developer who joins the project in week three, or a QA reviewer who wasn’t in the intake meeting, to understand unambiguously.

The BRD-to-delivery pipeline I use treats the acceptance criteria sign-off as a formal gate — not a formality at the bottom of a document. If a stakeholder can’t confirm that each criterion is testable before the BRD moves to tech spec, it goes back for revision. That discipline is the single biggest factor in whether a project comes back for rework.

“Every acceptance criterion should pass one test: can someone who wasn’t in the room evaluate it as pass or fail on delivery day? If not, it’s not a criterion — it’s an aspiration.”

The Four Failure Modes

Acceptance criteria fail in predictable ways. Recognising the pattern is faster than editing criteria line by line.

Subjective language. Words like “intuitive,” “clear,” “fast,” “user-friendly,” and “accurate” are not acceptance criteria. They’re adjectives. They require someone to make a judgment call at delivery, and two people in the same room will make that call differently. Replace every adjective with a threshold, a number, or a behaviour.

Subjective language
The dashboard should load quickly and display accurate data.
The dashboard loads within 3 seconds on the standard internal network. Revenue figures match the Salesforce Closed Won total for the same date range within ±0.1%.

Scope conflation. Acceptance criteria that describe what the system does rather than how it will be verified. This is the most common failure mode for technical BRDs. The functional requirement describes the behaviour; the acceptance criterion describes how you’ll know the behaviour is correct.

Scope conflation
The system will automatically assign tickets to the correct queue based on category.
When a test batch of 50 tickets covering all 8 category types is processed, 47 or more (94%+) are assigned to the correct queue without manual intervention. Assignment logic is documented and reviewable in the admin panel.

Missing edge cases. Criteria that describe the happy path only. A dashboard that displays correctly with complete data but breaks when a field is null, or a report that filters correctly for standard users but not for admins, will pass incomplete criteria and fail in production. Good acceptance criteria anticipate the edge case the developer will argue is “out of scope” at delivery.

Untestable states. Criteria that require the reviewer to assess something they can’t observe on delivery day — future behaviour, performance under load that can’t be simulated in UAT, or integration with systems that aren’t available in the test environment. If you can’t test it at delivery, it needs a different mechanism (a post-launch monitoring plan, a separate performance test protocol) or it needs to be removed from the acceptance criteria entirely.

The Structure That Works

For every functional requirement in the BRD, I write acceptance criteria using a simple three-part structure. It’s not a formal methodology — it’s just the discipline that prevents the four failure modes above.

1
Given / When / Then
The classic behavioural format, adapted for ops BRDs. Given a specific starting state, when a specific action is taken, then a specific, measurable outcome occurs. This format forces you to define the starting state (which surfaces missing data assumptions), the trigger (which clarifies scope), and the outcome (which has to be testable). It works equally well for dashboard requirements, process changes, and system integrations.

2
Threshold before adjective
Every qualitative term gets replaced with a number, a percentage, or a defined behaviour. “Fast” becomes “under 3 seconds.” “Accurate” becomes “within ±0.5% of the source system total.” “Complete” becomes “all 12 required fields populated with no nulls.” If you can’t replace the adjective with a number, you haven’t agreed on what success looks like yet — and that conversation needs to happen before the BRD moves forward.

3
One explicit edge case per requirement
For each functional requirement, identify the most likely edge case and make it explicit in the acceptance criteria. Null values. Empty states. Permission levels. Date range boundaries. Concurrent users. The edge case you write into the criteria is the edge case the developer will test for. The one you leave out is the one that surfaces in UAT and becomes a scope argument.

The Sign-Off Test

Before any BRD moves from requirements to tech spec in my pipeline, I run each acceptance criterion through a three-question test with the stakeholder:

Can you evaluate this on delivery day without calling me? If the stakeholder needs to ask me what the criterion means when they’re doing UAT, it’s not clear enough. Acceptance criteria should be self-contained.

Is there any interpretation here that could lead to a disagreement? Read the criterion from the developer’s perspective. Is there a reading of it that technically passes but doesn’t deliver what the stakeholder actually wants? If yes, close the gap before build starts.

Does this cover the scenario where the data is missing or the edge case fires? The majority of UAT failures I’ve seen aren’t failures of the happy path. They’re failures in boundary conditions that were never written into the criteria.

This test adds maybe fifteen minutes to the BRD review meeting. It saves multiple rounds of rework after delivery. The maths are straightforward — which is why requirements management is consistently cited by PMI as one of the top drivers of project success or failure.

What Good Acceptance Criteria Actually Look Like

Here’s a before-and-after from a real BRD type: an operations dashboard showing ticket resolution metrics by team.

Dashboard acceptance criteria — before
The dashboard should display ticket resolution data accurately. Filters should work correctly. The data should refresh regularly.
Dashboard acceptance criteria — after
1. Given a user with Operations Manager permissions, when they open the dashboard, ticket counts by team match ConnectWise totals for the same date range within ±2 tickets (to account for in-flight tickets at query time).

2. When the Team filter is applied, only tickets assigned to the selected team appear. When no team is selected, all tickets appear. When a team with zero tickets is selected, the dashboard displays “No tickets in this period” rather than an error or blank state.

3. Dashboard data refreshes automatically every 4 hours. The last-refreshed timestamp is visible on the dashboard. If the refresh fails, a visible alert appears and the previous data remains displayed (does not show blank).

The second version took longer to write. It also produced zero UAT arguments, because there was nothing to argue about. Every state was defined.

When Stakeholders Push Back

The most common pushback I hear on rigorous acceptance criteria is that it slows down the BRD process. It does. That’s the point. Time spent making criteria precise before build is a fraction of the time spent resolving disagreements after delivery. The cost of a rework cycle in a BA team — back through tech spec, back through development, back through UAT — is measured in weeks, not hours.

If a stakeholder can’t define what “done” looks like in testable terms, that’s a signal that the requirements conversation isn’t finished yet. The acceptance criteria section is doing its job when it surfaces that gap — not when it glosses over it.

For teams running shared services delivery across multiple internal customers, the acceptance criteria framework also has a second benefit: it creates a shared language for what delivery means. When seven different stakeholder groups all understand that “accepted” means “passed against written criteria,” not “I looked at it and it seemed okay,” the entire pipeline gets more predictable. That predictability is what allows a shared services team to serve multiple business lines without constant scope disputes consuming the delivery calendar.