Skip to main content
You’ll learn how to automatically trigger notification workflows when Clerk events occur, such as user creation, email events, or password changes.

Overview

When specific events happen in Clerk (for example, user signup, password changes, or email verification), this integration will:
  1. Receive the webhook event from Clerk.
  2. Verify the webhook signature.
  3. Process the event data.
  4. Trigger the corresponding Novu notification workflow.
You can also clone this repository: https://github.com/novuhq/clerk-to-novu-webhooks

Prerequisites

Before proceeding, ensure you have:
1

Install Dependencies

Run the following command to install the required packages:
2

Configure Environment Variables

Add the following variables to your .env.local file:
3

Expose Your Local Server

To test webhooks locally, you need to expose your local server to the internet.There are two common options:
localtunnel is a simple and free way to expose your local server without requiring an account.
  1. Start a localtunnel listener
  2. Copy and save the generated public URL (for example, https://your-localtunnel-url.loca.lt).
Learn more about localtunnel here.
localtunnel links may expire quickly and sometimes face reliability issues.
4

Set Up Clerk Webhook Endpoint

  1. Go to the Clerk Webhooks page (link).
  2. Click Add Endpoint.
  3. Set the Endpoint URL as:
  4. Subscribe to the relevant Clerk events (for example, user.createdemail.created).
You can find the list of all supported Clerk events here, or continue to Identify the Triggering Event(s).
  1. Click Create and keep the settings page open.
5

Add Signing Secret to Environment Variables

  1. Copy the Signing Secret from Clerk’s Webhook Endpoint Settings.
  2. Add it to your .env.local file:
6

Make the webhook route public

Incoming Clerk webhooks are not signed-in sessions. If you protect routes with Clerk middleware, exclude the webhook path:
By default, clerkMiddleware() does not protect any routes. This step only matters if you have already added auth checks that would block /api/webhooks.
7

Create Webhook Endpoint for Clerk in Next.js

Create app/api/webhooks/clerk/route.ts:
app
The following snippet is the complete webhook route for Clerk in Next.js:
  • verifyWebhook: Clerk’s helper validates the Svix signature using CLERK_WEBHOOK_SIGNING_SECRET. Pass the Request directly so the raw body is preserved. Do not call request.json() before verification.
  • EVENT_TO_WORKFLOW_MAPPINGS: Maps Clerk event types to Novu workflow identifiers. For email.created, the nested map uses the email slug (for example, password_changed).
  • subscriberBuilder: Builds the Novu to object. Prefer user_id when present (session and email events); fall back to id for user.created.
  • triggerWorkflow: Calls your Novu helper with the workflow ID, subscriber, and event payload.
Update the mapping values to match the workflow identifiers you create in the Novu dashboard.
8

Add Novu Workflow Notification Trigger Function

Create app/utils/novu.ts :
app
This helper is for the Next.js route above. For other languages, see the server SDKs.
9

Add or create Novu workflows in your Novu dashboard

In Novu, a Clerk webhook event can trigger one or more workflows, depending on how you want to handle those events.A workflow defines a sequence of actions (for example, sending notifications) that run when triggered by a webhook.The Novu dashboard lets you create a custom workflow from scratch or start from a template.Steps to Create a WorkflowFollow these steps to set up your workflow(s) in the Novu dashboard:

Identify the Triggering Event(s)

Determine which Clerk webhook events will activate your workflow (for example, user.created or email.created). Create Novu workflow identifiers that match the values in EVENT_TO_WORKFLOW_MAPPINGS.
To find a list of all the events Clerk supports:
  1. In the Clerk Dashboard, navigate to the Webhooks page.
  2. Select the Event Catalog tab.
Clerk events are JSON objects with type, data, timestamp, and instance_id. For user.* events, data is a User object. Your handler maps data.id (or data.user_id when present) to Novu’s subscriberId.Shortened user.created example:

Choose Your Starting Point

Browse the workflow template store in the Novu dashboard. If a template matches your use case (for example, user onboarding), select it and customize it.

Configure the Workflow

  • For a template, tweak the existing steps to align with your requirements.
  • For a blank workflow, add actions like sending emails, sending in-app notifications, Push notifications, or other actions.
  • For a code-first workflow, you can use the Novu Framework to build your workflow right within your code base.

Set Trigger Conditions

  • Link the workflow to the correct webhook event(s).
  • Ensure the Novu workflow identifier matches the value in EVENT_TO_WORKFLOW_MAPPINGS for that Clerk event.
  • Start Simple: Use templates for common tasks and switch to blank workflows for unique needs.
  • Test Thoroughly: Simulate webhook events to ensure your workflows behave as expected.
  • Plan for Growth: Organize workflows logically (separate or combined) to make future updates easier.
10

Disable Email Delivered by Clerk

By default, Clerk sends email notifications whenever necessary, such as Magic Links for email verification, Invitations, Password Resets, and more.To prevent users from receiving duplicate emails, we need to disable email delivery by Clerk for the notifications handled by Novu.
  1. Navigate to the Emails section in the Clerk Dashboard.
  2. Select any email.created event that you want Novu to handle.
  3. Toggle off email delivery for the selected event.
This keeps Clerk from sending the same email that Novu already handles.
11

Test the Webhook

  1. Start your Next.js server.
  2. Go to Clerk Webhooks → Testing.
  3. Select an event (for example, user.created or email.created).
  4. Click Send Example.
  5. Verify logs in your terminal.