April 18, 2026 11 min read Blog · QA & Bug Reporting

Bug Report Template (2026): Free Markdown + Word Format That Actually Gets Bugs Fixed

Most bug report templates floating around the internet are PDFs from 2014 with fields like "Tester ID" and "Module Name." This is a working bug report template for 2026 — Markdown for engineering teams, plain text for non-technical clients, with a real severity rubric and examples. Plus an honest note: if your team uses GitHub or Linear, you can probably skip the template entirely and let a tool capture the same data automatically.

Key Takeaways

What Makes a Good Bug Report

A bug report is a contract between the person who saw the bug and the person who has to fix it. Every field exists for one reason: the developer can reproduce the issue locally without going back to ask follow-up questions. If a developer has to ping the reporter for a clarification, the report failed. The eight fields below are the minimum that prevents that ping.

  1. Title — one sentence. What broke + where. Not "login broken" but "Login button shows 500 error after submitting valid credentials on /signin."
  2. Environment — URL, browser + version, OS, app version or build hash, user role if relevant. The same code can pass on Chrome 138 and fail on Chrome 145.
  3. Steps to reproduce — numbered, atomic, deterministic. "Click X, then Y, then Z." If a developer can't reproduce in 3 minutes following the steps, the steps are wrong.
  4. Expected behavior — what should have happened. Sometimes the "bug" is actually the spec being unclear. Stating expected behavior surfaces that.
  5. Actual behavior — what did happen. Be precise. "Page is white" vs. "Page renders blank with 500 error in console" are different bugs.
  6. Screenshot or screen recording — visual proof. For UI bugs, attach a screenshot. For interaction bugs, a 10-second screen recording (Loom, Cleanshot, OS-native) is worth 200 words of description.
  7. Severity — S1/S2/S3/S4 from the rubric below. Without a rubric, severity becomes opinion and everything ends up "high."
  8. Console errors / stack traces — open DevTools, copy red text. For backend bugs, paste the relevant log lines or error response. This single field saves the most time.

This 8-field structure is the foundation for every bug report format we'll cover below — Markdown, plain text, and the auto-generated version. The fields are the same; only the syntax and who fills them in changes.

The Template (Markdown)

Copy this and paste it into a GitHub Issue, Linear ticket, Jira description (with Markdown enabled), or a .github/ISSUE_TEMPLATE/bug.md file. It's the canonical software bug report template for any engineering team that lives in a Git-based tracker.

Markdown — for GitHub / Linear / Jira Select all + copy
## Title
<One sentence: what broke + where. Example: "Checkout button returns 500 on /cart when cart contains a deleted product.">

## Environment
- URL:          https://app.example.com/cart
- Browser:      Chrome 145.0.7341.92 (arm64)
- OS:           macOS 15.2 (Sequoia)
- Viewport:     1440 × 900
- App version:  v2.18.4 (commit a3f9e21)
- User role:    authenticated, plan=pro
- First seen:   2026-04-18 14:22 UTC

## Steps to reproduce
1. Log in as [email protected]
2. Add product SKU DEMO-42 to cart
3. In another tab, soft-delete SKU DEMO-42 from admin panel
4. Return to cart tab and click "Checkout"

## Expected
Cart should refresh and show "This product is no longer available — remove from cart?" with a Remove button. Checkout flow should not start.

## Actual
Page POSTs to /api/checkout/create, server returns 500 Internal Server Error. UI shows generic "Something went wrong" toast. Cart is left in a broken state — refreshing the page reproduces the same error.

## Screenshot / Recording
<attach screenshot or paste Loom URL>

## Severity
S2 — Major (blocks checkout for any cart containing a deleted product; affects revenue but workaround exists: clear cart and re-add)

## Console / Logs
// Browser console
POST https://app.example.com/api/checkout/create 500 (Internal Server Error)
Uncaught (in promise) TypeError: Cannot read properties of null (reading 'price')
    at CartSummary.render (CartSummary.tsx:84)
    at processChild (react-dom.js:3108)

// Server log (correlation id 7f3a-9e21)
[ERROR] CheckoutService: product DEMO-42 returned null from ProductRepository.findActive()
at CheckoutService.calculateTotal (checkout.service.ts:127)

## Additional context
- Reproduces 100% of the time with any soft-deleted SKU
- Did not exist before deploy a3f9e21 (yesterday)
- Likely related to PR #412 (refactored ProductRepository)

