Отслеживание конверсий доступно на тарифе Business и выше .
В отслеживании конверсий событие lead — это
действие, которым пользователь показывает интерес к продукту:
- зарегистрировался;
- записался на демо;
- подписался на рассылку.
Событие лида задаёт личность клиента и ссылку, по которой он пришёл: все его дальнейшие действия (покупка, апгрейд тарифа) атрибутируются той же ссылке.
В этом руководстве мы сосредоточимся на отслеживании регистраций новых пользователей для SaaS-приложения, использующего Clerk для аутентификации.
Что нужно до начала
Сначала включите отслеживание конверсий для ссылок: без него клик не связывается с последующими событиями лида и продажи.
Для ссылок партнёрской программы шаг можно пропустить — RevRoute включает отслеживание конверсий у них автоматически.
Для всего воркспейса. Откройте Настройки → Аналитика и включите переключатель Отслеживание конверсий в шапке страницы — он управляет настройкой на уровне воркспейса. Отслеживание включится у всех ссылок, созданных после этого.
Для отдельной ссылки. Откройте
конструктор ссылки и
включите переключатель Отслеживание конверсий — внутри конструктора он же
дёргается горячей клавишей C.
Через API. Передайте trackConversion: true при создании или обновлении
ссылки (по умолчанию — false):
curl -X POST "https://api.revroute.ru/links" \
-H "Authorization: Bearer dub_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"trackConversion": true
}'Затем установите на сайт клиентский скрипт RevRoute — он фиксирует клик и сохраняет его идентификатор, без которого события лида не к чему привязать.
Клиентский скрипт RevRoute отдаётся с нашего домена — npm-пакеты ставить не
нужно. Скрипт находит в URL параметр rr_id, сохраняет его в first-party cookie
rr_id на вашем домене (90 дней) и по нему связывает будущие конверсии с
исходной ссылкой.
Вставьте тег в секцию <head> каждой страницы сайта:
<script defer src="https://app.revroute.ru/analytics/script.js"></script>В Next.js (App Router) — через next/script в корневом layout:
import Script from "next/script";
export default function RootLayout({ children }) {
return (
<html lang="ru">
<body>{children}</body>
<Script defer src="https://app.revroute.ru/analytics/script.js" />
</html>
);
}Варианты скрипта (site visit, outbound domains, клиентские конверсии) и все
его атрибуты data-* описаны в разделе Варианты
скрипта.
Проверить установку можно двумя способами:
- Откройте консоль браузера и введите
_revRouteAnalytics— если скрипт установлен, в консоли появится объект. - Добавьте к адресу сайта параметр
?rr_id=testи убедитесь, что в браузере появился cookierr_id.
Если оба пункта не сработали, проверьте, что:
- тег скрипта стоит в секции
<head>страницы; - кеш CDN сброшен, если сайт отдаётся через CDN.
Серверный клиент RevRoute
Примеры ниже используют официальный TypeScript-SDK. Он ставится из npm под
именем dub — форк RevRoute отдельного пакета не публикует, поэтому в SDK
обязательно указывается наш serverURL, иначе запросы уйдут в api.dub.co.
npm install dubimport { Dub } from "dub";
export const dub = new Dub({
token: process.env.REVROUTE_API_KEY, // секретный ключ dub_* из настроек воркспейса
serverURL: "https://api.revroute.ru", // без него SDK пойдёт в api.dub.co
});Секретный ключ (dub_*) держите в переменных окружения и не отдавайте в
браузер. Ключ создаётся в разделе API-ключей .
SDK не обязателен: /track/lead и /track/sale — обычные HTTPS-эндпоинты,
их можно вызвать из любого языка (см. Track
lead).
Настройка Clerk
Далее настройте Clerk для отслеживания событий конверсий лидов при регистрации нового пользователя. Вот короткое видео, демонстрирующее процесс:
Краткое описание шагов:
Добавьте переменные окружения
Добавьте в приложение следующие переменные окружения:
# 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
REVROUTE_API_KEY=your_api_keyДобавьте кастомный claim в session-токен Clerk
Добавьте этот JSON как кастомный claim в session-токен Clerk:
{
"metadata": "{{user.public_metadata}}"
}Свяжите клиентский скрипт с хуком `useUser` из Clerk
Оберните клиентский скрипт RevRoute компонентом, который вызывает серверное действие trackLead. Npm-пакет не нужен — скрипт отдаётся с нашего домена.
"use client";
import { trackLead } from "@/actions/track-lead";
import { useUser } from "@clerk/nextjs";
import { useEffect } from "react";
export function RevRouteAnalytics() {
const { user } = useUser();
useEffect(() => {
if (!user || user.publicMetadata.revrouteClickId) return;
// if the user is loaded but hasn't been persisted to Revroute 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 (
<script
defer
src="https://app.revroute.ru/analytics/script.js"
data-api-host="https://api.revroute.ru"
/>
);
}Затем добавьте компонент RevRouteAnalytics в корневой layout приложения:
import { RevRouteAnalytics } from "@/components/analytics-overview";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
<RevRouteAnalytics />
{children}
</body>
</html>
);
}Реализуйте серверное действие `trackLead`
На стороне сервера реализуйте серверное действие trackLead. Как вариант, вместо него можно завести отдельный API-маршрут:
// This is a server action
"use server";
import { dub } from "@/lib/dub";
import { clerkClient } from "@clerk/nextjs/server";
import { cookies } from "next/headers";
export async function trackLead({
id,
name,
email,
avatar,
}: {
id: string;
name?: string | null;
email?: string | null;
avatar?: string | null;
}) {
try {
const cookieStore = await cookies();
const clickId = cookieStore.get("rr_id")?.value;
if (clickId) {
// Send lead event to Revroute
await dub.track.lead({
clickId,
eventName: "Sign Up",
customerExternalId: id,
customerName: name,
customerEmail: email,
customerAvatar: avatar,
});
// Delete the rr_id cookie
cookieStore.set("rr_id", "", {
expires: new Date(0),
});
}
const clerk = await clerkClient();
await clerk.users.updateUser(id, {
publicMetadata: {
revrouteClickId: clickId || "n/a",
},
});
return { ok: true };
} catch (error) {
console.error("Error in trackLead:", error);
return { ok: false, error: (error as Error).message };
}
}Поля запроса POST /track/lead:
| Поле | Обяз. | Описание |
|---|---|---|
clickId | да | Идентификатор клика, к которому привязывается лид. Читается из cookie rr_id. Для отложенного лида допустима пустая строка — тогда клик берётся у клиента, найденного по customerExternalId. |
eventName | да | Название события (например, Sign up). Оно же связывает лид с последующей продажей через leadEventName в /track/sale. |
customerExternalId | да | Идентификатор клиента в вашей системе. По нему атрибутируются все будущие события этого клиента. |
discountCode | нет | Промокод партнёра, если клиент пришёл без клика по ссылке. Если переданы и clickId, и discountCode, приоритет у clickId. |
customerName | нет | Имя клиента. Если не передать, сгенерируется случайное. |
customerEmail | нет | Email клиента. |
customerAvatar | нет | URL аватара клиента. |
mode | нет | async (по умолчанию) — не блокировать запрос; wait — дождаться записи события; deferred — отложить создание лида до следующего запроса. |
eventQuantity | нет | Числовое значение события (например, количество мест в триале): лид будет засчитан столько раз. |
metadata | нет | Произвольные данные события, до 10 000 символов в JSON. |
Пример приложения
Чтобы узнать больше об отслеживании лидов с Clerk, ознакомьтесь со следующим примером приложения:
Revroute + Clerk: пример приложения
Пример отслеживания регистраций через Clerk и SDK Revroute.
Где смотреть конверсии
После настройки все отслеженные конверсии видны в аналитике воркспейса — в трёх представлениях:
- График по времени — клики, лиды и продажи в динамике: Аналитика .
- Воронка — конверсия и отвал на каждом шаге (клики → лиды → продажи): Аналитика в режиме воронки .
- Поток событий — каждое событие конверсии по всем ссылкам воркспейса в реальном времени: События .