The Pre-Report Checklist: 12 Things to Verify Before Submitting a Bug
September 18, 2026

The Pre-Report Checklist: 12 Things to Verify Before Submitting a Bug

Two researchers find the same IDOR on the same afternoon. One report gets triaged and paid inside a day. The other comes back as Duplicate, Informative, or Needs More Info, and its author spends a week arguing in the comments. The bug was identical. The submission wasn't.

Most rejections have little to do with the quality of the finding. They come from things that were easy to check and never got checked: a subdomain that sat outside scope, a proof of concept that only worked because of a proxy rule, an issue disclosed three months earlier by someone faster. What follows is the verification pass worth running before every submit, whether it's your first report or your five-hundredth.

Start With Scope and Policy

Open the program page and read it again. Not from memory — scope changes, and programs quietly remove assets, add wildcards, or move a service to a third-party host that no longer qualifies. Check the exact asset you tested against the exact text: *.example.com is not the same as example.com, and a marketing page on a separate domain is usually out of scope even when it looks like part of the product.

Then re-read the testing rules. Many programs restrict you to accounts you own, forbid bulk data access, and ask you to stop the moment you reach another user's data. Proving an authorization flaw by opening a single record is normally fine; pulling a thousand rows to build a chart is not, and it can turn a valid bug into a violation. Note the disclosure terms too. If the program requires coordinated disclosure, your blog post is part of the risk calculation.

Reproduce It Like a Skeptic

Your first successful exploit is the least trustworthy one. You were running extensions, a proxy with match-and-replace rules, and a session that has been alive for two hours. None of that is the application. Reproduce the bug in a clean browser profile, ideally on a second account, and then again with a raw curl command. If it only works when your proxy injects a header, you found a problem in your own tooling.

Confirm the authorization boundary, not just the behavior. "The number in the URL changes" is not a bug. "User A can read user B's invoice, here is A's session and B's document ID" is. Along the way, rule out the classics:

  • Self-XSS — payload runs only when pasted into your own console.
  • Client-side-only validation — the server rejects the request anyway; the UI just hid the error.
  • Cached or stale state — a hard refresh, a new session, or an incognito window makes it vanish.
  • Interference — another extension, a VPN, or a local hosts entry is doing the work.

If the issue is intermittent, say so and describe the conditions. A bug that fires one time in five is still a bug, but it needs the trigger documented or the triager will mark it as unreproducible and move on.

A report a triager can't reproduce isn't a report. It's a conversation.

Hunt for Duplicates Before You Hit Submit

Search the platform's disclosed reports and public hacktivity for the endpoint, the parameter, and the vulnerability class. Check the program's known-issues list and its changelog — a bug you found this morning may have been patched last night, and your browser was serving a cached response. Spend five minutes on a search engine with the exact parameter name; you will be surprised how often a write-up already exists.

If your finding is a duplicate of a disclosed report, that isn't automatically the end. Ask what your version adds: a wider scope, a second role that can trigger it, an escalation the original missed. Then state that difference in the first two lines, so a triager reading forty reports can see why yours deserves a second look rather than a quick copy-paste closure.

Sharpen Impact and Evidence

Write impact in business terms

Describe what an attacker actually gains, with the account and effort required. "An attacker with a free account can read any customer's invoices by changing a single ID; invoices include billing address and the last four digits of the card on file." That sentence does more work than three paragraphs of hedged speculation. Keep the preconditions visible — no authentication required, victim interaction needed, admin role required — because severity depends on them, not on the label you choose.

One bug per report

If you have five low-severity findings and one serious one, submit the serious one on its own. Mixed reports get triaged by their weakest element, and a real vulnerability can disappear inside a list of missing headers. If you must chain issues to demonstrate impact, explain each link as a numbered step so the chain is easy to follow and easy to verify.

Evidence that survives the queue

Attach raw HTTP requests and responses with session cookies redacted. Take screenshots with the URL visible, and record a short screen capture for anything that needs more than three steps. Include the browser and version, the account type, and timestamps with a timezone. Redact tokens, secrets, and third-party personal data, but don't black out so much that the vulnerability becomes invisible. And attach files directly to the report — temporary file-sharing links expire before some triage queues get to them.

The 12-Point Checklist

  1. The asset is in scope, checked against the current policy rather than the one I remember.
  2. My testing stayed inside the rules: own accounts, no bulk access, no service disruption.
  3. It reproduces from a clean session, without proxy rules, extensions, or cached state.
  4. I can express the PoC as a short, minimal sequence of steps without unexplained jumps.
  5. It is not self-XSS, client-side-only validation, or something the server already rejects.
  6. I searched disclosed reports and known issues; if it duplicates one, I said what's new.
  7. The impact is written as what an attacker gains, not as what a scanner reported.
  8. Severity matches the demonstrated impact, with preconditions stated plainly.
  9. The report covers one issue, or a chain with every link explained.
  10. Evidence includes raw request and response plus a screenshot with the URL visible, already attached.
  11. Secrets, tokens, and third-party personal data are redacted, and no evidence link expires.
  12. The title names the bug and the location, and the steps read clearly to someone who has never opened the application.

Give It One Last Read

Before you submit, read your own report as though you were a triager with fifty items waiting and no context on your target. If a step assumes knowledge you had but didn't write down, fix it. If the title buries the vulnerability in a sentence, rewrite it. Then sleep on it for an hour if the bug isn't time-sensitive — the mistakes you catch on the second read are the ones that would have cost you a duplicate or a week of clarification. When a triager does ask for more information, answer with evidence rather than argument, and keep your notes on the reproduction path. They make the retest simple, and they make the next report faster.

Photo: RDNE Stock project / Pexels

Previous Post

Understanding IDOR: A Practical Guide for Bug Bounty Hunters

Next Post

Top 7 Mistakes New Bug Hunters Make (And How to Avoid Them)

Related Posts

About Us

Bug Hunter Journal

Bug Bounty

Notes from the front lines of bug hunting.

Read More

Latest Post

Understanding CVSS Scoring: How to Rate Your Bugs Like a Pro
Transitioning from IT Security to Full-Time Bug Bounty: A Realistic Roadmap
How to Automate Your Recon with Subfinder, httpx, and Nuclei
From Zero to P1: A Writeup of a Critical Authentication Bypass

Notes from the front lines of bug hunting.