River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Product Requirements Document Template

Every PRD template gives you an outline. This one gives you a requirement register where priority means something and every line names its evidence.

Free download  ·  No account needed

A PRD outline is easy to fill in and easy to argue with later. The arguments always land in the same three places. Nobody can tell which requirements are genuinely required, because P0 and P1 have no agreed meaning and everything becomes P0 by week three. Nobody can tell which requirements came from evidence and which came from a preference somebody held strongly in a meeting. And the questions that were still open at review get discovered again, halfway through the sprint, by an engineer.

This pack replaces the outline with a register. Priority uses the requirement keywords from RFC 2119, so MUST is an absolute requirement and SHOULD grants latitude that has to be weighed rather than assumed. Every row carries an acceptance criterion written as something observable, not as "works correctly". Every row cites the Evidence Map entry that justified it, and the space rule forbids filling that cell when nothing exists to point at, so a preference stays visible as a preference.

The unresolved parts get the same treatment. Open Questions carries every unanswered question with an owner, a needed-by date, and the requirements it blocks, so a question blocking a MUST means the spec is not ready for review rather than meaning nothing. The Decision Log records every answer that changed the spec, which is what stops a requirement looking arbitrary six months later when the person who decided it has moved teams.

A register engineering can build from, and the questions that say it is not ready yet

Every evidence reference resolves in both directions. R-07 cites nothing, because nothing justifies it.

Requirement Register

Illustrative rows for a fictional collaboration tool, Halden, shipping guest access.

IDRequirementKeywordAcceptance criteriaEvidenceStatus
R-01A guest reads a shared board with no accountMUSTUnauthenticated session renders the board read-only. No signup screen appears at any point.EV-01, EV-02Specified
R-02A share link expiresMUSTA 30 day link returns the expired state on day 31 and does not render content.EV-05Specified
R-04A share link is not guessable or enumerableMUST NOTTokens carry 128+ bits of entropy from a CSPRNG. Sequential creation reveals no relationship.EV-05Blocked Q-03
R-05Admins are notified on a guest's first openSHOULDOne notification per link on first render. Subsequent opens do not notify.EV-05Specified
R-06A guest comments without an accountSHOULDComment appears attributed to a name supplied at comment time.EV-01Blocked Q-01
R-07A guest reacts to comments with emojiMAYA guest adds and removes a reaction.noneSpecified
R-08Guests do not consume a seatMUSTA workspace at its seat limit shares successfully. Invoice and seat count unchanged.EV-02, EV-03, EV-04Specified

SHOULD is the keyword that earns its keep: it tells an engineer they have real latitude, and obliges them to weigh the implications before taking it. R-07 is a MAY citing no evidence, which is how a preference stays honest instead of acquiring a plausible reason.

Evidence Map

What the team actually knows, rated honestly.

IDSourceWhat it showsStrengthJustifies
EV-01Support tag, full year214 tickets asking how to show a board to someone outside the workspaceStrongR-01, R-06
EV-02Churn interviews, n=229 named the inability to share with clients; 4 had already moved that work elsewhereStrongR-01, R-08
EV-03Membership analytics38% of paid workspaces contain an external-domain member, which is clients on paid seatsStrongR-08
EV-04Deal desk log3 lost deals name guest access in the loss reasonModerateR-08
EV-05Two enterprise security reviewsBoth require expiry, admin revocation and non-enumerable linksStrongR-02, R-03, R-04, R-05, R-09
EV-06Competitor teardownThree comparable tools ship guest access, two of them freeWeaknothing

EV-06 deliberately justifies no requirement. Market precedent is context, and a MUST resting on what competitors do is a MUST with no reason of its own.

Open Questions

Every unanswered question with an owner, a date, and what it blocks.

IDQuestionOwnerNeeded byBlocksStatus
Q-01Does an unauthenticated guest comment satisfy our SOC 2 commitments on attributable actions?Security lead6 Feba SHOULDOpen
Q-02What is the default expiry window for a share link?Product30 Jana MUSTAnswered
Q-03Do guests appear in the audit log as a distinct principal, or as the link's creator?Platform lead3 Febtwo MUSTsOpen
Q-04Can one link grant access to more than one board?Product20 FebnothingOpen
Q-05Does the first-open notification go to all admins or the link creator?Product13 Feba SHOULDAnswered

