The PRD that survives contact with engineering
One page. Four sections engineers actually read before they start arguing about scope.
Before a build starts, when more than one person has to build it and nobody agrees yet what done means.
- 1
Problem, in one paragraph, with a number
Grounds the document in evidence so engineering checks your data instead of trusting your judgement.
What it asksWhat is broken, for whom, and how do you know? Use one real number.
Filled in38 percent of new Sona users abandon the linked-bank step before finishing, per Ana's funnel report for August. Priya's team has 61 support tickets this month with the same phrase: "it says my bank isn't supported but it is." Both point at the same failure: our bank search returns no results for correctly spelled banks that just aren't in the top 50 by user count.
How it goes wrongWriting the problem as the solution in disguise, for example "we need a redesigned bank search." That forecloses the actual best fix, which might be adding banks to the index rather than touching the UI at all.
- 2
What we are building, and what we are not
Sets the smallest version that solves the problem, and rules out the ideas that will otherwise attach themselves to it mid-sprint.
What it asksDescribe the smallest version that solves the problem, then list what's explicitly out of scope.
Filled inWe add fuzzy matching to bank search, so "chase" also matches JPMorgan Chase and typos within two characters resolve. Out of scope: adding new banks to the index (a data problem, already Ana's ticket) and redesigning the results page.
How it goes wrongLeaving the non-goals section empty. Every adjacent idea then becomes "well, while we're in there," and the two week build becomes six.
- 3
Acceptance criteria, each one somebody could fail
Turns the feature into conditions a tester can actually check, instead of a feeling everyone privately defines differently.
What it asksList the conditions that must be true before this ships, written so a tester could fail each one.
Filled in1. Typing "chase" or "chace" returns JPMorgan Chase in the top 3 results. 2. Searching a bank not in our index returns "we don't support this bank yet," never a blank list. 3. Search returns in under 400ms at the 95th percentile, measured against last week's volume.
How it goes wrongWriting criteria nobody could ever fail, like "search should feel fast and intuitive." Ask what would prove that wrong. If there's no answer, it's a mood, not a criterion, and it's exactly what a model asked to draft acceptance criteria tends to produce.
- 4
Rollout and the way it fails
Plans for the version of this that goes wrong, before launch day turns into the first time anyone thought about it.
What it asksHow does this reach users, and what's the plan if it's wrong?
Filled inShip behind a flag to 10 percent of new signups for 3 days. Watch the abandon rate at the linked-bank step. If it doesn't move, the fuzzy match isn't the fix, and we pull the flag instead of pushing to 100. Dev owns the flag, Ana owns the dashboard.
How it goes wrongNo rollback plan, so the first sign of trouble becomes a war room instead of a flag flip.
Take the whole thing
# [Feature name]: PRD ## Problem What is broken, for whom, and how do you know? (One paragraph. Use a real number: a metric, a ticket count, a quote.) ## Solution What is the smallest version that solves the problem? ## Non-goals What are we explicitly NOT building in this pass? ## Acceptance criteria Numbered. Each one must be something a tester could fail. 1. 2. 3. ## Rollout and risk How does this reach users? Flag, percentage, duration? What's the rollback plan if we're wrong? Who owns pulling it? Owner: Target date:
The signal log
One row per quote. A structured way to hold raw feedback without losing the exact words.
The opportunity tree, on one page
Outcome, opportunity, solution, experiment. The map from what you're chasing down to what you're testing this week.
The experiment brief
The hypothesis, the metric, the sample, and the rule for stopping, all written before the test runs, not after.