<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Prince Bobo</title>
    <description>The latest articles on DEV Community by Prince Bobo (@prince_bobo_33047eed6249f).</description>
    <link>https://dev.to/prince_bobo_33047eed6249f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3643664%2Fff5a9506-c34b-4d77-a207-f4767604ce37.png</url>
      <title>DEV Community: Prince Bobo</title>
      <link>https://dev.to/prince_bobo_33047eed6249f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prince_bobo_33047eed6249f"/>
    <language>en</language>
    <item>
      <title>I Built an AI-Native Webhook Inspector &amp; Relay in 6 Weeks — Here’s What I Learned</title>
      <dc:creator>Prince Bobo</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:47:43 +0000</pubDate>
      <link>https://dev.to/prince_bobo_33047eed6249f/i-built-an-ai-native-webhook-inspector-relay-in-6-weeks-heres-what-i-learned-1i62</link>
      <guid>https://dev.to/prince_bobo_33047eed6249f/i-built-an-ai-native-webhook-inspector-relay-in-6-weeks-heres-what-i-learned-1i62</guid>
      <description>&lt;p&gt;I built an AI-native webhook inspector in 6 weeks — here's what I learned&lt;/p&gt;

&lt;p&gt;Every developer has lost a webhook.&lt;/p&gt;

&lt;p&gt;Your server restarts. Stripe fires a payment event. It vanishes. No log, no trace, no way to replay it. You find out two hours later when a customer complains their order wasn't processed.&lt;/p&gt;

&lt;p&gt;I spent 3 hours debugging exactly this problem. The fix took 5 minutes. The debugging took 3 hours.&lt;/p&gt;

&lt;p&gt;That was 6 weeks ago. I built Hookdropi to make sure it never happens again.&lt;/p&gt;




&lt;p&gt;What I built&lt;/p&gt;

&lt;p&gt;Hookdropi is an AI-native webhook relay and inspector. Here's what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Captures every webhook permanently&lt;/strong&gt; one URL that never goes down, every event logged in full&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forwards with auto-retry&lt;/strong&gt;  exponential backoff: 5s → 30s → 2m → 10m → dead letter queue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click replay&lt;/strong&gt; replay any past event against any environment instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live event stream&lt;/strong&gt; WebSocket-powered real-time dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI that explains payloads&lt;/strong&gt; plain English explanation of what arrived and why&lt;/li&gt;
&lt;li&gt;Every developer has missed a webhook.
Your server restarts mid-deploy. Stripe fires a payment succeeded event. Your endpoint is down Stripe retries on its schedule (hours later in live mode).
The event doesn’t vanish. But without instant inspection or a reliable relay, it fails to process automatically. You only find out hours later when a customer complains their order wasn’t fulfilled.
I spent 3 hours debugging exactly this problem. The actual fix took 5 minutes. The debugging took 3 hours.
That was 6 weeks ago. So I built Hookdropi to make sure it never happens again.
What I built
Hookdropi is an AI-native webhook relay and inspector. Here’s what it does:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Captures every webhook permanently one URL that never goes down, every event logged in full&lt;br&gt;
Forwards with smart auto-retry exponential backoff: 5s → 30s → 2m → 10m → dead letter queue&lt;br&gt;
One-click replay replay any past event against any environment instantly&lt;br&gt;
Live event stream WebSocket-powered real-time dashboard&lt;br&gt;
AI that explains payloads plain English breakdown of what arrived and why&lt;br&gt;
AI that writes handler code generates complete TypeScript, JavaScript, Python, or Go handlers&lt;br&gt;
AI that diagnoses failures tells you exactly what broke and how to fix it&lt;/p&gt;

&lt;p&gt;The tech stack&lt;br&gt;
I wanted to build something real not a toy project. Here’s the full stack I used:&lt;br&gt;
Backend:&lt;/p&gt;

&lt;p&gt;Node.js + TypeScript across all three services&lt;br&gt;
PostgreSQL 16 with TypeORM and hand-written migrations&lt;br&gt;
Redis + BullMQ for the delivery queue&lt;br&gt;
Express for both the ingestion API and dashboard API&lt;br&gt;
Socket.io for the real-time event stream&lt;/p&gt;

&lt;p&gt;Frontend:&lt;/p&gt;

&lt;p&gt;Next.js 16 with the App Router&lt;br&gt;
Tailwind CSS&lt;br&gt;
Zustand for state management&lt;br&gt;
Socket.io client for live updates&lt;/p&gt;

&lt;p&gt;AI layer:&lt;/p&gt;

&lt;p&gt;Google Gemini (gemini-3-flash-preview)&lt;br&gt;
Results cached in an ai_insights table so the same payload is never analyzed twice&lt;/p&gt;

&lt;p&gt;Payments:&lt;/p&gt;

