Stripe Webhook Monitoring that catches failures first.
Every checkout.session.completed, invoice.payment_failed, and customer.subscription.deleted tracked, with signature verification and idempotency built in. Wrap your handler once — get a real-time dashboard, alerts, and replay protection.
Why monitor Stripe webhooks specifically?
Stripe retries failed deliveries with exponential backoff for up to three days. That sounds forgiving — until a single misconfigured handler fans out into thousands of duplicate retries, signature mismatches go unnoticed, or a 5xx slips past your logs while subscriptions silently fail to provision. Outworx Hooks surfaces all of it.
Signature verification
Built-in HMAC-SHA256 with replay protection. Invalid requests get 401 before your handler runs.
Idempotency
Dedupe by Stripe event ID. Retries return the cached response — no double-charges.
Latency tracking
P50/P95/P99 per event type. Spot regressions before they trigger Stripe's timeout retries.
Real-time alerts
Slack, Discord, or email when failure rate spikes or a handler starts erroring.
60-second install
Wrap your existing Stripe webhook handler. The SDK auto-verifies signatures, handles idempotency, and ships telemetry to your dashboard. Your handler runs unchanged.
Next.js (App Router)
// app/api/webhooks/stripe/route.ts
import { init } from '@outworx/hooks';
import { withWebhookMonitoring } from '@outworx/hooks/nextjs';
init({ apiKey: process.env.OUTWORX_HOOKS_API_KEY! });
export const POST = withWebhookMonitoring(
{
provider: 'stripe',
signatureSecret: process.env.STRIPE_WEBHOOK_SECRET!,
idempotencyKey: (_req, body) => (body as any).id,
},
async (req) => {
const body = await req.json();
// Signature verified, duplicates filtered — handle the event.
return Response.json({ received: true });
}
);Express
import express from 'express';
import { init } from '@outworx/hooks';
import { withWebhookMonitoring } from '@outworx/hooks/express';
init({ apiKey: process.env.OUTWORX_HOOKS_API_KEY });
const app = express();
// Stash raw body so signature verification works.
app.use(express.json({
verify: (req, _res, buf) => {
(req as any).rawBody = buf.toString('utf8');
},
}));
app.post(
'/webhooks/stripe',
withWebhookMonitoring({
provider: 'stripe',
signatureSecret: process.env.STRIPE_WEBHOOK_SECRET!,
idempotencyKey: (_req, body) => (body as any).id,
}),
(req, res) => res.json({ received: true })
);Fastify, FastAPI, Flask, and Django adapters available — see the full SDK reference.
What you'll see in the dashboard
- Event feed — every Stripe event with type, status code, latency, and signature validity.
- Failure rate by event type — pinpoint whether
invoice.payment_failedorcharge.refundedis misbehaving. - Latency percentiles — P50/P95/P99 so you know when you're close to Stripe's 30-second timeout.
- Duplicate retry detection — events tagged when idempotency catches a Stripe re-delivery.
- Silent drop detection v1.5 — when your handler returns 200 OK but never actually processed the charge. Stripe thinks delivery succeeded; we tell you it didn't. Learn more.
- Signature failure diagnostics v1.5 — when
Stripe-Signatureverification fails, the dashboard shows the specific reason (timestamp drift, wrong secret, body got re-serialized) and the likely fix.
Ship it before your next Stripe event.
Free forever for 1,000 events/month. No credit card. Install in 60 seconds.
Start Free