A well-written bug report is the bridge between QA and development. Poor bug reports lead to back-and-forth, wasted time, and frustration. Excellent bug reports get bugs fixed quickly, improve team collaboration, and earn respect for QA team. In this comprehensive guide, we’ll explore how to write bug reports that developers actually love.

Introduction: Why Bug Reports Matter

The Cost of Poor Bug Reports

Bad bug reports cause:

  • Wasted time: Developers spending hours trying to reproduce issues
  • Delayed fixes: Bugs sent back to QA for more information
  • Team friction: Frustration between QA and development
  • Missed bugs: Unclear reports get deprioritized or closed
  • Reduced trust: QA team loses credibility

The Value of Excellent Bug Reports

Great bug reports deliver:

  • Fast fixes: Developers can immediately understand and fix the issue
  • Accurate estimates: Clear reports enable better planning
  • Team collaboration: Mutual respect between QA and dev
  • Quality improvement: Insights into patterns and root causes
  • Professional reputation: QA seen as quality partners, not gatekeepers

Developer Perspective

What developers want in a bug report:

  1. “Can I reproduce this?”
  2. “What exactly is wrong?”
  3. “What should happen instead?”
  4. “Is this critical or can it wait?”
  5. “Do I have all the information I need?”

What frustrates developers:

  • “It doesn’t work” (What doesn’t work? Where? How?)
  • “The page is broken” (Which page? What’s broken about it?)
  • “Sometimes the button fails” (When? Under what conditions?)
  • Missing steps to reproduce
  • No screenshots or evidence
  • Can’t reproduce in their environment

Anatomy of Perfect Bug Report

Understanding bug anatomy is essential for effective reporting. The complete defect lifecycle begins with a well-written report.

Essential Components

Every bug report must include:

  1. Summary/Title — One-line description
  2. Environment — Where bug occurs
  3. Preconditions — Required setup
  4. Steps to Reproduce — Exact actions to trigger bug
  5. Expected Result — What should happen
  6. Actual Result — What actually happens
  7. Severity/Priority — Impact assessment
  8. Attachments — Screenshots, videos, logs

Optional But Valuable Components

  1. Frequency — How often it occurs
  2. Workaround — Temporary solution if exists
  3. Additional Notes — Context, related bugs
  4. Test Data — Specific data used
  5. User Impact — Who is affected and how

Component 1: Summary/Title

Bad Titles

- ❌ "Login issue"
- ❌ "Bug in checkout"
- ❌ "Error on page"
- ❌ "It doesn't work"
- ❌ "Problem with search"

Why these are bad:

  • Too vague
  • Don’t indicate severity
  • Multiple bugs could match
  • No action indicated

Good Titles

- ✅ "Login button unresponsive after entering invalid email format"
- ✅ "Checkout fails with 500 error when applying expired promo code"
- ✅ "Product search returns no results for queries containing special characters"
- ✅ "User profile page displays incorrect order count for premium users"

What makes them good:

  • Specific: Exact component/feature affected
  • Action-oriented: Describes what fails
  • Condition: When it fails
  • Scannable: Developer can quickly understand issue

Title Formula

[Component/Page] + [Action/Behavior] + [Condition/Context]

Examples:
"Shopping cart" + "removes items" + "when user logs out"
"Password reset" + "email not sent" + "for users with special characters in email"
"Dashboard" + "shows wrong metrics" + "after timezone change"

Title Best Practices

  1. Keep it under 80 characters (if possible)
  2. Start with affected component (easy to scan in lists)
  3. Use active voice (“Button doesn’t respond” not “Button is unresponsive”)
  4. Avoid redundant words (“bug”, “issue”, “problem” — that’s implied)
  5. Include error codes if applicable (“API returns 404 error”)

Before/After Examples:

- ❌ Before: "Issue with payment"
- ✅ After: "Payment processing fails with timeout error for orders >$1000"

- ❌ Before: "Search broken"
- ✅ After: "Search autocomplete doesn't display suggestions for queries <3 characters"

- ❌ Before: "Email problem"
- ✅ After: "Order confirmation email contains incorrect product names"

Component 2: Environment Details

What to Include

Application Information:

  • Application version/build number
  • Environment (dev, staging, production)
  • URL or endpoint

Browser/Device:

  • Browser name and version
  • Operating System and version
  • Screen resolution (for UI bugs)
  • Device model (for mobile)

User Account:

  • User role/permissions
  • Account type (free/premium/admin)
  • Account age or special states

Network/Connection:

  • Network type (WiFi, 4G, 3G)
  • VPN status (if relevant)

Environment Template

