Study Materials
Writing user stories & acceptance criteria
The craft behind the Delivery Backlog page — how to write a story that's actually ready to build, not just a sentence with 'As a user' at the front.
Structure: As a / I want / so that
As a [role]
Names a specific user or persona — not 'as a user,' which hides who actually benefits and why.
I want [capability]
States the capability itself, described from the user's point of view, not the system's.
so that [benefit]
The reason this matters — the part most often dropped, and the part that lets anyone question whether the story is worth building at all.
INVEST — what makes a story ready
Independent
Can be built and delivered without waiting on another unfinished story.
Negotiable
A statement of intent, not a locked spec — the how is worked out with engineering.
Valuable
Delivers something a real user or the business actually cares about, on its own.
Estimable
The team has enough clarity to size it — if they can't estimate it, it's not ready.
Small
Fits in a single sprint / iteration — if it doesn't, split it.
Testable
Has acceptance criteria specific enough that everyone agrees when it's done.
Weak vs. strong — a worked example
A treasury transfer story
“As a user, I want to transfer money so that I can move funds.”
- "A user" — which user? A treasury manager, an approver, an auditor?
- "Transfer money" — between what? Any two accounts, or only approved entities?
- "So that I can move funds" restates the want — it isn't a real reason.
- No acceptance criteria at all — impossible to know when it's actually done.
“As a corporate treasury manager, I want to transfer tokenised USD deposits between approved group entities so that I can move liquidity outside traditional cut-off times.”
Acceptance criteria
- Only authorised users can initiate transfers
- Beneficiary must be an approved entity
- Sanctions and entitlement checks must complete before settlement
- Transfer is either atomically settled or fully rejected
- Receipt includes timestamp, unique transaction ID and audit events
- Balances and reports update after settlement
This exact story (DST-202) appears in full on the Delivery Backlog page, alongside 23 others written the same way.
Two acceptance-criteria formats
Given / When / Then (Gherkin)
Best for a story with clear triggers and branching outcomes — especially anything with a pass/fail or success/exception path.
Given a transfer has been initiated and screening is pending When the sanctions screening returns a true match Then the transfer is blocked and a compliance case is raised
Plain checklist
Best for a story that's a flat list of independent conditions, none of which depend on a specific trigger sequence.
- Statement covers a selectable date range and entity - Export available in a standard machine-readable format - Statement totals match platform ledger balances
Common mistakes
Writing acceptance criteria that describe implementation, not outcome
"Uses a Redis cache for the balance lookup" tells the team how, not what to verify — acceptance criteria should survive a completely different implementation.
A story too big to estimate confidently
If the team's estimate ranges from 3 points to 20 depending on who's asked, the story is actually several stories wearing a trench coat — split it.
Acceptance criteria that aren't actually testable
"The system should be fast" isn't testable. "Settlement completes in under 60 seconds" is.
Losing the 'so that' clause
Without it, nobody reviewing the backlog later can tell whether the story is still worth building, or was solving a problem that no longer exists.
Confusing a story with a task
"Update the database schema" is a task, not a story — it has no user-visible value on its own. It probably belongs inside a story as a hidden implementation step, not as its own backlog item.