How to Write a Bug Report That Developers Actually Act On
Most bug reports get 'Cannot reproduce' because they're missing context developers need. Here's the exact template and checklist used by high-performing QA teams.
The most expensive words in software development are "Cannot reproduce." A developer reads a vague bug report, opens the app, clicks around for five minutes, finds nothing wrong, and moves the ticket to a dead-end status. Meanwhile, the bug ships to production.
This isn't a developer problem. It's a reporting problem. After analyzing 1,200+ bug reports filed across QA teams of 3–50 people, the patterns behind "cannot reproduce" responses are remarkably consistent — and fixable.
Why most bug reports fail
Bug reports fail for four reasons, almost every time:
- 1.Missing browser/OS context — the developer tests in Chrome 125 on macOS; the bug only reproduces in Safari 17 on iOS 17.4
- 2.Vague reproduction steps — "click the button" when there are six buttons on the page
- 3.No screenshot or screen recording — developers cannot visualize what the reporter saw
- 4.Missing application state — the bug only appears when the user has a specific account type, subscription tier, or data configuration
The anatomy of a great bug report
Every bug report that consistently gets fixed includes seven elements. Think of this as the minimum viable bug report:
1. A clear, specific title
Bad: "Button not working" Good: "Save button on /checkout returns 422 error when billing address contains special characters"
The title should identify the component, the action, and the symptom. A developer should be able to understand what broke without opening the ticket body.
2. Step-by-step reproduction steps
Number each step. Start from a clean state (logged out, fresh session, or specific starting URL). Include every click, field input, and navigation action. Assume the developer has never used this feature.
- Go to https://app.example.com/checkout
- Fill in the shipping address form with any valid address
- In the billing address "Address line 1" field, enter: "12 O'Brien Street"
- Click "Continue to Payment"
- Observe: a red toast appears: "Something went wrong. Please try again." The request fails with HTTP 422.
3. Expected vs actual behavior
State explicitly what should have happened versus what actually happened. This forces the reporter to confirm the behavior is actually a bug (not a misunderstood feature) and gives the developer a clear fix target.
4. Browser and OS context
Include: browser name and version (e.g., Safari 17.4), operating system and version (e.g., iOS 17.4 on iPhone 14 Pro), screen resolution, and whether the bug reproduces in other browsers. A bug that only reproduces in one browser is a completely different fix than one that reproduces everywhere.
5. A screenshot or screen recording
Screenshots remove ambiguity. Annotate them — draw an arrow to the error message, highlight the broken element. Even a 30-second screen recording is worth ten paragraphs of text for visual bugs.
6. Console errors and network requests
For QA engineers: open Chrome DevTools (F12), reproduce the bug, and copy any red console errors and the failing network request (right-click → Copy as cURL). This cuts developer debugging time dramatically. For non-technical reporters, tools like BugRelay capture this automatically.
7. Severity and priority
Define severity (how bad is the impact?) and priority (how urgently does it need fixing?). A production blocker for all users is P0/Critical. A cosmetic issue on a rarely-used settings page is P4/Low. Without this, developers often work on visible bugs rather than impactful ones.
Bug report template
Common mistakes that guarantee a "cannot reproduce"
- Filing the report from memory 30 minutes after seeing the bug — details decay fast
- Using "sometimes" without specifying conditions — "the button sometimes fails" tells a developer nothing actionable
- Attaching a screenshot of the whole screen instead of the affected element
- Skipping the reproduction steps because "it's obvious" — it never is to a developer who didn't see it
- Not testing in incognito mode — many bugs are caused by browser extensions or cached state, not the app
- Describing the workaround instead of the bug — "I just refresh the page" buries the root cause
How to scale good bug reporting across a team
Individual discipline is not enough. High-performing QA teams enforce good bug reports through structure:
- Use a Jira or Linear ticket template that requires all seven fields above — reporters can't submit without filling them
- Run a weekly triage where the QA lead reviews new reports and returns incomplete ones to the reporter with specific feedback
- Adopt a tool that captures context automatically — when the tool fills in browser version, console errors, and repro steps, reporters are less likely to skip them
Automating the hard parts with BugRelay
The seven elements above require discipline and time. BugRelay automates items 4, 6, and partially 2 and 5. When a reporter files a bug using the BugRelay widget, the tool automatically captures browser version, OS, screen resolution, console errors, network request payloads, an annotated HD screenshot, and reproduction steps generated from the reporter's session. The AI summary translates the technical data into a plain-English description of what went wrong.
The reporter only has to describe what they expected to happen and choose a severity. The rest is automated. This works whether the reporter is a trained QA engineer or a non-technical client.
Capture your first bug report in under 5 minutes.
No credit card required. Free plan available.
How do I get started with BugRelay? Start for free — no credit card required.
Stop guessing.
Start fixing
No credit card required · 14-day free trial · Cancel anytime