&lt;p&gt;Paystack (Nigeria-first)&lt;br&gt;
Flutterwave (pan-Africa)&lt;br&gt;
Multi-gateway provider pattern so adding Stripe later is just one new file&lt;/p&gt;

&lt;p&gt;Infrastructure:&lt;/p&gt;

&lt;p&gt;Railway for the three backend services&lt;br&gt;
Neon for managed PostgreSQL&lt;br&gt;
Upstash for managed Redis&lt;br&gt;
Vercel for the frontend&lt;br&gt;
Resend for transactional email&lt;br&gt;
Sentry for error tracking&lt;br&gt;
Mintlify for documentation&lt;/p&gt;

&lt;p&gt;The architecture that surprised me most&lt;br&gt;
I separated the ingestion API from the dashboard API. This was the best decision I made.&lt;br&gt;
The ingestion endpoint needs to respond in under 50 ms. Stripe waits for your 200 OK. If you’re slow, they treat it as a failure and start retrying. By keeping ingestion separate from the heavier dashboard logic, I can scale them independently and keep p99 latency low.&lt;/p&gt;

&lt;p&gt;The flow looks like this:&lt;br&gt;
BashStripe → POST /in/:token&lt;br&gt;
            ↓&lt;br&gt;
     Save event to Postgres (&amp;lt; 10ms)&lt;br&gt;
            ↓&lt;br&gt;
     Enqueue BullMQ job (&amp;lt; 5ms)&lt;br&gt;
            ↓&lt;br&gt;
     Emit Socket.io event (&amp;lt; 2ms)&lt;br&gt;
            ↓&lt;br&gt;
     Return 200 OK (total: &amp;lt; 50ms)&lt;/p&gt;

&lt;p&gt;The delivery worker picks up the job asynchronously and handles all the retry logic separately. The webhook sender never has to wait for delivery.&lt;br&gt;
What I learned about BullMQ&lt;br&gt;
I’d used simple job queues before but never dug into retry logic properly. BullMQ’s exponential backoff is elegant you configure it once and it handles everything:&lt;/p&gt;

&lt;p&gt;TypeScriptawait deliveryQueue.add(&lt;br&gt;
  'deliver',&lt;br&gt;
  { eventId: savedEvent.id, endpointId: endpoint.id },&lt;br&gt;
  {&lt;br&gt;
    attempts: 4,&lt;br&gt;
    backoff: { type: 'exponential', delay: 5000 },&lt;br&gt;
  }&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;That single configuration gives you: first retry at 5s, second at 25s, third at 125s, fourth at 625s. After 4 failures the job moves to the dead letter queue and the user gets an email.&lt;br&gt;
The AI layer took one afternoon&lt;br&gt;
I expected AI integration to be the hardest part. It was actually the easiest.&lt;br&gt;
The key insight: prompt engineering matters more than model choice. My payload explanation prompt is just:&lt;br&gt;
textYou are a webhook expert helping a developer understand an incoming webhook payload.&lt;br&gt;
Explain this webhook payload in 2-3 plain English sentences. Be specific about what &lt;br&gt;
event occurred, what triggered it, and what the key fields mean.&lt;br&gt;
That’s it. Gemini does the rest. I cache results in an ai_insights table so the same payload is never analyzed twice important for cost control.&lt;br&gt;
What I’d do differently&lt;/p&gt;

&lt;p&gt;I’d build the delivery worker first. I built the ingestion API first, which felt logical. But the delivery worker is the core value of the product. Everything else is UI around it.&lt;br&gt;
I’d set up monitoring on day one. I added Sentry and UptimeRobot late. Having visibility from the start would have saved me debugging time.&lt;br&gt;
I’d deploy earlier. I spent too long perfecting things locally. The bugs you only find in production environment variables, CORS, Redis connection strings are best found early.&lt;/p&gt;

&lt;p&gt;The result&lt;br&gt;
Hookdropi is live. Free plan available. Here’s what you get:&lt;/p&gt;

&lt;p&gt;500 events/month on the free plan&lt;br&gt;
Paid plans start at ₦7,500/month (Starter) with AI features unlocked&lt;br&gt;
Paystack and Flutterwave for African developers&lt;br&gt;
Full API for programmatic access&lt;/p&gt;

&lt;p&gt;Try it at hookdropi.qzz.io&lt;br&gt;
Docs at bobprince.mintlify.app&lt;br&gt;
Source on GitHub (link in bio / docs)&lt;br&gt;
If you work with webhooks daily Stripe, GitHub, Paystack, Shopify I’d love for you to try it and tell me what’s missing.&lt;br&gt;
Built in Nigeria 🇳🇬&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>webhook</category>
      <category>developertool</category>
    </item>
  </channel>
</rss>