Severity rubric (use this — don't make it up per ticket)

SeverityDefinitionExampleResponse time
S1 — CriticalProduction down, data loss, security breach, or no workaround for any userLogin broken for all users; payment double-charges; database leakDrop everything < 1 hr
S2 — MajorCore feature broken for many users, or any user with no easy workaroundCheckout fails on certain carts; export to CSV produces empty fileSame day
S3 — MinorNon-core feature broken, or core feature broken with easy workaroundSearch returns wrong order; tooltip text wrong; date picker broken in Safari onlyWithin sprint
S4 — TrivialCosmetic; no functional impactButton is 2px off-center; placeholder text has typo; hover color slightly offWhen convenient

The Template (Plain Text version for non-technical clients)

For a client, support agent, or stakeholder who shouldn't have to learn what a "stack trace" is. Five fields, no jargon. Anyone can fill it out in two minutes.

Plain text — for clients / support / non-tech
WHAT PAGE OR SCREEN
(paste the URL or describe where you were — "the cart page", "the dashboard")

WHAT YOU DID
(in your own words, what you clicked, typed, or tried to do)

WHAT HAPPENED
(what you actually saw — error message, blank screen, wrong result, etc.)

WHAT YOU EXPECTED
(what you thought should happen instead)

SCREENSHOT
(attach a screenshot if you can — Cmd+Shift+4 on Mac, Win+Shift+S on Windows)

That's it. The QA lead, support engineer, or developer who picks up the ticket can fill in the technical fields (browser, console errors, severity) afterwards if they need to. The point of the plain-text version is to lower the friction for the reporter — a five-field form gets filled in; an eight-field form gets abandoned or filled in badly.

Where Bug Reports Go Wrong

After reading thousands of bug reports across client projects, the same five anti-patterns appear over and over. Every one of them eats developer time and forces a follow-up "can you give me more detail?" message that the reporter sees three days later.

Anti-pattern 1 — Vague title
"Bug in checkout"
Fix: "Checkout returns 500 when cart contains a soft-deleted product." Title should let a triager guess severity and area without opening the ticket.
Anti-pattern 2 — No reproduction steps
"Sometimes the page just doesn't load."
Fix: Numbered steps that anyone can follow. If "sometimes" is genuinely true, document the conditions: which user, which time, what was clicked just before, how often (1-in-5? 1-in-100?).
Anti-pattern 3 — "It doesn't work"
"The export doesn't work."
Fix: Separate expected and actual. "Export should download a CSV. Actually downloads a 0-byte file." The developer needs to know which of the ten possible failure modes happened.
Anti-pattern 4 — Screenshot without URL
An image attached to a Slack message with no context.
Fix: Always include the URL or route in the report. A screenshot of /admin/users/482/settings looks identical to /admin/users/483/settings, but the bug only exists on user 482.
Anti-pattern 5 — Missing browser / OS info
"Button is broken." (Reporter is on Safari 14; team only tests Chrome.)
Fix: Always capture browser + version + OS. A bug that reproduces in Safari but not Chrome is a different bug than one that reproduces in both. Without environment data, the developer wastes an hour failing to reproduce on the wrong browser.

Skip the Template: Use VibeCheck Instead

Here is the honest part. If your team uses GitHub, Linear, or any modern tracker, the bug report template above is solving a 2010s problem. The 2026 version is: a tool that captures all 8 fields automatically when the reporter clicks the broken element.

VibeCheck is a free Chrome extension. The reporter opens the broken page, clicks the broken element, types one sentence describing the issue. VibeCheck auto-captures the URL, screenshot, browser, OS, viewport, console errors, DOM path of the clicked element, and any active network errors. The output is a structured bug report with all 8 template fields filled in — without the reporter ever seeing a form.
Scenario — Real-world bug capture
Client opens site → clicks broken button → 30 seconds later, perfect bug report exists

A client testing a staging build notices the "Add to cart" button overflows on her iPhone. With the template approach, she'd need to: take a screenshot, open Notion, copy the template, paste it, fill in 8 fields including browser version (which she has to look up), describe the steps, write expected vs actual, classify severity, then send it to the dev team. Realistic time: 10–15 minutes, and she'll likely skip the technical fields. With VibeCheck: she clicks the button, types "this overflows on mobile", hits submit. URL, viewport (375×812), browser (Safari 18.2 iOS), screenshot of the button, DOM path (div.product-card > button.add-to-cart), and any console warnings are auto-attached.

Result: bug report with all 8 fields populated, sent to GitHub Issues. Total time: 30 seconds.

The side-by-side is stark. Templates are a workaround for the absence of tooling. When tooling exists, the workaround is no longer needed.

Template by hand

  • Reporter opens template doc
  • Copy-pastes URL manually
  • Looks up browser version in Help → About
  • Opens DevTools to find console errors (if technical)
  • Writes title, repro steps, expected, actual
  • Picks severity (often wrong)
  • Attaches screenshot from Downloads folder
  • Time: 10–15 min per report
  • Failure rate: ~40% missing fields

VibeCheck (auto)

  • Reporter clicks the broken element
  • Types one-line description
  • URL, viewport, browser, OS auto-captured
  • Screenshot auto-attached
  • Console errors auto-pulled
  • DOM path of clicked element captured
  • Submits to GitHub / Linear / your tracker
  • Time: 30 seconds per report
  • Failure rate: ~0% missing fields

The template still has its place. If your reporter doesn't have Chrome, or you need a paper trail in a Word doc for compliance, or your client refuses to install extensions, the Markdown and plain-text templates above are the right tool. For everyone else: skip the template, install VibeCheck.

Tools That Use This Template

Tool How fields are filled Pricing Best for
GitHub IssuesManual via ISSUE_TEMPLATE/bug.mdFreeOpen source, dev-facing repos
LinearManual via templates$8/user/moProduct teams that already live in Linear
JiraManual + plugins (Marker.io, Bugasura, etc.)$8.15/user/mo + plugin costEnterprise QA workflows
Marker.ioSemi-auto: click element, fills env + screenshot, manual description$39/mo (Essential)Agencies doing client UAT
VibeCheckFully auto: click element, all 8 fields filled, manual one-line descriptionFreeDevs and PMs who want fixes, not tickets

Compare alternatives in detail: BugHerd alternatives, Usersnap alternatives, and Marker.io vs Vibers.

According to the 2025 State of Software Quality report, 38% of bug reports filed by non-technical reporters are returned to the reporter for missing information at least once. Auto-capture tools eliminate this round-trip entirely.

FAQ

What should a bug report include?

A complete bug report includes 8 fields: a clear title (what broke + where), environment (URL, browser, OS, app version), exact steps to reproduce numbered 1-2-3, expected behavior, actual behavior, a screenshot or screen recording, severity (S1 critical to S4 trivial), and console errors or stack traces. Reports missing any of these usually bounce back to the reporter with "cannot reproduce" or sit in the backlog while a developer guesses what was meant.

What's the difference between a bug report and a defect report?

In practice, the terms are used interchangeably. Formally, a "defect" is a deviation from the specification (something the software was built to do but does incorrectly), while a "bug" is a broader category that includes defects plus issues like performance regressions, UX problems, and edge cases not covered by the spec. ISO/IEC 25010 uses "defect." Most engineering teams use "bug." The reporting template is identical for both.

How do I write a bug report for a non-technical team?

Use the simplified 5-field plain-text version above: what page or screen, what you did, what happened, what you expected, screenshot. Drop technical fields like console errors, stack traces, and browser version — the QA lead or developer can fill those in later if needed. The goal for non-technical reporters is capturing the user-visible problem clearly enough that someone technical can reproduce it. Even better, give them a tool like VibeCheck that auto-captures the technical fields from a single click.

Is there a free bug report template I can copy?

Yes — both versions in this article are free to copy. The Markdown bug report template is designed for GitHub Issues, Linear, Jira (with Markdown enabled), and any developer-facing tracker. The plain-text version is for clients, support agents, and stakeholders who don't write Markdown. No signup required, no PDF download, no email gate. Copy the code block and paste it into your issue tracker as a template.

Can I auto-generate bug reports?

Yes. Tools like VibeCheck (free Chrome extension), Marker.io ($39/mo), BugHerd, and Usersnap let a reporter click an element on the page and auto-capture the URL, screenshot, browser, OS, viewport, console errors, and DOM path. The reporter only types the description. This eliminates 6–7 of the 8 template fields and removes the most common failure mode of bug reporting: missing or incorrect environment data.

What format is best — Markdown, Word, or PDF?

For internal engineering teams: Markdown, every time. It pastes cleanly into GitHub, Linear, Jira, and Slack, renders well in any text editor, and is version-controllable. For external clients without technical tooling: plain text or a simple Word doc. Avoid PDF — it forces the reader to retype information into the issue tracker, which is where most data loss happens. The bug report format should match the workflow of the people who fix bugs, not the people who file them.

Stop writing bug reports by hand.

VibeCheck captures URL, browser, OS, screenshot, console errors, and DOM element from a single click. Reporter types one sentence. Free Chrome extension, no subscription, works on any URL.

Try VibeCheck Free Or get human review →

Alex Noxon — Vibers founder

Building Vibers — human-in-the-loop code review and visual feedback that ships fixes, not tickets. Previously shipped production systems reviewed by a combined 40,000+ hours of senior developer time. Writes about the gap between reporting bugs and actually fixing them.