Stripe integration

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
// 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

server.ts
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_failed or charge.refunded is 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-Signature verification 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