Engineering · QA Automation

How We Built an AI-Powered Bug Notification
for ~$6 a Month

Our AI-powered bug notification system replaces manual follow-ups and missed alerts with an intelligent defect pipeline using Claude AI, Jira, Slack and Gmail.

Manual bug follow-ups are a silent productivity killer. QA chases developers for updates. Developers miss alerts buried in Jira noise. Critical bugs wait hours for the right person to see them. We built BugPulse to fix that — an automated defect notification pipeline that handles the entire lifecycle, with zero manual intervention.

The Problem

What we are trying to fix

Our team was running into the same friction points every sprint:

  • No automated follow-ups. QA engineers were manually chasing developers for status updates.
  • No escalation path for critical bugs. P1 issues had no dedicated channel — they got lost in general notification noise.
  • Generic alerts. Static Jira notifications gave no context, no urgency, no reproduction steps.
  • Single notification channel. No way to simultaneously alert developers, QA, and product owners through the right channels.

The result: slower response times, missed bugs, and a lot of wasted time on things a system should handle automatically.

problem

Architecture

What BugPulse Does

BugPulse sits between Jira and your team. When a bug is created or updated, it intercepts the event, generates a context-aware notification using Claude AI, and delivers it through Slack and email — with automatic follow-up reminders until the bug is resolved..

Jira Cloud Bug created / updated Webhook Issue type guard Express server Routes event Claude AI Generates message Slack + Gmail #alerts · #critical · Dev · QA · PO Reminder scheduler

Diagram 1 -System Pipeline

Everything is event-driven. No polling. No manual steps.

Implementation

ai bug notification

How It Works

1.Listening to Jira

BugPulse registers a webhook in Jira that fires on issue creation and updates. The first thing it does is filter — only Bug, Defect, Incident, and Error issue types are processed. Tasks, stories, and epics are silently ignored.

Jira’s native priority labels (like “Highest” or “Major”) are normalised to a clean internal scale: P1 through P4. This keeps the escalation logic consistent across different Jira project setups.

2.AI -Generated Notification

Instead of static templates, every notification is written by Claude. The system sends Claude the full bug context — ID, priority, title, assignee, who raised it — and Claude generates a Slack message, an email subject, and a full email body in a single API call.

The result is notifications that read like a human wrote them, with relevant context and urgency that matches the severity of the bug. One practical trick: rather than asking Claude for JSON output, the prompt uses tagged section delimiters like [SLACK_MESSAGE] and [EMAIL_BODY], giving the model room to write naturally while still producing parseable output.

3.Dual-Channel Slack Routing

All bugs go to a #defects-alerts channel. P1 bugs also get routed to a dedicated #critical-bugs channel simultaneously.

Gotcha: Slack's Incoming Webhook API locks to a specific channel at registration time. You can't override the destination dynamically. The only way to post to two different channels is to register and instantiate two separate webhooks.

4.Priority-Based Remainders

Once a bug is notified, BugPulse schedules automatic follow-up reminders based on priority. Reminders stop the moment a bug is resolved, marked as Dev Done, or cancelled. If it’s reopened, the cycle restarts.

Priority Initial alert Reminder 1 Reminder 2 Reminder 3 P1 Critical Instant +2 hours +4 hours +8 hours P2 High Instant +4 hours +12 hours +28 hours P3 Medium Instant +24 hours +48 hours +96 hours P4 Low Instant +72 hours +144 hours +288 hours

Diagram 2 - Reminder cadence by priority

5.Status Driven Lifecycle

BugPulse tracks every status change — In Progress, Dev Done, Cancelled, Reopened — and sends the right notification for each transition. Timers are cleared or restarted accordingly.

Status transition Notification Timer action
→ In Progress ✓ Dev started — team alerted Continue
→ Dev Done ✓ QA testing requested clearReminders()
→ Cancelled ✓ Closure notified clearReminders()
→ Reopened ✓ Reopen + restart cycle scheduleReminders()
Task / Story / Epic update ✕ Filtered at entry point None

6. Startup Catch-Up

Because reminder timers live in memory, a server restart means lost context. On startup, BugPulse queries Jira’s search API for all open bugs created in the last 24 hours and re-schedules any notifications it may have missed.

7. A Simple Bug Creation Form

To reduce context-switching, BugPulse also serves a minimal web form for logging bugs directly — no need to open Jira. Submitting the form creates a Jira issue via the REST API, which fires the webhook and triggers the full notification pipeline automatically.

Cost

What It Costs

ComponentMonthly cost
Claude API (~100 notifications/month)~$0.50
Slack webhooks (2 channels)Free
Gmail via SMTPFree
Cloud hosting (Railway)~$5.00
Total~$5.50 / month

Commercial Jira-Slack plugins run $10–20 per seat per month. For a 10-person team that’s $100–200/month — for far fewer features and no AI-generated context in notifications.

~$6

per month total cost

vs $100–200 for plugins

0

manual follow-ups

fully automated

4

priority levels

P1 through P4

Tech Stack

Tools Used

🟢
Node.js + Express
Event server
🤖
Claude AI (Sonnet)
Message generation
🔗
Jira REST API v3
Webhooks + search
💬
Slack Webhooks
Dual-channel alerts
📧
nodemailer
Gmail SMTP
🚂
Railway
Cloud hosting

Retrospective

What We Learned

Webhook idempotency matters

Jira fires multiple issue_updated events for a single user action. Guard on specific changelog fields, or you’ll send duplicate notifications

In-memory state has limits

setTimeout timers don’t survive restarts. The catch-up routine helps, but a persistent store like SQLite is the right long-term fix.

Jira hides user emails by default

In Jira Cloud, email addresses are not exposed in API responses unless you explicitly configure email visibility in Atlassian Admin.

Tagged delimiters beat JSON mode for LLM output

When you need structured output but also want natural readable prose, using [SECTION_NAME] delimiters in your prompt is a reliable and clean approach.

Roadmap

What's Next

BugPulse is actively evolving. Here’s what we’re planning next:

Railway / Render deploy
Cloud hosting
SQLite persistent store
Survive restarts
5-min polling fallback
Missed webhook safety net
Defect dashboard UI
Live bug tracker view
SLA breach alerting
Deadline warnings
Unassigned P1 watchdog
Auto-escalate orphans
Sprint deadline warnings
End-of-sprint nudges
Multi-workspace Slack
Cross-team support

BugPulse in Production

From weekend prototype to fully operational system — BugPulse now handles the complete defect notification lifecycle automatically, replacing manual QA follow-ups with an intelligent, priority-driven pipeline for ~$6 a month.

sanjeev

Discover more from Lean Impeccable

Subscribe now to keep reading and get access to the full archive.

Continue reading