All Posts

Jira Bug Report Template: Complete Guide with Examples (2026)

11 min read· TestBuggy Team
JiraBug Report TemplateQA Best PracticesProject Management

A good Jira bug report is the difference between a fix that takes 30 minutes and a back-and-forth that takes 3 days. When developers receive "login doesn't work," they spend more time investigating than fixing. A complete bug report eliminates that ambiguity entirely.

This guide covers everything you need to write professional Jira bug reports: the essential fields, copy-paste templates, severity guidelines, real examples, and how to automate the entire process.

The Complete Jira Bug Report Template

Copy this template and create a Jira issue type called "Bug" with these fields:

Summary: [Component] + [what broke] + [trigger condition]

Environment:
- Browser: [Chrome 121, Firefox 122, Safari 17]
- OS: [macOS 14, Windows 11, Ubuntu 22]
- URL: [https://app.example.com/path]
- User Role: [Admin / Standard User / Guest]
- Environment: [Production / Staging / Dev]

Steps to Reproduce:
1. [First action — start from a known state]
2. [Subsequent actions — be specific]
3. [Action that triggers the bug]

Expected Result:
[What should happen based on requirements or normal behavior]

Actual Result:
[What actually happened — include error messages, status codes]

Severity: [Critical / High / Medium / Low]
Priority: [P1 / P2 / P3 / P4]

Root Cause Hypothesis:
[Optional — if you have a theory about why this happened]

Console Errors:
[Copy error messages from browser DevTools → Console]

Network Issues:
[Failed requests: URL, method, status code, response body]

Attachments:
[Screenshots, GIF recording, HAR file]

How to Fill Each Field

Summary (Bug Title)

The summary is the most-read field in Jira. Write it so developers immediately know what broke without reading the rest.

Formula: [Component] [what broke] [trigger condition]

| Bad | Good | |---|---| | Login broken | POST /api/auth/login returns 500 with valid credentials | | Button not working | "Add to cart" button unresponsive on product page when user is logged out | | Error on checkout | Checkout fails with "undefined" error when applying promo code | | CSS issue | Product image overlaps price text on mobile viewport under 375px |

Keep it under 80 characters. Be specific enough that it's distinguishable from similar bugs.

Environment

Developers can't reproduce a bug without knowing where it happened.

Browser: Chrome 121.0.6167.160 (64-bit)
OS: macOS 14.2.1
URL: https://app.example.com/checkout
User role: Standard user (not admin)
Environment: Production
Screen resolution: 1440×900

For mobile bugs, add:

Device: iPhone 15 Pro
iOS: 17.2
Browser: Safari Mobile

Steps to Reproduce

The most important section. Number every step. Start from a known state. Be precise about what you click, type, or select.

Rules:

  • Start with navigation ("Navigate to...")
  • Include exact values you type ("Enter 'user@example.com'")
  • Specify which button/link/element you interact with
  • One action per step
  • Include any prerequisite state ("While logged in as standard user")

Example — good steps:

1. Navigate to https://app.example.com/login
2. Click "Sign in with Google"
3. Select the test account (test.user@gmail.com)
4. After redirect, navigate to https://app.example.com/settings/billing
5. Click "Upgrade to Pro"
6. Select the "Monthly" billing option
7. Click "Proceed to checkout"

Example — bad steps:

1. Log in
2. Go to billing
3. Try to upgrade

The bad version forces the developer to guess every detail.

Expected vs. Actual Result

Write these as a pair. The contrast between expected and actual defines the bug.

Expected result:

After clicking "Upgrade to Pro," user is redirected to the Stripe checkout page at /checkout with the correct plan pre-selected.

Actual result:

The page redirects to /checkout but shows a blank white screen. Browser console shows: TypeError: Cannot read property 'id' of undefined at CheckoutPage.js:47. Network tab shows GET /api/plans/undefined 404 (Not Found).

Include error messages verbatim. Include HTTP status codes. Include the exact URL if it changed unexpectedly.

Severity vs. Priority

These are different concepts and both matter in Jira.

Severity = how bad is the impact on the user

| Severity | Definition | Example | |---|---|---| | Critical | Data loss, security breach, app crash, complete feature failure | Login completely broken for all users | | High | Core feature broken, no workaround | File upload returns error, can't upload anything | | Medium | Feature degraded, workaround exists | Export to PDF works but Excel export fails | | Low | Cosmetic, minor annoyance, no functional impact | Button text is slightly misaligned on Firefox |

Priority = when should this be fixed

| Priority | Definition | |---|---| | P1 | Fix immediately, blocks current sprint or release | | P2 | Fix this sprint | | P3 | Fix in next sprint | | P4 | Fix when convenient, tracked but not urgent |

A Critical severity bug might be P2 if it only affects beta users. A Medium severity bug might be P1 if it blocks a major customer demo.

Console Errors

Open browser DevTools (F12) → Console tab before reproducing the bug. Copy the full error including the stack trace.

TypeError: Cannot read properties of undefined (reading 'userId')
    at ProfilePage.componentDidMount (ProfilePage.js:52:34)
    at commitLifeCycles (react-dom.development.js:20663:22)

If no console errors appear, note that explicitly: No console errors observed.

Network Issues

Open DevTools → Network tab. Filter for failed requests (4xx, 5xx status codes).

POST /api/users/profile/update → 422 Unprocessable Entity (340ms)
Request payload: {"name": "John Doe", "avatar": [object File]}
Response body: {"error": "avatar_too_large", "maxSize": "2MB", "received": "4.3MB"}

This level of detail lets developers reproduce the exact server-side error without guesswork.

5 Complete Bug Report Examples

Example 1: Authentication Bug

Summary: Google OAuth login redirects to /undefined instead of /dashboard

Environment: Chrome 121, macOS 14.2, Production, Standard user account

Steps to Reproduce:
1. Navigate to https://app.example.com/login
2. Click "Continue with Google"
3. Select any Google account in the OAuth popup
4. Click "Allow" to grant permissions

Expected Result:
User is redirected to /dashboard with session established.

Actual Result:
User is redirected to /undefined/dashboard — a 404 page.
Console: Uncaught TypeError: Cannot read property 'next' of undefined
Network: GET /api/auth/session → 200 (session exists, user is authenticated)

Severity: High
Priority: P1

Notes: Affects all Google OAuth logins. Email/password login works correctly.

Example 2: Data Integrity Bug

Summary: CSV export includes deleted records when date filter is applied

Environment: Chrome 121, Windows 11, Production, Admin user

Steps to Reproduce:
1. Log in as admin
2. Navigate to /admin/users
3. Apply date filter: "Created after: Jan 1, 2026"
4. Click "Export to CSV"
5. Open the downloaded CSV file

Expected Result:
CSV contains only users created after January 1, 2026, 
and only active (non-deleted) users.

Actual Result:
CSV includes 23 deleted users (marked with is_deleted: true in the database).
Date filter is applied correctly but soft-deleted records are not excluded.

Severity: High
Priority: P2

Reproduction rate: 100% — reproducible every time with any date filter.

Example 3: UI/Layout Bug

Summary: Login button hidden behind keyboard on mobile (iOS Safari)

Environment: iPhone 14, iOS 17.1, Safari, Production

Steps to Reproduce:
1. Open https://app.example.com/login on iPhone Safari
2. Tap the "Email" input field
3. Type any text (keyboard appears)
4. Attempt to tap the "Sign In" button

Expected Result:
Page scrolls to keep the Sign In button visible above the keyboard.

Actual Result:
The Sign In button is hidden behind the iOS keyboard. 
No way to submit the form without dismissing the keyboard first.

Severity: Medium
Priority: P2

Workaround: Dismiss keyboard by tapping elsewhere, then tap Sign In.
Affects: All iOS users on login page.

Example 4: Performance Bug

Summary: Dashboard takes 8-12 seconds to load with more than 100 projects

Environment: Chrome 121, macOS 14.2, Production, Account with 150+ projects

Steps to Reproduce:
1. Log in with account test+perf@example.com (has 158 projects)
2. Navigate to /dashboard
3. Measure time until all projects are visible

Expected Result:
Dashboard loads within 2 seconds.

Actual Result:
Dashboard takes 8-12 seconds on first load.
Network: GET /api/projects → 8.4s (fetching all 158 projects, no pagination)
Response size: 2.3MB JSON

Severity: Medium
Priority: P2

Notes: Accounts with <50 projects load in <1 second. Issue is the lack of
pagination in the /api/projects endpoint.

Example 5: Payment Bug

Summary: Promo code "LAUNCH20" applies 20% discount but checkout charges full price

Environment: Chrome 121, macOS 14.2, Production, New user account

Steps to Reproduce:
1. Navigate to /pricing
2. Click "Get Started" on the Pro plan
3. On the checkout page, enter promo code "LAUNCH20"
4. Click "Apply"
5. Confirm discount shows (-$6.00) in the order summary
6. Enter test card 4242 4242 4242 4242
7. Complete checkout
8. Check the Stripe dashboard for the actual charge

Expected Result:
User is charged $23.99 (Pro plan $29.99 minus 20% discount).

Actual Result:
User is charged $29.99 (full price). 
Discount appeared in the UI but was not applied to the Stripe PaymentIntent.
Stripe charge ID: ch_3O4k2...

Severity: Critical
Priority: P1

Jira Bug Report Best Practices

1. One Bug Per Ticket

Never combine multiple bugs in a single Jira issue. "Login broken and also the export doesn't work" creates ambiguity about what "Done" means. File separate tickets for each distinct issue.

2. Use Labels and Components

Jira labels help filter bugs by area:

  • Labels: regression, blocker, mobile, accessibility, performance
  • Components: authentication, billing, dashboard, api

This allows teams to quickly filter: "Show me all billing bugs at Critical severity."

3. Link Related Issues

Use Jira's "Link" feature to connect related bugs:

  • "is caused by" → links to root cause tickets
  • "blocks" → links to features that can't ship until this is fixed
  • "is duplicated by" → when you find a duplicate

4. Update the Status Immediately

Jira's value comes from accurate status tracking. Update bugs as they progress:

  • Open → assigned to developer
  • In Progress → developer actively working
  • In Review → fix deployed to staging, awaiting QA verification
  • Done → QA confirmed fix in production

5. Write Regression Test Notes

When closing a bug, add a comment with the steps to verify the fix and a note for regression testing:

Fix verified in staging build 2.4.1.
Regression test: Run steps from "Steps to Reproduce" — login 
now correctly redirects to /dashboard.
Added to regression suite: TC-1047.

Jira Bug Report Template for Different Teams

For Agile/Scrum Teams

Add these fields to your Jira bug template:

Sprint: [Current sprint name]
Story Points: [Estimated fix effort]
Affected User Stories: [Link to related user stories]
Acceptance Criteria for Fix: [How will we know this is fixed?]

For API/Backend Bugs

API Endpoint: POST /api/users/profile
HTTP Method: POST
Request Headers: Content-Type: application/json, Authorization: Bearer [token]
Request Body: {"name": "Test User", "avatar": null}
Response Status: 500
Response Body: {"error": "Internal Server Error", "trace": "..."}

For Mobile Bugs

Device: iPhone 14 Pro
OS Version: iOS 17.1.2
App Version: 3.2.1 (build 421)
Network: WiFi / 4G / 5G
Reproduction Rate: 3/3 attempts

Automating Jira Bug Report Generation

The biggest problem with bug reports isn't the template — it's the time and discipline required to fill it out consistently. Most teams start with good intentions and gradually slide back to incomplete reports.

Test Buggy solves this by automating the entire documentation process:

  1. Install the Chrome extension — takes 30 seconds
  2. Click Start Recording before your test session
  3. Test normally — the extension runs silently in the background
  4. Click Stop & Generate when you find a bug

The AI analyzes your recorded session and automatically fills:

  • Steps to Reproduce — grouped into meaningful steps, not raw clicks
  • Expected and Actual Result — inferred from what the AI detects went wrong
  • Console Errors — captured automatically, no DevTools needed
  • Network Issues — failed requests with status codes and response bodies
  • Environment — browser, OS, URL captured automatically
  • Severity — assessed based on actual impact and error types
  • GIF Recording — visual proof included automatically

The result is a complete, Jira-compatible bug report in about 3 seconds. Export directly to Jira (coming soon), download as CSV, PDF, HTML, or Excel, or copy as Markdown for AI coding assistants.

Getting Started

Option 1: Use the template manually Copy the template at the top of this guide into your Jira bug issue type configuration (Project Settings → Issue Types → Bug → Edit fields).

Option 2: Automate with Test Buggy Install the Chrome extension (free, 10 credits included), record your next testing session, and get a complete Jira-ready bug report automatically.

Your developers will write better fixes. Your QA cycle will run faster. Your Jira backlog will finally tell the truth.

Related Articles