What technical info to capture in a bug report (and how to automate it)
Most bug reports are bad. Not because the reporters are lazy — but because the format demands too much of them. A reporter wants to say "this is broken"; the engineer needs to know which page, which browser, what version, what device, what was on screen, and what happened just before. Closing that gap by asking the reporter to fill in a long form is the wrong direction. They'll give up. Or they'll guess. Or they'll send a one-line message and call it done.
Close the gap the other way: capture the technical context automatically, so the reporter only has to describe the symptom.
The five fields every bug report needs
- Page URL. Which page was the user on? Sounds obvious; gets forgotten constantly. Without it, engineers spend the first ten minutes of every triage trying to figure out where to look.
- Browser and version. A bug in Safari 14 isn't the same bug as one in Chrome 121. The user-agent string identifies both browser and version.
- Operating system. Relevant for font rendering, scrollbar behaviour, date pickers, file pickers, and anything that touches OS-level UI. macOS and Windows render the same CSS differently in subtle ways.
- Viewport size. "It looks broken" usually means "it looks broken at this width". Width and height tell you whether you're looking at a responsive layout breakdown.
- Screenshot at the moment of report. Words describe; pictures show. A screenshot at the moment of report is the single highest-value piece of evidence in any bug report.
What reporters usually give you instead
If you've ever received a bug report that says "the form is broken" with no other context, you know the failure mode. The reporter knew there was an issue but didn't know what an engineer would need to reproduce it. So they wrote what they would tell a colleague face-to-face. The result is unactionable.
An engineer's first job on every bug should not be: "what browser were you using?". It should be: "can I reproduce this?". If you find your team spending the first round of triage chasing context, your reporting format is the problem.
How to automate the capture
Three of the five fields are free — the browser already knows them. The other two require one click of intent from the reporter.
- Page URL —
window.location.href. Free. - Browser and OS — parse
navigator.userAgent. Free. - Viewport size —
window.innerWidthandwindow.innerHeight. Free. - Screenshot — requires the reporter to trigger capture. One click.
- DOM element clicked — captured at the moment of click, saved as a CSS selector. One click (same one as the screenshot trigger).
The pattern that works:
- Reporter clicks on the part of the page they want to talk about.
- Tool captures the URL, browser, OS, viewport, screenshot, and DOM element automatically.
- Reporter types one sentence describing the symptom.
- Task lands on a Kanban board with all six fields pre-filled.
This is exactly what WebPinch does. The reporter clicks, comments, submits. The engineer opens a task with everything they'd otherwise have to chase down.
Bonus: the DOM element matters more than you think
Most bug reports tell you where on the page in English: "the button next to the search bar". That description is ambiguous if the page has a complex layout, and useless if the page has been refactored since the report was filed. A CSS selector saved at the moment of capture — main > section.hero > div.cta > button.primary — is unambiguous and points an engineer at the exact node in the DOM.
Even if the selector breaks later (the class name changed, the layout was reorganised), it still tells you what the reporter clicked on. That's a more durable signal than English description, and it gets the engineer to the right region of the codebase faster.
Note one gotcha: CSS-in-JS frameworks and Tailwind responsive variants produce class names with characters that need escaping in CSS selectors. A naive selector like div.hidden.md:flex will throw in querySelector. Use CSS.escape() on class names when generating selectors — or pick a tool that handles this for you.
What about repro steps?
There's one field worth its own discussion: steps to reproduce. Reporters skip it because writing reproducible steps is genuinely hard. They guess what's relevant and what isn't. The result is steps that don't reproduce the bug, which is worse than no steps.
The pragmatic answer isn't to insist on better repro steps — it's to capture a short screen recording with the report. If the recording shows the user's actions in 15 seconds, you don't need "steps to reproduce" in prose. Any modern bug-reporting tool worth using supports this.
The information you don't need (but everyone asks for)
Several fields appear in standard bug-report templates that add noise without value:
- Severity rating assigned by the reporter. Reporters consistently mis-rate severity — every bug is critical from the reporter's perspective and not-critical from theirs. Have engineering triage assign severity.
- Priority assigned by the reporter. Same problem. Triage assigns priority based on business impact, not reporter urgency.
- Component / module the bug affects. Reporters don't know your code structure; engineering does. Triage adds this.
- Expected vs actual behaviour in separate fields. Combining these into one "what's wrong?" sentence is usually clearer. Reporters who try to fill both fields end up writing the same thing twice.
Strip these from your bug-report template. They look thorough; they reduce report quality.
For technical bugs from technical reporters
If your reporter is an engineer, you can capture more:
- Console errors at the moment of capture.
- Network requests — the last N requests and their status codes.
- Local and session storage contents (sanitised).
- JavaScript stack trace if an error was thrown.
- Build / version identifier from a build-time meta tag.
Tools like Jam.dev and Bird Eats Bug specialise in this depth. They're overkill for non-technical reporters but excellent for engineering and QA use.
Building a bug-report format that works
The structure of a good bug report, in order of how it's filled:
- Reporter writes: a one-sentence symptom. ("Submit button doesn't respond on the contact page.")
- Tool captures automatically: URL, browser, OS, viewport, screenshot, DOM element, console errors (optional).
- Tool generates: a CSS selector for the clicked element.
- Engineering triage adds: severity, priority, component, assignee.
- Optional: a 10–30 second screen recording attached if reproduction is non-trivial.
That's the full set. Anything you add beyond this is overhead that reduces report quality.
Recap
A great bug report isn't a great form. It's a great capture surface that fills in the five context fields automatically, so the reporter only has to describe the symptom. Cut your engineering team's time-to-repro in half by doing the capture for them. The next bug your team triages should arrive with the URL, browser, OS, viewport, screenshot, and DOM element already attached — and the reporter's one-line description is the only piece of human-written content the engineer needs to read.
Try WebPinch free
Pin feedback on any website, capture screenshots automatically, and track everything on a Kanban board.