Guides / Signups & Auth
Clerk fires a user.created webhook event every time a new account is created — via email/password, Google, GitHub, or any OAuth provider. We catch that event and send it to LogIt.
npm install logit svix
svix is used to verify Clerk's webhook signature.
// app/api/webhooks/clerk/route.ts (Next.js App Router)
import { headers } from "next/headers";
import { Webhook } from "svix";
import { init } from "logit";
const logit = init({ token: process.env.LOGIT_API_KEY! });
interface UserCreatedEvent {
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 UserCreatedEvent;
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?.replace("oauth_", "") ?? "email";
await logit.now("signups", {
event: "New user via Clerk",
description: `${name} (${email}) — ${provider}`,
icon: "👤",
notify: true,
tags: { provider },
metadata: { clerkId: id, email, name },
});
}
return new Response("ok");
}
https://yourdomain.com/api/webhooks/clerkuser.createdCLERK_WEBHOOK_SECRETLOGIT_API_KEY=lk_live_xxxxxxxx
CLERK_WEBHOOK_SECRET=whsec_xxxxxxxx
Try LogIt free
7-day trial. No credit card required.