Integrations / Auth & Identity / Clerk
Connect Clerk's user.created webhook to LogIt and get a notification the instant someone signs up โ with email, name, and OAuth provider.
In your Clerk dashboard, go to Webhooks โ Add Endpoint and point it at https://yourdomain.com/api/webhooks/clerk.
Select the user.created event.
npm install logit svix
The svix package verifies Clerk's webhook signature.
// app/api/webhooks/clerk/route.ts
import { headers } from "next/headers";
import { Webhook } from "svix";
import { init } from "logit";
const logit = init({ token: process.env.LOGIT_API_KEY! });
interface ClerkUserCreatedEvent {
type: "user.created";
data: {
id: string;
email_addresses: Array<{ email_address: string }>;
first_name: string | null;
last_name: string | null;
external_accounts: Array<{ provider: string }>;
};
}
export async function POST(req: Request) {
const body = await req.text();
const headersList = await headers();
const wh = new Webhook(process.env.CLERK_WEBHOOK_SECRET!);
const event = wh.verify(body, {
"svix-id": headersList.get("svix-id")!,
"svix-timestamp": headersList.get("svix-timestamp")!,
"svix-signature": headersList.get("svix-signature")!,
}) as ClerkUserCreatedEvent;
if (event.type === "user.created") {
const { id, email_addresses, first_name, last_name, external_accounts } = event.data;
const email = email_addresses[0]?.email_address ?? "unknown";
const name = [first_name, last_name].filter(Boolean).join(" ") || "Anonymous";
const provider = external_accounts[0]?.provider ?? "email";
await logit.now("signups", {
event: "New user signed up via Clerk",
description: `${name} (${email})`,
icon: "๐ค",
notify: true,
tags: { provider },
metadata: { clerkUserId: id, email, name, provider },
});
}
return new Response("ok");
}
LOGIT_API_KEY=lk_live_xxxxxxxxxxxxxxxx
CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxx
Ready to connect Clerk?
7-day free trial. No credit card required.