Q-03 is the one that matters: it blocks two MUSTs, so this spec is not ready for review no matter how complete the register looks. That is the sentence the pack exists to produce before the sprint starts rather than during it.

What you get

01

Requirement Register

One row per requirement with a keyword that has a published definition, an acceptance criterion written as an observable outcome, the evidence behind it, and whichever open question is blocking it.

02

Evidence Map

What you actually know, one row per source, with the number in it and a strength rating. Ticket volumes, analytics figures, interview counts, security reviews. Evidence that ends up justifying nothing stays in the sheet saying so.

03

Requirement Language

The vocabulary, defined once. What MUST commits you to at ship time, how much latitude SHOULD really grants, and why the keywords are uppercase. Rename it to your team's own words in the first session, or read what belongs in a PRD first.

04

Open Questions

Every unanswered question with an owner, a needed-by date, and the requirements it blocks. A question blocking a MUST is reported as making the spec unready, rather than sitting in a bullet list nobody reads.

05

Decision Log

Every answer that changed the spec, with who decided and which requirements moved. This is what a requirement that looks arbitrary next quarter points at.

06

Non-Goals that hold

A guide and a prompt for the section most templates fill with things nobody was going to build. Each non-goal gets a reason and the trigger that would reverse it.

How it works

  1. 1

    Send what you know

    Research findings, support tickets, analytics, churn interviews, the constraints engineering flagged, a half-written doc. River fills the Evidence Map before writing a single requirement.

  2. 2

    Get the register

    Every requirement gets a keyword, a testable acceptance criterion and its evidence cited both ways. Anything that cannot be resolved becomes an open question with an owner instead of a guess.

  3. 3

    Find the non-goals

    River proposes the things a reader would assume are included and are not, each with a reason and the trigger that would change it.

  4. 4

    Audit before review

    The spec check reports unevidenced MUSTs, untestable criteria, one-way evidence links and any question blocking a MUST, then gives you a verdict.

Frequently asked questions

Why MUST and SHOULD instead of P0, P1 and P2?

Because the numbered labels have no published definition, so they mean different things in different teams and collapse into all-P0 under pressure. RFC 2119 defines MUST as "an absolute requirement" and SHOULD as meaning "valid reasons in particular circumstances" may justify ignoring it, provided the implications are weighed first. That tells an engineer their latitude.

Why are the keywords always uppercase?

Because only uppercase carries the defined meaning. RFC 8174 updates RFC 2119 specifically to clarify that point. It matters practically: a PRD is full of ordinary sentences containing the word should, and a reader has to be able to tell a requirement from a sentence without guessing.

How is this different from your PRD writing tool?

The PRD tool writes a document from a brief in one pass. This is a working space with four linked sheets that stays alive through build, tracking evidence and decisions. Use the tool for a first draft, this pack once the spec has to survive a sprint. The user story writer turns it into stories; the non-functional requirements template catches what a story never shows.

What counts as a testable acceptance criterion?

Something a person or a test can observe. "Returns the expired state on day 31 and does not render content" is testable; "link expiry works correctly" is not. If your team writes them as scenarios, the Gherkin reference is a good structure to borrow. Where none can be written, the cell stays blank and the check reports it.

What if a requirement has no evidence?

It ships with an empty evidence cell and River tells you which ones they are. The space rule forbids inventing a justification. Unevidenced requirements are legitimate, since a product lead's judgement is often right and undocumented, but the register makes them visible so nobody mistakes a preference for a finding.

Does this decide what to build?

No. This space assumes the bet is made and answers whether the spec can be built from. Sequencing initiatives and checking a quarter against real delivery capacity is a different job, handled by the roadmap pack. Requirements here read effort estimates from your team rather than producing them.

Can I keep my own priority labels?

Yes. The first prompt asks, and if your labels have written definitions somewhere it keeps them and rewrites the vocabulary doc around them. The failure this space cares about is not the wrong words, it is words with no agreed meaning. The guide to writing a PRD covers the wider document if you want the reasoning first.

Write the spec that survives the sprint

Send your research, tickets and constraints. River builds the register, cites the evidence, and tells you which questions make it unready.

Write my spec