Blog
Requirements Traceability Matrix (RTM): A Practical QA Guide
A working guide to the requirements traceability matrix—columns that matter, a filled example, linking stories to acceptance criteria to cases to results, and how RTMs fail.
- traceability
- test-cases
- qa
- test-strategy
A requirements traceability matrix is a table that connects what was asked for to what was tested and what happened. That is the whole idea. Every notorious RTM horror story — the 400-row spreadsheet nobody has opened since the audit, the document maintained by one person who has since left — comes from forgetting that the matrix is a query tool, not a deliverable.
The question an RTM exists to answer is uncomfortably simple: for this requirement, which cases cover it, and did they pass in the build we shipped? If your team can answer that in under a minute without a meeting, you have working traceability, whatever the artifact looks like. If you cannot, no amount of column formatting will save you.
This guide covers what an RTM actually contains, a filled example you can copy, how the chain from story to acceptance criteria to case to result is built, and the specific ways RTMs decay. If you are still standardising the cases that feed the matrix, start with how to write QA test cases and the field layout in the QA test case template.
What an RTM is (and what it is not)
An RTM is a mapping. In its minimal useful form it links three things: a requirement, the test cases that verify it, and the execution result of those cases in a named build.
It is not a test plan (which describes strategy, scope, and environments), a coverage report (which measures code, not intent), or a project tracker. It is also not a substitute for good acceptance criteria — an RTM built on vague requirements just traces vagueness with more precision.
Teams typically build one for three reasons:
- Coverage gaps. Sorting by requirement immediately exposes anything with zero linked cases.
- Impact analysis. When a requirement changes, you can see which cases need revisiting rather than guessing.
- Evidence. Regulated products need to demonstrate that each requirement was verified, by whom, in which build.
The third reason drives most formal adoption, but the first two are what make an RTM worth maintaining even when nobody is auditing you.
Forward, backward, and bidirectional traceability
| Direction | Question answered | Catches |
|---|---|---|
| Forward (requirement to case) | Is every requirement covered by at least one case? | Untested requirements |
| Backward (case to requirement) | Why does this case exist? | Orphan cases testing nothing anyone asked for |
| Bidirectional | Both | Both, and it is what auditors expect |
Backward traceability is the direction teams skip, and it is the one that keeps suites from bloating. A case that cannot name the requirement it verifies is either testing an undocumented behaviour (worth documenting) or protecting nothing (worth deleting). That second category is where a surprising share of slow, flaky legacy tests live.
Columns that earn their place
Start narrow. Every column you add is a column somebody must maintain in a hurry on release day.
| Column | Required? | Purpose |
|---|---|---|
| Requirement ID | Yes | Stable key from your backlog (PROJ-884) |
| Requirement or AC summary | Yes | One line, enough to recognise without opening the ticket |
| Acceptance criterion ID | Recommended | Splits multi-criterion stories so gaps are visible per criterion |
| Test case IDs | Yes | One or many, comma separated |
| Case type | Recommended | Positive / Negative / Edge / Regression, to expose lopsided coverage |
| Priority | Recommended | Lets you read the matrix under time pressure |
| Execution status | Yes | Pass / Fail / Blocked / Not run, per build |
| Build or release | Yes | Results without a build reference are not evidence |
| Defect IDs | Recommended | Links failures to their tickets |
| Owner | Optional | Who answers questions about this row |
| Evidence link | Regulated only | Report, trace, or screenshot location |
Two columns are worth defending against pressure to drop them. Build or release turns "it passed" into "it passed in 2026.08.3," which is the difference between an anecdote and evidence. And case type is the cheapest possible gap detector: a requirement with four positive cases and zero negative ones is visibly under-tested at a glance, without anyone reading a single case body.
Resist adding effort estimates, sprint numbers, or automation framework details. Those belong in the tracker and the repository respectively; duplicating them into the matrix creates two versions of the truth that drift within a sprint.
Example matrix: checkout discount codes
Here is a filled RTM for one story with three acceptance criteria. This is roughly the density that stays maintainable.
| Req ID | AC | Summary | Case IDs | Type | Pri | Status | Build | Defect |
|---|---|---|---|---|---|---|---|---|
PROJ-884 | AC-1 | Valid code reduces order total after tax | CHK-101 | Positive | P1 | Pass | 2026.08.3 | — |
PROJ-884 | AC-1 | Valid code reduces order total after tax | CHK-102 | Edge | P2 | Pass | 2026.08.3 | — |
PROJ-884 | AC-2 | Expired code is rejected with a recoverable message | CHK-110 | Negative | P1 | Fail | 2026.08.3 | BUG-2291 |
PROJ-884 | AC-2 | Expired code is rejected with a recoverable message | CHK-111 | Negative | P2 | Pass | 2026.08.3 | — |
PROJ-884 | AC-3 | Only one code applies per order | CHK-120 | Negative | P1 | Blocked | 2026.08.3 | BUG-2288 |
PROJ-884 | AC-3 | Only one code applies per order | — | — | — | Not covered | — | — |
PROJ-885 | AC-1 | Discount appears as a separate invoice line | INV-044 | Positive | P2 | Pass | 2026.08.3 | — |
Read that table as a QA lead five minutes before a release call and three facts jump out. AC-2 has a failing P1 case with a linked defect, so the story is not done. AC-3 has one blocked case and one row with no coverage at all, which is the most dangerous line in the matrix because it looks like an oversight rather than a decision. And PROJ-885 is fully covered but only by a positive case, so nobody has checked what the invoice line does when the discount is later refunded.
That "not covered" row is a deliberate convention worth adopting: record known gaps as rows rather than omitting them. An RTM that only lists what exists cannot show you what does not, which defeats half its purpose.
Building the chain: story to AC to case to result
1. Insist on atomic acceptance criteria
One criterion, one verifiable behaviour. A criterion reading "the discount system works correctly" cannot be traced because it cannot be falsified. Splitting criteria at authoring time is the highest-leverage traceability work available, and it happens before QA writes anything. For patterns that hold up under tracing, see acceptance criteria examples; story-intake mechanics are in from Jira story to QA workflow.
2. Give every criterion an ID
AC-1, AC-2, AC-3 inside the story is enough. Without criterion-level IDs, coverage gets recorded at story level, and a story with five criteria and two covered criteria shows up as "covered." This single habit prevents the most common form of false coverage.
3. Write cases that reference the criterion
Put the requirement and criterion ID in the case's module or story field. This is what makes backward traceability free instead of an archaeology project later.
4. Cover each criterion across types, not just count
One positive case per criterion is the floor, not the goal. Ask which criteria warrant refusal cases (see negative test cases) and which have meaningful boundaries (see edge case testing). Depth guidance is in Basic, Standard, or Deep coverage.
5. Record results against a build
Execution status without a build reference decays into folklore within two sprints. Capture the build or release tag in the same row.
6. Link defects, do not summarise them
One defect ID beats a paragraph of description. The ticket is the source of truth for status; the matrix only needs the pointer.
7. Review the matrix at the release gate
Sort by status, then by priority. Any failing or uncovered P0 or P1 row is a release conversation. Priority mechanics are covered in test case priority, and suite-level selection in regression test cases.
When an RTM is worth the effort
Traceability is a spectrum, and full matrices are not always the right point on it.
| Context | Recommended approach |
|---|---|
| Regulated product (medical, financial, safety) | Full bidirectional RTM with evidence links; non-negotiable |
| Enterprise with formal UAT and sign-off gates | RTM per release, focused on P0 and P1 requirements |
| Growth-stage SaaS | Lightweight per-epic matrix for high-risk work only |
| Fast-moving startup, low-risk product | Case fields referencing story and AC IDs, with a generated view on demand |
| Legacy system under active refactor | RTM for the areas being changed; do not retrofit the whole system |
The lightweight approach in row four deserves emphasis, because it is where most teams should start. If every case already carries a requirement ID and criterion ID in a structured field, the matrix is a filtered view of data you already have rather than a document someone maintains. That is the difference between traceability as a property of your suite and traceability as a chore.
Common failure modes
- The parallel spreadsheet. An RTM maintained separately from the cases themselves diverges immediately. Keep IDs on the cases and generate the view; never retype what already exists.
- Story-level coverage claims. Recording coverage against a story with five criteria hides gaps in four of them. Trace at criterion level or accept that "covered" means very little.
- Results without a build. "Pass" with no release tag is not evidence, and it is worthless during an incident post-mortem three months later.
- Omitting gaps. If uncovered criteria are simply absent from the matrix, the artifact structurally cannot show risk. Add "not covered" rows.
- One-person ownership. A matrix maintained by exactly one person is a bus-factor-one dependency on your release evidence.
- Retrofitting an entire legacy suite at once. These projects stall around 30 percent and are quietly abandoned. Trace forward on new work and backfill on touch.
- Column sprawl. Twenty columns, six maintained. The empty ones teach everyone that the matrix is ceremonial, which then becomes true.
- Tracing implementation instead of intent. Rows pointing at pull requests rather than requirements answer a question nobody asked. The RTM's job is intent to verification.
Best practices
- Make the case the source of truth. Requirement and criterion IDs live on the case; the matrix is a projection.
- Trace at acceptance criterion level, always. Story level is where false coverage hides.
- Record gaps explicitly as rows with a status of "not covered" and, where possible, a reason.
- Keep the column set minimal and defend it. Add columns only when someone can name the question it answers.
- Regenerate per release rather than maintaining one eternal document that accumulates stale results.
- Review it at the gate, not after. An RTM read after shipping is a report; read before shipping it is a decision tool.
- Automate the join as soon as it hurts. If your tooling can map case IDs to story keys and pull execution status, the matrix should be a query.
- Keep evidence links stable. Report URLs that expire make regulated rows useless within a quarter.
Final checklist
- Every acceptance criterion has a unique ID within its story
- Every test case records its requirement and criterion ID in a structured field
- Coverage is traced at criterion level, not story level
- The matrix includes rows for known uncovered criteria
- Execution status is always paired with a build or release tag
- Failures link to defect IDs rather than prose summaries
- Case type is recorded so lopsided coverage is visible at a glance
- Both directions work: requirement to case, and case to requirement
- The matrix is generated or regenerated per release, not hand-maintained forever
- Ownership is shared and documented, not resting on one person
Summary
A requirements traceability matrix links requirements to the cases that verify them and the results of those cases in a specific build. Keep the columns few, trace at acceptance criterion level rather than story level, and record known gaps as explicit rows so the artifact can show risk instead of only showing work. Make the individual test cases the source of truth by putting requirement and criterion IDs on them, then treat the matrix as a generated view. Read it before the release gate, sorted by status and priority. Done this way, an RTM stops being an audit chore and becomes the fastest way to answer whether a requirement is actually verified.
FAQ
Do agile teams need an RTM?
Agile teams need traceability; they rarely need a hand-maintained document. If cases reference story and criterion IDs, you can generate a matrix when someone asks. Regulated agile teams still need the formal artifact per release.
How is an RTM different from a test plan?
A test plan describes strategy, scope, environments, and risks in prose. An RTM is a table mapping requirements to cases to results. The plan explains the approach; the matrix proves the coverage.
Can one test case cover multiple requirements?
Yes, and it is common for shared platform behaviour. List all applicable requirement IDs. Be cautious, though: a case covering six requirements is often a mega-case that should be split so failures point somewhere specific.
What tools should we use?
Whatever already holds your case IDs. Test management tools with requirement linking generate the view directly; a spreadsheet is fine for a small team. The tool matters far less than whether the IDs live on the cases.
How do we handle requirements that change mid-sprint?
Version the criterion rather than editing it silently. Mark affected cases for review, and keep the old row with its build reference intact — that history is exactly what an RTM is for.
What about non-functional requirements?
Trace them the same way. Performance, accessibility, and security requirements get criterion IDs and linked cases like anything else. They are usually the first rows to end up "not covered," which is precisely why they belong in the matrix.
CTA — build traceability in at case-writing time
Traceability is cheap when IDs are captured as cases are written and expensive when reconstructed later. Use QA Workflow Assistant to generate cases directly from story acceptance criteria so each case carries its requirement and criterion reference from the start, leaving the matrix as a view you filter rather than a document you maintain. Plan options are on Pricing; integration and export details are in Docs.
Related articles
Test Case Priority: How QA Teams Rank What to Run First
A practical guide to test case priority—P0 to P3 schemes, risk-based ranking, worked examples for auth and billing, and how priority drives regression selection.
August 14, 2026 · 14 min read
Smoke Testing vs Sanity Testing: A Practical QA Guide
Smoke testing vs sanity testing explained for working QA teams—scope, timing, CI/CD gating, example suites, and how both relate to regression.
August 13, 2026 · 13 min read
Acceptance Criteria Examples for QA and Product Teams
Acceptance criteria examples that survive refinement: good versus bad wording, rule-based and scenario formats, and how to convert criteria into test cases.
August 12, 2026 · 12 min read