Proving What You Tested When a Client Asks

How to prove what a penetration test covered: coverage evidence at the right level of detail, recorded during the work rather than afterwards, and used well.

To prove what you tested, keep a coverage list for each phase, written during the work rather than afterwards, at a level of detail between "we tested the application" and "we sent this request", and put it in the report. From the client’s side, a thorough test that found nothing and a superficial test that missed everything produce the same artefact, a report with no critical findings, and only the coverage record tells them apart.

That question is being asked more often, and not by the technical contact. It comes from procurement, from auditors, and increasingly from a client’s own customers, who want to know that the assessment behind an attestation was more than a vulnerability scan.

Why "we follow the standard" is not an answer

Naming a methodology tells a reviewer what you intended to do. It does not tell them what happened on this engagement, on those dates, against that application. Two firms can name the same standard and deliver work that differs by a factor of five in depth.

The gap matters most exactly when there is nothing to show for the work. A report full of critical findings speaks for itself. A clean report is the one that needs evidence of coverage, and it is the one where firms most often have none.

The better your testing, the more likely you are to need proof of it. Findings are their own evidence. An absence of findings is only credible if you can say what was tried.

What coverage evidence actually looks like

It is narrower than people fear. Nobody wants a transcript. What a reviewer wants is a list of the things that should have been checked and confirmation that they were, at a level of granularity somewhere between "we tested the application" and "we sent this specific request".

Too vagueAbout rightToo granular
Authentication was testedPassword policy, lockout behaviour, session fixation, second-factor bypass and reset flows were each exercisedEvery individual request sent against the login endpoint
Access control was reviewedHorizontal and vertical checks across the four defined roles, on all administrative functionsA matrix of every endpoint against every role
The infrastructure was assessedService enumeration, version identification, default credential checks and patch-level review on all in-scope hostsRaw tool output

Making it a by-product rather than paperwork

The reason coverage tracking fails is always the same: it is done afterwards. A tester who has finished the work and is asked to fill in a coverage document will produce something accurate in outline and invented in detail, because they are reconstructing rather than recording.

It only works when ticking is part of doing. Which means the list has to be in front of the tester during the engagement, attached to the phase they are working on, short enough to be read, and specific enough to be worth reading.

  1. Write the list per assessment type, not per engagement. A web application checklist, an internal infrastructure checklist. Reused, so improving one improves every future engagement; a web application penetration testing checklist is a reasonable starting point to adapt.
  2. Keep it to what must be covered. Twenty meaningful items beat two hundred that get ticked in a block at the end.
  3. Separate the how from the what. A checklist says what must be covered. A runbook says how your firm does a particular procedure. Conflating them makes both unusable.
  4. Attach it to the phase. An internal phase and a web phase carry different lists, and a multi-phase engagement should show coverage per phase.
  5. Review it at handover, not at delivery. An unticked item found during review is still testable. Found at delivery, it is an awkward conversation, and the same list is what makes handing over a penetration test mid-engagement cost an hour rather than a day.

A coverage list written during the work is evidence. The same list written afterwards is a memory with ticks on it.

Answering the question months later

The question rarely arrives during the engagement. It arrives six months on, from somebody who was not involved, usually after something has happened: "did your test cover the export function?" How you answer that is a test of the record, not of your memory.

Look it up rather than recall it. Then answer in one of three ways, and only three. Tested, with the date and the phase, and what was tried. Not tested, and why: out of scope, not reached in the time available, blocked by access. Or in scope but not on the list, which is the honest answer when it is the true one, and a prompt to fix the list. What you never do is reconstruct coverage from memory, or imply an area was exercised because the report says nothing about it. A precise "not tested, because" protects the client's decisions and your firm's credibility; a vague reassurance protects neither, and unravels at exactly the moment it is relied on.

What to do with it commercially

Most firms treat coverage as a defensive artefact, produced when challenged. The firms that do best with it treat it as part of the deliverable.

  • Show it in the report. An appendix listing what was covered turns a clean result from an anticlimax into a demonstration.
  • Show it during the engagement. A client watching coverage progress is a client who can see they are getting what they paid for.
  • Use it in scoping. Handing a prospect the list of what a phase covers is a far better answer to "what do we get" than a day count.
  • Use it in review. Coverage gaps found at review are the cheapest defects your QA process will ever catch.

The uncomfortable fact at the top does not go away. The best you can do is make the difference visible, which happens to be the same thing as making it easier to do the work well.

Each phase of an engagement carries its own checklists, and the library holds one checklist per kind of phase: web application testing mapped to the OWASP WSTG, internal infrastructure including Active Directory, external infrastructure, cloud configuration review, mobile mapped to OWASP MASVS, and wireless. The matching checklist is suggested on each phase and can be made visible to the client, which turns "what did you actually check" into something you can point at. Checklists import and export as Excel, Word or JSON. See how checklists and phases work.

Common Questions

How do you prove what a penetration test covered?
Keep a coverage list for each phase, written while the work happens rather than reconstructed afterwards, that names what was exercised at a useful level: "password policy, lockout, session fixation, second-factor bypass and reset flows were each exercised" rather than "authentication was tested". Put it in the report as an appendix, so a clean result reads as a demonstration rather than an absence.
Why does a clean pentest report need coverage evidence?
Because from the client's side a thorough test that found nothing and a superficial one that missed everything produce the same artefact. Findings are their own evidence; an absence of findings is only credible if you can show what was tried. Procurement teams, auditors and the client's own customers increasingly ask, and a methodology name alone does not answer them.
What is the difference between a checklist and a runbook?
A checklist says what must be covered on a kind of phase, such as the areas of a web application test. A runbook says how your firm carries out a particular procedure, step by step. Keeping them separate makes both usable: the checklist becomes coverage evidence, and the runbook becomes the way a new tester learns your method.
What should a tester say if asked about something they did not test?
Say so plainly, with the reason: out of scope, not reached in the time available, or blocked by access. Never reconstruct coverage from memory or imply an area was exercised because nothing was found there. A precise "not tested, because" protects the client's decisions and your firm's credibility far better than a vague reassurance that unravels later.

Keep Reading

Setup guide

See the product set up, end to end

The whole setup in 10:01, with chapters you can jump to: registering, your own domain, your own database in any of three places, your own mail server, branding, the first sign-in, updating the database on Supabase Cloud, and moving the database if you change your mind.

  • 0:00 · Registering, signing in, and the free trial
  • 0:44 · Your name and your firm’s name
  • 0:50 · Custom domain
  • +6 more