When it comes to conversion tracking, a lead event happens when a user performs an action that indicates interest in your product or service. This could be anything from:

  • Signing up for an account
  • Adding a product to cart
  • Joining a mailing list

In this guide, we will be focusing on tracking new user sign-ups for a SaaS application that uses Clerk for user authentication.

Prerequisites

Before you get started, make sure you follow the Dub Conversions quickstart guide to get Dub Conversions set up for your links:

  1. Enable conversion tracking for your links
  2. Install the @dub/analytics client-side SDK
  3. Install the Dub server-side SDK

Configure Clerk

Next, configure Clerk to track lead conversion events when a new user signs up. Here’s a quick video showing how to do this:

Here’s a quick summary of the steps:

1

Add environment variables

Add the following environment variables to your app:

# get it here: https://dashboard.clerk.com/apps/new
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_publishable_key
CLERK_SECRET_KEY=your_secret_key

# get it here: https://d.to/tokens
DUB_API_KEY=your_api_key
2

Add a custom claim to your Clerk session token

Add the following JSON as a custom claim to your Clerk session token:

Clerk Session Token
{
  "metadata": "{{user.public_metadata}}"
}
3

Extend the `@dub/analytics` package with Clerk's `useUser` hook

Extend the @dub/analytics package to include a trackLead server action.

components/dub-analytics.tsx
"use client";

import { trackLead } from "@/actions/track-lead";
import { useUser } from "@clerk/nextjs";
import { Analytics, AnalyticsProps } from "@dub/analytics/react";
import { useEffect } from "react";

export function DubAnalytics(props: AnalyticsProps) {
  const { user } = useUser();

  useEffect(() => {
    if (!user || user.publicMetadata.dubClickId) return;

    // if the user is loaded but hasn't been persisted to Dub yet, track the lead event
    trackLead({
      id: user.id,
      name: user.fullName!,
      email: user.primaryEmailAddress?.emailAddress,
      avatar: user.imageUrl,
    }).then(async (res) => {
      if (res.ok) await user.reload();
      else console.error(res.error);
    });

    // you can also use an API route instead of a server action
    /*
    fetch("/api/track-lead", {
      method: "POST",
      body: JSON.stringify({
        id: user.id,
        name: user.fullName,
        email: user.primaryEmailAddress?.emailAddress,
        avatar: user.imageUrl,
      }),
    }).then(res => {
      if (res.ok) await user.reload();
      else console.error(res.statusText);
    });
    */
  }, [user]);

  return <Analytics {...props} />;
}

Then, add the DubAnalytics component to your app’s root layout component:

app/layout.tsx
import { DubAnalytics } from "@/components/dub-analytics";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html>
      <body>
        <DubAnalytics />
        {children}
      </body>
    </html>
  );
}
4

Implement the `trackLead` server action

On the server side, implement the trackLead server action. Alternatively, you can also create an API route instead:

Here’s the full list of attributes you can pass when sending a lead event:

PropertyRequiredDescription
clickIdYesThe unique dub_id parameter that the lead conversion event is attributed to.
eventNameYesThe name of the event. Example: “Sign up”.
externalIdYesThe unique ID of the customer in your system. Will be used to identify and attribute all future events to this customer.
customerEmailNoThe email address of the customer. If not passed, a random email address will be generated.
customerNameNoThe name of the customer. If not passed, a random name will be generated (e.g. “Big Red Caribou”).
customerAvatarNoThe avatar URL of the customer. If not passed, a random avatar URL will be generated.

Example App

To learn more about how to track leads with Clerk, check out the following example app:

Dub + Clerk Example App

See how to track new user sign-ups with Clerk and the Dub SDK.

View your conversions

Once you’ve enabled conversion tracking for your links, all your tracked conversions will show up on your Analytics dashboard. We provide 3 different views to help you understand your conversions:

  • Funnel chart: A funnel chart view visualizing the conversion & dropoff rates across the different steps in the conversion funnel (clicks → leads → sales).
  • Real-time events stream: A real-time events stream of every single conversion event that occurs across all your links in your workspace.