How to Write a Bug Bounty Report That Gets Triaged Fast
September 16, 2026

How to Write a Bug Bounty Report That Gets Triaged Fast

A triager opens your report with one question in mind: can I reproduce this in the next five minutes? Everything else — the elegant payload, the video with captions, the theory about how the code might be structured — comes second. Reports move quickly through triage when they remove work from the reader's plate. They stall when a triager has to hunt for the URL, guess the account state, or ask for a screenshot you took but buried in paragraph nine.

Give the Essentials in the First Screen

Most triage queues are long, and most triagers are reading between other tickets. Put the five things they need before they have to scroll: the affected asset, the exact input, the observable result, the security consequence, and the reproduction environment.

  • Asset: the full URL or endpoint, including the parameter. Not "the search page".
  • Trigger: the request, payload, or sequence of clicks.
  • Evidence: the response body, a screenshot with the URL bar visible, or a log line.
  • Impact: one sentence on what an attacker gains.
  • Context: account role, browser or tool version, and anything else that must be true for the bug to work.

If the vulnerability only fires when a feature flag is on, the victim is an admin, or the request needs a header your proxy added, say so in that block. Hiding a precondition to make the bug look bigger is the fastest way to earn a "not reproducible" and a slow back-and-forth.

Titles Do More Work Than You Think

The title is a label on a shelf. A good one lets a triager route the report to the right team without opening it.

Weak: XSS on the site. Better: Stored XSS in support ticket subject executes in agent dashboard. Strongest: Stored XSS in support ticket subject (account A) executes in agent dashboard (account B).

The third version names the vulnerability class, the injection point, the victim surface, and the trust boundary crossed. That last part matters: a self-XSS that only fires in your own session is not the same bug as one that fires in someone else's browser, and the title should make the difference obvious.

Keep one issue per report. If you found a stored XSS and a missing rate limit on the same endpoint, file them separately unless the chain is genuinely required for impact. Bundled reports slow triage because two teams may need to look at them.

Reproduction Steps That Survive a Skeptical Reader

Write for someone who has never seen the application and does not trust your conclusion. Assume they will follow your steps literally, in order, without improvising.

  1. Log in as attacker@example.test (standard user role) at /login.
  2. Open a new support ticket, set the subject to <img src=x onerror=alert(1)>, and submit it.
  3. Note the ticket ID returned in the response.
  4. Log out, then log in as an agent account that can view the queue.
  5. Open the ticket list. The script executes and a dialog box appears.

Then add the raw request. One HTTP request block is often more useful than ten screenshots, because a triager can paste it into a proxy and replay it. Include cookies only if they belong to your own test session, and strip them if the program asks. If the bug needs a specific header, show that header.

If a step takes more than one action to describe, split it into two steps. Triagers follow lists; they skim paragraphs.

Screenshots should show the URL, the relevant state, and a timestamp where possible. Record a short screen capture only when timing or a multi-step interaction is genuinely hard to describe. Forty seconds beats ten minutes.

Impact: Show the Consequence, Not the Payload

"An alert box appeared" is a symptom. Impact is what that alert box represents: session tokens readable by an attacker, actions taken as the victim, data belonging to another user returned in a response.

Write one or two sentences answering three questions: who is harmed, what do they lose, and what does the attacker have to do to make it happen? For a stored XSS in an agent dashboard, that might read: "Any user who can submit a ticket can run script in the browser of an agent reviewing it, allowing the attacker to read that agent's session token and act with agent privileges." Concrete, and it follows directly from your steps.

Resist inflation. Calling every finding "full account takeover" when you have demonstrated a redirect erodes trust and invites a severity argument you will lose. If you can describe the reach — which roles, how many users, whether authentication is required — do it plainly. A CVSS vector or a suggested priority tier is welcome in many programs, but it should support your case, not replace it.

Remediation Advice Without Overstepping

A short fix suggestion saves the engineering team time and signals that you understand the bug rather than just the tool that found it. Two or three sentences is usually right.

Be specific about the layer: "encode the subject field on output in the agent dashboard template" is actionable. "Rewrite the input handling" is not. Mention a defensive control when it is cheap to add, such as server-side validation alongside client-side checks. If you cannot see the backend, describe what you observed and offer a direction instead of asserting an implementation.

Skip the unrelated hardening wishlist. A report about stored XSS does not need your opinions on TLS configuration, password policy, and missing security headers. Those belong in a separate, low-severity report if the program accepts them at all.

Details That Quietly Slow Triage

Small choices add up to hours of delay across a program.

  • Redact your own session tokens, but leave the request otherwise intact.
  • Never paste another user's personal data, even if you can reach it. Enough to prove the issue, nothing more.
  • Attach large logs and proxy files instead of pasting them into the body.
  • Note your timezone when you reference timestamps.
  • State whether the bug requires a paid plan, an invite, or a specific role.
  • Check the scope page and known duplicates before submitting. A valid bug reported out of scope gets closed without a payout.
  • Answer triage questions promptly and retest after a fix if the program asks.

Tone counts too. Triagers are not adversaries, and a report written on the assumption that they will try to reject it reads as hostile. State the facts, answer likely objections in advance, and let the evidence argue.

A Skeleton You Can Reuse

Summary: one sentence naming the vulnerability, the affected asset, and the consequence. Steps to reproduce: numbered, literal, with a raw request. Impact: who is harmed and what they lose. Evidence: a screenshot or response body with the proof highlighted. Remediation: one or two specific suggestions. Then stop.

Write the draft, put it aside for a few minutes, and read it as though you are the triager seeing the target for the first time. If a step assumes knowledge you did not provide, add it. Fast triage is rarely about finding rarer bugs; it is about making an ordinary bug impossible to misunderstand.

Photo: viarami / Pixabay

Previous Post

Bug Bounty for Absolute Beginners: Your First 30 Days of Recon

Next Post

Understanding IDOR: A Practical Guide for Bug Bounty Hunters

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.