Environment:
- Application: E-commerce Web App v3.5.2 (Build #456)
- URL: https://staging.example.com
- Browser: Chrome 120.0.6099.109
- OS: macOS Sonoma 14.2.1
- Screen Resolution: 1920x1080
- User Account: test-premium@example.com (Premium user, created 2025-09-01)
- Network: WiFi

Mobile Bug Report Environment:

Environment:
- Application: Mobile Banking App v2.3.0 (Build #234)
- Device: iPhone 14 Pro
- iOS Version: 17.2
- Screen Size: 6.1" (2556×1179)
- User Account: testuser@bank.com (Checking + Savings accounts)
- Network: 4G LTE
- Additional: Face ID enabled, Touch ID disabled

API Bug Report Environment:

Environment:
- API: Payment Gateway API v2.1
- Endpoint: POST /api/v2/payments
- Environment: Staging (https://api-staging.example.com)
- API Key: pk_test_xxx (test mode)
- Request Tool: Postman v10.19
- Timestamp: 2025-10-01 14:35:22 UTC

Why Environment Matters

Different behaviors occur in different environments:

Example: Bug only appears in:
- Safari (not Chrome/Firefox) → Browser-specific
- Production (not staging) → Data or configuration issue
- Mobile (not desktop) → Responsive design issue
- Premium accounts (not free) → Permission or feature flag issue

Component 3: Preconditions

What Are Preconditions?

Preconditions are the required state of the system/data before reproducing the bug.

When to Include Preconditions

Include when bug requires:

  • Specific user state (logged in, specific role)
  • Specific data (items in cart, saved payment methods)
  • Specific settings (notifications enabled, dark mode)
  • Specific timing (during business hours, after midnight)

Precondition Examples

Example 1: E-commerce Checkout Bug

Preconditions:
- User logged in with premium account
- Shopping cart contains 3 items (total >$100)
- User has 2 saved payment methods
- Active promo code "SAVE20" in system
- User's shipping address is in California, USA

Example 2: Banking Transaction Bug

Preconditions:
- User has Checking account with balance $500
- User has Savings account with balance $1,000
- User has active debit card linked to Checking
- No pending transactions
- Account in good standing (no holds/freezes)

Example 3: Notification Bug

Preconditions:
- User registered >30 days ago
- User has email notifications enabled
- User has opted into promotional emails
- User has not opened app in last 7 days
- System has scheduled batch email job for 9 AM UTC

Common Mistake: Mixing Preconditions with Steps

❌ Wrong:
Preconditions: Click login button

✅ Correct:
Preconditions: User account exists with email test@example.com

Steps to Reproduce:
1. Click login button
2. ...

Remember: Preconditions = state before test starts; Steps = actions to trigger bug.

Component 4: Steps to Reproduce

The Golden Rule

If a developer cannot reproduce the bug from your steps, the bug won’t get fixed.

Steps to Reproduce Template

Steps to Reproduce:
1. [First action with exact details]
2. [Second action with exact details]
3. [Third action with exact details]
...
N. [Final action that triggers bug]

Best Practices for Steps

1. Be Exact and Specific

- ❌ Bad: "Go to checkout"
- ✅ Good: "Click 'Proceed to Checkout' button at bottom of shopping cart page"

- ❌ Bad: "Enter email"
- ✅ Good: "Enter email: 'test@example.com' in the 'Email Address' field"

- ❌ Bad: "Search for something"
- ✅ Good: "Type 'wireless headphones' in search bar and press Enter"

2. Number Your Steps

✅ Good:
1. Navigate to https://example.com/login
2. Enter email: "user@test.com"
3. Enter password: "Test123!"
4. Click "Sign In" button
5. Observe error message

3. Include Exact Data

- ❌ Bad: "Enter a large amount"
- ✅ Good: "Enter amount: 999999.99"

- ❌ Bad: "Upload an image"
- ✅ Good: "Upload image: 'test-image.png' (5MB, 3000x2000px)"

- ❌ Bad: "Select a date"
- ✅ Good: "Select date: February 29, 2024 from date picker"

4. One Action Per Step

❌ Bad:
1. Login and go to settings and change email

✅ Good:
1. Click "Login" button
2. Enter credentials and submit
3. Navigate to Settings page
4. Click "Change Email" option

5. Specify Timing/Waits When Relevant

Example:
3. Click "Submit Order" button
4. Wait for confirmation page to load (usually 2-3 seconds)
5. Observe: Error message appears instead of confirmation

6. Include Navigation Details

- ❌ Bad: "Go to profile"
- ✅ Good: "Click user avatar in top-right corner → Select 'My Profile' from dropdown"

- ❌ Bad: "Open settings"
- ✅ Good: "Navigate to Settings via sidebar menu (3rd item from top)"

Real-World Examples

Example 1: Checkout Bug

Steps to Reproduce:
1. Navigate to https://store.example.com
2. Add "Wireless Mouse" to cart (Product ID: WM-001)
3. Add "USB Cable" to cart (Product ID: USB-C-003)
4. Click shopping cart icon (top-right corner)
5. Verify cart shows 2 items
6. Click "Proceed to Checkout"
7. On checkout page, enter promo code: "SAVE20" in discount code field
8. Click "Apply" button next to promo code field
9. Observe discount applied: Cart total changes from $45.00 to $36.00
10. Click "Continue to Payment"
11. Select "Credit Card" as payment method
12. Enter test card details:
    - Card Number: 4242 4242 4242 4242
    - Exp: 12/25
    - CVV: 123
13. Click "Place Order" button
14. Observe error appears

Example 2: Search Bug

Steps to Reproduce:
1. Navigate to https://example.com
2. Ensure not logged in (use incognito window)
3. Click search bar at top of page
4. Type: "O'Reilly" (include apostrophe)
5. Press Enter or click Search icon
6. Observe: No results found (Expected: Books by O'Reilly)

Alternative search queries that also fail:
- "Jack & Jill"
- "AT&T"
- Any query containing special characters: ' " & < >

Example 3: Timing-Dependent Bug

Steps to Reproduce:
1. Login as user: admin@example.com
2. Navigate to Reports → Generate Monthly Report
3. Select date range: Sept 1-30, 2025
4. Click "Generate Report" button
5. IMMEDIATELY (within 2 seconds) click browser back button
6. Navigate forward to Reports page again
7. Observe: Report shows as "In Progress" but never completes

Note: Bug does NOT occur if you wait 5+ seconds before clicking back.

Minimal Reproduction Steps

After writing steps, try to minimize them:

Initial steps (10 steps):
1. Login
2. Navigate to dashboard
3. Click profile
4. Edit profile
5. Add phone number
6. Save
7. Navigate to settings
8. Click notifications
9. Enable SMS notifications
10. Observe error

Minimized (4 steps):
1. Login as user with phone number saved
2. Navigate to Settings → Notifications
3. Toggle "Enable SMS Notifications" to ON
4. Observe error: "Phone number invalid"

→ Steps 1-6 were unnecessary if we use precondition "User has phone number saved"

Benefits of minimal steps:

  • Faster for developers to reproduce
  • Clearer root cause
  • Easier to test fix

Component 5: Expected vs Actual Results

Expected Result

What should happen according to requirements/common sense.

Expected Result:
- Order confirmation page displays
- Confirmation email sent to user@example.com
- Order appears in "My Orders" with status "Processing"
- Payment charged to credit card
- Inventory decremented for purchased items

Actual Result

What actually happens, including exact error messages.

Actual Result:
- Page displays error: "Payment processing failed"
- Error code shown: ERR_PAYMENT_TIMEOUT_500
- No confirmation email received
- Order does NOT appear in "My Orders"
- Credit card NOT charged
- Inventory NOT decremented
- Browser console shows: "TypeError: Cannot read property 'transactionId' of undefined"

Best Practices

1. Be Specific About What’s Wrong

❌ Bad:
Actual Result: It doesn't work

✅ Good:
Actual Result:
- "Submit" button is grayed out (unclickable)
- Form shows error: "Invalid email format" under email field
- Email field shows value: "test@example.com" (which is valid format)

2. Include Exact Error Messages

❌ Bad:
Actual Result: Error message appears

✅ Good:
Actual Result: Error message displays:
"Error 500: Internal Server Error
Unable to process payment at this time. Please try again later.
Transaction ID: TXN-2025-10-01-1234"

3. Quote Error Messages Exactly

Use quotation marks for exact text:

Actual Result:
Error banner displays: "Oops! Something went wrong. Error code: 404"
(Note: "Oops" has capitalized O, "went wrong" has no comma)

4. Include All Visible Changes

Expected Result:
- "Add to Cart" button changes to "Added!"
- Cart icon shows badge with "1"
- Success notification appears briefly

Actual Result:
- "Add to Cart" button DOES change to "Added!" ✅
- Cart icon badge DOES update to "1" ✅
- Success notification does NOT appear ❌ (This is the bug)

Expected vs Actual: Examples

Example 1: Visual Bug

Expected Result:
- Product image displays at 300x300px
- Image is centered in product card
- Image has 10px border radius (rounded corners)
- Image loads within 1 second

Actual Result:
- Product image displays at 150x300px (wrong aspect ratio, stretched)
- Image is aligned to left (not centered)
- Image has 0px border radius (sharp corners)
- Image loads correctly within 1 second ✅

Example 2: Calculation Bug

Expected Result:
Cart total calculation:
- Subtotal: $100.00 (2 items @ $50 each)
- Discount (20%): -$20.00
- Shipping: $5.00
- Tax (10%): $8.50 (calculated on $100 - $20 + $5 = $85)
- Total: $93.50

Actual Result:
- Subtotal: $100.00 ✅
- Discount (20%): -$20.00 ✅
- Shipping: $5.00 ✅
- Tax (10%): $10.00 ❌ (calculated on $100 instead of $85)
- Total: $95.00 ❌ (should be $93.50)

→ Bug: Tax calculated on subtotal before discount applied

Example 3: Performance Bug

Expected Result:
- Page load time: <3 seconds
- Search results appear: <1 second after query
- Page remains responsive during search

Actual Result:
- Page load time: 12 seconds ❌
- Search results appear: 8 seconds after query ❌
- Page freezes (unresponsive) during search ❌
- Browser console shows warning: "Long task took 6234ms"

Component 6: Severity and Priority

Understanding severity and priority is critical - for comprehensive coverage, see Bug Anatomy.

Severity: Impact on System

Severity = How bad is the bug?

SeverityDefinitionExample
Critical (S1)System crash, data loss, security breachPayment system down, user data exposed
High (S2)Major feature broken, no workaroundCannot complete checkout, cannot login
Medium (S3)Feature partially broken, workaround existsFilter doesn’t work, can manually scroll
Low (S4)Minor issue, cosmeticButton misaligned, typo in text

Priority: Urgency of Fix

Priority = How soon must it be fixed?

PriorityDefinitionExample
P1 (Urgent)Fix immediately (hotfix)Production payment failure
P2 (High)Fix in current sprintMajor feature broken in beta
P3 (Medium)Fix in next sprintMinor feature issue
P4 (Low)Fix when possibleCosmetic issues

Severity vs Priority Matrix

               │  P1    │  P2    │  P3    │  P4
               │ Urgent │  High  │ Medium │  Low
───────────────┼────────┼────────┼────────┼────────
S1 Critical    │   🔴   │   🟠   │   ⚪   │   ⚪
───────────────┼────────┼────────┼────────┼────────
S2 High        │   🟠   │   🟠   │   🟡   │   ⚪
───────────────┼────────┼────────┼────────┼────────
S3 Medium      │   🟡   │   🟡   │   🟢   │   ⚪
───────────────┼────────┼────────┼────────┼────────
S4 Low         │   ⚪   │   🟢   │   🟢   │   🔵

🔴 Critical - Fix immediately
🟠 High - Fix within 24 hours
🟡 Medium - Fix within sprint
🟢 Normal - Fix in next sprint
🔵 Low - Backlog
⚪ Unlikely combination

Real-World Examples

Example 1: Critical Severity, Urgent Priority (S1/P1)

Bug: Payment gateway returns 500 error for ALL transactions

Impact:
- 100% of customers cannot complete purchases
- Revenue completely stopped
- High customer support volume
- Potential revenue loss: $10,000/hour

Severity: S1 Critical
Priority: P1 Urgent (Immediate hotfix required)

Example 2: High Severity, Medium Priority (S2/P3)

Bug: Export to PDF feature broken in admin dashboard

Impact:
- Admins cannot generate PDF reports
- Workaround: Use CSV export instead
- Affects: 5 admin users
- Production: Not blocking customer-facing features

Severity: S2 High (major feature broken)
Priority: P3 Medium (fix in next sprint; workaround exists)

Example 3: Low Severity, High Priority (S4/P2)

Bug: Company logo displays incorrectly on homepage

Impact:
- Visual/branding issue only
- No functional impact
- Highly visible (homepage)
- CEO noticed and escalated
- Marketing campaign launches tomorrow

Severity: S4 Low (cosmetic)
Priority: P2 High (high visibility, executive request)

User Impact Assessment

Include who is affected and how many:

User Impact:
- Affected Users: All premium users (est. 5,000 users)
- User Flow Blocked: Cannot access premium content
- Workaround: None
- Customer Support Tickets: 23 tickets in last 2 hours
- Business Impact: Premium feature unavailable, potential cancellations

→ Justifies High Severity, Urgent Priority

Component 7: Attachments (Screenshots, Videos, Logs)

Screenshots: Best Practices

1. Annotate Your Screenshots

- ❌ Bad: Raw screenshot with no annotations
- ✅ Good: Screenshot with:
   - Red arrow pointing to bug
   - Red circle highlighting issue
   - Text annotation explaining problem

Tools for annotation:

  • Snagit
  • Greenshot (Windows, free)
  • Skitch (Mac, free)
  • CloudApp
  • Built-in OS tools (macOS: Cmd+Shift+4+5)

2. Capture Full Context

Include:
- Entire browser window (shows URL, browser version)
- Relevant UI elements around the bug
- Error messages in full
- Console/network tab if relevant

3. Multiple Screenshots for Multi-Step Bugs

Attachment 1: screenshot_step3_cart.png
   → Shows cart with 2 items before clicking checkout

Attachment 2: screenshot_step5_promo_applied.png
   → Shows discount applied successfully

Attachment 3: screenshot_step7_error.png
   → Shows error when clicking "Place Order"

4. Screenshot Naming Convention

❌ Bad: image1.png, screenshot.png, Screen Shot 2025-10-01 at 2.45.23 PM.png

✅ Good:
- bug-checkout-payment-error.png
- step3-cart-before-checkout.png
- console-error-payment-timeout.png
- network-tab-500-error.png

Screen Recordings: When and How

When to Use Video:

  • Bug requires multiple interactions
  • Timing-dependent bugs
  • Animation/transition bugs
  • Hover states or tooltips
  • Intermittent bugs
  • Complex user flows

Recording Tools:

  • Loom (web-based, free tier)
  • CloudApp
  • ScreenToGif (Windows, free, creates GIF)
  • QuickTime (Mac, built-in)
  • OBS Studio (free, open-source)

Video Best Practices:

✅ Good video recording:
1. Start recording before reproducing bug
2. Show URL bar (shows environment)
3. Narrate steps if possible ("Now I'm clicking checkout...")
4. Keep video < 2 minutes (edit if longer)
5. Pause at error/bug moment (3-5 seconds)
6. Show relevant browser console if applicable

File format: MP4 or GIF (if short)
Max size: <50MB (compress if needed)

Example Video Structure:

0:00-0:05 - Show starting state (logged in, cart with items)
0:05-0:15 - Click through checkout steps
0:15-0:20 - Apply promo code
0:20-0:30 - Enter payment details
0:30-0:35 - Click "Place Order"
0:35-0:45 - Error appears (pause here for 5 seconds)
0:45-0:50 - Show browser console with error

Browser Console Logs

When to Include Console:

  • JavaScript errors
  • Network errors (failed API calls)
  • Performance issues
  • Third-party integration issues

How to Capture Console:

1. Open Developer Tools (F12 or Cmd+Option+I)
2. Go to Console tab
3. Reproduce bug
4. Right-click in console → "Save as..."
   OR
   Take screenshot of console

Include:
- Error messages (in red)
- Warning messages (in yellow)
- Failed network requests
- Stack traces

Console Log Example:

Attachment: console-error-payment.txt

Content:
---
payment.js:142 Uncaught TypeError: Cannot read property 'transactionId' of undefined
    at processPayment (payment.js:142)
    at submitOrder (checkout.js:89)
    at HTMLButtonElement.<anonymous> (checkout.js:45)

POST https://api.example.com/payments 500 (Internal Server Error)

Payload sent:
{
  "amount": 9350,
  "currency": "USD",
  "promo_code": "SAVE20"
}

Response:
{
  "error": "Internal server error",
  "code": "ERR_PAYMENT_TIMEOUT_500"
}
---

Network Tab Information

For API/Backend Bugs:

Include:
- Request URL
- Request Method (GET, POST, etc.)
- Request Headers
- Request Payload
- Response Status Code
- Response Body

Network Tab Screenshot Should Show:

Attachment: network-tab-payment-500-error.png

Visible in screenshot:
- Request: POST /api/v2/payments
- Status: 500 Internal Server Error
- Response time: 5.2s (timeout)
- Request payload visible
- Response body visible

HAR Files (HTTP Archive)

For complex network issues:

How to export HAR file:
1. Open Developer Tools
2. Go to Network tab
3. Check "Preserve log"
4. Reproduce bug
5. Right-click in Network tab → "Save all as HAR with content"

Attachment: checkout-payment-failure.har

⚠️ Warning: Scrub sensitive data (passwords, tokens, credit cards) before sharing!

Logs from Application

For server-side or mobile bugs:

Attachment: application-error.log

Content:
---
[2025-10-01 14:35:22] ERROR: Payment processing failed
[2025-10-01 14:35:22] User ID: 12345
[2025-10-01 14:35:22] Order ID: ORD-2025-10-001234
[2025-10-01 14:35:22] Payment Gateway Response: TIMEOUT
[2025-10-01 14:35:22] Stack trace:
  at PaymentService.processPayment (PaymentService.java:142)
  at CheckoutController.submitOrder (CheckoutController.java:89)
---

Component 8: Additional Information

Frequency

How often does the bug occur?

Frequency: Always (100%) — Occurs every time steps are followed

Frequency: Often (75%) — Occurs 3 out of 4 times

Frequency: Sometimes (25-50%) — Intermittent, occurred 3 times out of 10 attempts

Frequency: Rare (<10%) — Occurred twice in 30 attempts

Frequency: Once — Only observed once, cannot reproduce

Frequency affects priority:

  • Always → Higher priority (reliable reproduction)
  • Intermittent → May need more investigation
  • Once → May be difficult to fix (hard to reproduce)

Workaround

If temporary solution exists:

Workaround:
- Use "Express Checkout" instead of "Standard Checkout"
- OR manually navigate to /checkout/express
- This bypasses the promo code step and allows order completion
- Limitation: User cannot apply promo code with this workaround

Impact: Reduces severity from S1 to S2 (major but has workaround)

Test Data

Specific data used:

Test Data:
- User Account: test-premium@example.com / Test123!
- Credit Card: 4242 4242 4242 4242 (Stripe test card)
- Promo Code: SAVE20 (20% discount, expires 2025-12-31)
- Products in cart:
  * Wireless Mouse (SKU: WM-001) - $25.00
  * USB Cable (SKU: USB-C-003) - $20.00
- Shipping Address: 123 Main St, San Francisco, CA 94105

Link to similar or related issues:

Related Bugs:
- BUG-456: Similar payment timeout issue with different promo code
- BUG-489: Checkout fails for orders >$500 (may be same root cause)

Possibly Related:
- BUG-423: Payment gateway slow response times (performance issue)

Regression Information

If bug is a regression:

Regression: YES
- Worked in: v3.4.1 (Build #442)
- Broken in: v3.5.0 (Build #455)
- Likely cause: Recent changes to payment processing module (PR #789)

This information helps developers narrow down the root cause significantly.

Perfect Bug Report Example

Example 1: Web Application Bug

**Title:** Checkout fails with 500 error when applying promo code "SAVE20" to cart >$100

**Environment:**
- Application: E-commerce Web App v3.5.2 (Build #456)
- URL: https://staging.example.com
- Browser: Chrome 120.0.6099.109
- OS: macOS Sonoma 14.2.1
- User Account: test-premium@example.com (Premium, registered 2025-09-01)
- Network: WiFi

**Severity:** S1 Critical
**Priority:** P1 Urgent

**Preconditions:**
- User logged in as premium member
- Promo code "SAVE20" exists in system (20% discount, expires 2025-12-31)
- Cart total must be >$100 after adding items

**Steps to Reproduce:**
1. Navigate to https://staging.example.com
2. Login with test-premium@example.com / Test123!
3. Add "Wireless Mouse" (SKU: WM-001, $25) to cart
4. Add "USB Cable" (SKU: USB-C-003, $20) to cart
5. Add "Keyboard" (SKU: KB-005, $60) to cart
6. Verify cart total shows $105.00
7. Click "Proceed to Checkout"
8. On checkout page, enter promo code: "SAVE20" in discount field
9. Click "Apply" button
10. Observe discount applied: Total changes from $105.00 to $84.00
11. Select payment method: "Credit Card"
12. Enter test card: 4242 4242 4242 4242, Exp: 12/25, CVV: 123
13. Click "Place Order" button

**Expected Result:**
- Order processes successfully
- Confirmation page displays with order number
- Confirmation email sent to test-premium@example.com
- Order appears in "My Orders" with status "Processing"
- Payment of $84.00 charged to card

**Actual Result:**
- Page displays error: "Payment processing failed. Please try again later."
- Error code displayed: ERR_PAYMENT_TIMEOUT_500
- No confirmation email received
- Order does NOT appear in "My Orders"
- Credit card NOT charged
- Browser console shows: "POST https://api.staging.example.com/payments 500 (Internal Server Error)"
- Console error: "TypeError: Cannot read property 'transactionId' of undefined at processPayment (payment.js:142)"

**Frequency:** Always (100%) — Reproduced 5 times consistently

**User Impact:**
- Affects: All users (premium and standard) applying promo code to orders >$100
- Customer support tickets: 12 tickets in last hour
- Estimated affected users: 50+ in last 24 hours
- Business impact: Lost revenue, customer frustration

**Workaround:**
- Remove promo code before checkout (user pays full price)
- OR use orders <$100 (discount works correctly)
- Limitation: Users cannot get promo discount on large orders

**Attachments:**
1. screenshot-step10-discount-applied.png (Shows $84 total after discount)
2. screenshot-step13-error-message.png (Shows error after clicking Place Order)
3. console-error-log.txt (Full console output with stack trace)
4. network-tab-500-error.png (Shows failed API request details)
5. checkout-flow.mp4 (30-second screen recording of full repro)

**Additional Notes:**
- Bug does NOT occur with cart totals <$100
- Bug does NOT occur without promo code
- Different promo code "WELCOME10" also triggers same error
- Regression: Worked in v3.4.1, broken since v3.5.0 deployment
- Possibly related to BUG-456 (payment timeout issues)

**Test Data:**
- Promo code tested: SAVE20
- Products in cart: WM-001, USB-C-003, KB-005
- Cart total before discount: $105.00
- Cart total after discount: $84.00
- Credit card: Stripe test card 4242...

Example 2: Mobile App Bug

**Title:** App crashes when uploading profile picture >5MB on iPhone 14

**Environment:**
- Application: Mobile Banking App v2.3.0 (Build #234)
- Device: iPhone 14 Pro (Model: MQ0G3LL/A)
- iOS Version: 17.2.1
- Storage Available: 32GB free
- User Account: testuser@bank.com (Checking account holder)
- Network: WiFi (50 Mbps)

**Severity:** S2 High
**Priority:** P2 High

**Preconditions:**
- User logged into app
- Photo library contains image >5MB
- User has not yet set profile picture

**Steps to Reproduce:**
1. Open Mobile Banking App
2. Tap profile icon (top-right corner)
3. Tap "Edit Profile"
4. Tap profile picture placeholder
5. Tap "Choose from Library"
6. Allow photo access (if prompted)
7. Select photo: IMG_5847.JPG (File size: 8.2MB, 4032x3024px)
8. Tap "Choose"

**Expected Result:**
- Image uploads successfully
- Profile picture updates to selected image
- User returned to profile screen
- Success message: "Profile picture updated"

**Actual Result:**
- Progress indicator shows (spinner)
- After 2-3 seconds, app crashes completely
- User returned to iOS home screen
- Upon reopening app, profile picture NOT updated
- App crash log generated

**Frequency:** Always (100%) with images >5MB

**User Impact:**
- Affects: Users with high-resolution images from newer iPhones
- Estimated: 30% of users have images >5MB in library
- Workaround exists (see below)

**Workaround:**
1. Use third-party app to compress image <5MB
2. Upload compressed image
Limitation: Requires extra steps, lower image quality

**Attachments:**
1. crash-log-profile-picture.txt (iOS crash log)
2. test-image-8.2MB.jpg (Sample image that triggers crash)
3. screen-recording-crash.mp4 (Video showing crash)
4. xcode-console-output.txt (Xcode debugger output)

**Additional Notes:**
- Images <5MB upload successfully
- Bug occurs on iPhone 13, 14, 15 (tested)
- Bug does NOT occur on iPad Pro (tested)
- Crash log shows: "Memory warning level 2" before crash
- Likely cause: Image not resized before upload, causing memory issue

**Test Data:**
- Test image 1: IMG_5847.JPG (8.2MB) → Crash
- Test image 2: IMG_5848.JPG (4.8MB) → Success
- Test image 3: IMG_5849.JPG (12.5MB) → Crash

Communication Best Practices

Tone and Language

1. Be Professional, Not Emotional

❌ Bad:
"This is ridiculous! The checkout is completely broken AGAIN. How did this even pass code review?"

✅ Good:
"Checkout fails with 500 error when applying promo codes. This is a regression from v3.4.1."

2. Focus on Facts, Not Blame

❌ Bad:
"The developers obviously didn't test this feature at all."

✅ Good:
"This scenario may not have been covered in testing. Suggested test case: Promo codes on orders >$100."

3. Use Neutral Language

- ❌ Accusatory: "You broke the payment system"
- ✅ Neutral: "Payment system returns error since v3.5 deployment"

- ❌ Emotional: "This is a disaster!"
- ✅ Factual: "This blocks all checkout transactions (S1 Critical)"

Collaboration, Not Confrontation

Bug reports are communication tools, not weapons.

Good collaboration:

  • “Happy to provide more details if needed”
  • “I can test a fix on staging when ready”
  • “Let me know if you can’t reproduce—I’ll record video”
  • “Possibly related to PR #789? (Just a thought)”

Building trust:

  • Acknowledge good fixes: “Thanks for the quick fix! Verified in staging ✅”
  • Admit mistakes: “My error—this was misconfiguration, not a bug. Closing.”
  • Offer help: “I can help investigate if needed”

Following Up on Bug Reports

1. Respond Promptly to Questions

Developer asks: "Can you test with promo code 'WELCOME10'?"

✅ Good response (within hours):
"Tested with WELCOME10—same 500 error occurs. Also tested FREESHIP—works fine.
Appears to be specific to percentage-based promo codes."

2. Verify Fixes Thoroughly

When bug marked "Fixed":

✅ Good verification:
"Verified fix in staging (Build #460):
- Tested original repro steps—no error ✅
- Tested with different promo codes (SAVE20, SAVE10, WELCOME15)—all work ✅
- Tested with cart totals: $50, $100, $500—all work ✅
- Tested as premium and standard user—both work ✅

Marking as Verified. Great fix!"

3. Reopen Thoughtfully

If bug reoccurs:

✅ Good reopen comment:
"Reopening: Issue reoccurs in Production (Build #461) but NOT in Staging (Build #460).
Possible environment difference?

New findings:
- Staging uses promo code service v2.1
- Production uses promo code service v2.0 (checked with DevOps)

This may explain discrepancy."

Managing Difficult Situations

Situation 1: Developer Can’t Reproduce

Developer comments: "Cannot reproduce. Works fine for me."

✅ Good response:
"Thanks for trying. Let me provide more details:
1. Screen recording attached (repro-full-flow.mp4)
2. I can reproduce on staging but NOT on dev environment
3. Checked with Sarah (QA)—she reproduces it too
4. Happy to do screenshare/pair debugging if helpful

Difference I noticed: Dev uses SQLite, Staging uses PostgreSQL.
Could this be database-related?"

Situation 2: Bug Marked “Working as Designed”

Developer closes as "Not a bug—working as designed"

✅ Good response:
"Thanks for clarifying. I see from your comment this is intentional behavior.

However, from user perspective this is confusing because:
- Promo code appears to apply (discount shows)
- Error only appears at final step
- No indication that promo codes don't work with orders >$100

Suggestion: Could we add validation earlier in flow?
E.g., Show message when applying code: 'This promo code is valid for orders under $100'

Should I create this as a feature request instead?"

For more on the complete bug lifecycle, see Defect Life Cycle.

Situation 3: Bug Low-Prioritized Despite High User Impact

Bug marked P3 (Medium) but you believe it should be P1:

✅ Good response:
"Understood this is prioritized as P3.

Want to provide additional context:
- 45 customer support tickets in last 24 hours (attached report)
- Estimated 200 users affected based on analytics
- Payment success rate dropped from 95% to 78% since deployment
- Business impact: ~$5,000 lost revenue per day

Would stakeholders like to reconsider priority given this impact?
Happy to present data in standup/planning."

Bug Report Templates

Simple Template (For Quick Bugs)

**Title:** [Component] + [what fails] + [when/condition]

**Environment:** [Version, Browser/Device, OS]

**Steps:**
1. Step one
2. Step two
3. Observe bug

**Expected:** [What should happen]

**Actual:** [What actually happens]

**Severity/Priority:** [S#/P#]

**Screenshot:** [Attach if applicable]

Comprehensive Template

**Title:**

**Environment:**
- Application:
- URL/Version:
- Browser/Device:
- OS:
- User Account:

**Severity:**  S__ (Critical/High/Medium/Low)
**Priority:**  P__ (Urgent/High/Medium/Low)

**Preconditions:**
-
-

**Steps to Reproduce:**
1.
2.
3.

**Expected Result:**
-
-

**Actual Result:**
-
-

**Frequency:** [Always / Often / Sometimes / Rare / Once]

**User Impact:**
- Affected users:
- Impact:

**Workaround:** [If exists]

**Attachments:**
-
-

**Additional Notes:**
-
-

**Test Data:**
-

API Bug Report Template

**Title:** [Endpoint] returns [status code] for [condition]

**Environment:**
- API Version:
- Endpoint:
- Environment: [Dev/Staging/Prod]
- Timestamp:

**Request:**

Method: POST URL: https://api.example.com/v2/payments Headers: Authorization: Bearer Content-Type: application/json

Body: { “amount”: 9350, “currency”: “USD”, “promo_code”: “SAVE20” }


**Expected Response:**

Status: 200 OK Body: { “transaction_id”: “TXN-xxx”, “status”: “success” }


**Actual Response:**

Status: 500 Internal Server Error Body: { “error”: “Internal server error”, “code”: “ERR_PAYMENT_TIMEOUT_500” }


**Frequency:**

**Additional Info:**
- Response time:
- Server logs:

Conclusion: Mastering Bug Reporting

Excellent bug reporting is a skill that sets great QA professionals apart. Key takeaways:

1. Essential Components

  • Clear, specific title
  • Complete environment details
  • Exact steps to reproduce
  • Expected vs actual results
  • Appropriate severity/priority
  • Supporting attachments

2. Quality Over Quantity

  • One clear, detailed bug report > Five vague ones
  • Invest time upfront to save everyone time later
  • Minimize reproduction steps without losing clarity

3. Supporting Evidence

  • Screenshots (annotated)
  • Screen recordings (for complex flows)
  • Console logs and error messages
  • Network requests/responses

4. Professional Communication

  • Neutral, factual tone
  • Focus on facts, not blame
  • Collaborative approach
  • Responsive to questions

5. Think Like a Developer

  • “Can I reproduce this from these steps?”
  • “Do I have all information I need?”
  • “What’s the root cause likely to be?”

Next Steps:

  1. Review your recent bug reports—how can they improve?
  2. Create templates for your team
  3. Share this guide with team members
  4. Practice writing one “perfect” bug report this week
  5. Ask developers for feedback on your bug reports
  6. Celebrate when bugs get fixed quickly due to your clear reports!

Remember: Your bug reports are your professional reputation. Every well-written bug report:

  • Saves developer time
  • Gets bugs fixed faster
  • Builds trust and respect
  • Improves product quality
  • Advances your career

Write bug reports developers love, and watch your impact multiply!