Clerk integration

Clerk Webhook Monitoring that catches missed sign-ups.

Every user.created, user.updated, and session.created event tracked, with Svix signature verification and dedup-by-message-id built in. Wrap your handler once — get a real-time dashboard, alerts, and replay protection.

Why monitor Clerk webhooks specifically?

Clerk webhooks drive your downstream data: user provisioning, billing sync, welcome emails, downstream profile creation. A silent failure here means new users never get the rest of their account set up — and the only signal is confused support tickets days later. Outworx surfaces every drop in real time.

Svix signature verification

Built-in Svix HMAC verification with timestamp tolerance. Invalid signatures get 401 before your handler.

Idempotency

Dedupe on svix-id. Retries return the cached response — no duplicate user provisioning.

Per-event metrics

Latency and success rate per event type — user.created vs session.created vs organization.updated.

Real-time alerts

Slack, Discord, or email when a single event type starts failing — not just when everything breaks.

60-second install

Wrap your existing Clerk webhook handler. The SDK verifies the Svix signature, handles dedup via svix-id, and ships telemetry to your dashboard.

Next.js (App Router)

app/api/webhooks/clerk/route.ts
// app/api/webhooks/clerk/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(
  {
    // Clerk uses Svix under the hood — Svix verification covers it.
    provider: 'clerk',
    signatureSecret: process.env.CLERK_WEBHOOK_SECRET!,
    eventTypeField: 'type',
    // Svix message ID is per-delivery — perfect for deduping retries.
    idempotencyKey: (_req, _body, headers) => headers['svix-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/clerk',
  withWebhookMonitoring({
    provider: 'clerk',
    signatureSecret: process.env.CLERK_WEBHOOK_SECRET!,
    eventTypeField: 'type',
    idempotencyKey: (_req, _body, headers) => headers['svix-id'],
  }),
  (req, res) => res.json({ received: true })
);

Fastify, FastAPI, Flask, and Django adapters available — see the full SDK reference.

v1.5 · silent drops

When your user.created handler returns 200 but skipped a profile-creation step, you're missing users with no error to show for it. We catch that. Guide →

v1.5 · signature diagnostics

When the Svix-style svix-signature header fails to verify, we surface the exact reason (timestamp drift, malformed whsec_ secret, body re-parsed) and the fix.

Don't lose a single sign-up.

Free forever for 1,000 events/month. No credit card. Install in 60 seconds.

Start Free