Отслеживание конверсий доступно на тарифе Business и выше .
В отслеживании конверсий событие lead — это
действие, которым пользователь показывает интерес к продукту:
- зарегистрировался;
- записался на демо;
- подписался на рассылку.
Событие лида задаёт личность клиента и ссылку, по которой он пришёл: все его дальнейшие действия (покупка, апгрейд тарифа) атрибутируются той же ссылке.
В этом руководстве мы сосредоточимся на отслеживании регистраций новых пользователей для SaaS-приложения, использующего Supabase для аутентификации.
Что нужно до начала
Сначала включите отслеживание конверсий для ссылок: без него клик не связывается с последующими событиями лида и продажи.
Для ссылок партнёрской программы шаг можно пропустить — 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).
Настройка Supabase
Далее настройте Supabase для отслеживания событий конверсий лидов в функции обратного вызова аутентификации.
Вот как это работает в двух словах:
- В обработчике
/api/auth/callbackпроверьте, что:- cookie
rr_idприсутствует; - пользователь только что зарегистрировался (создан за последние 10 минут).
- cookie
- Если оба условия выполнены — отправьте событие лида в Revroute через
dub.track.lead. - Удалите cookie
rr_id.
// app/api/auth/callback/route.ts
import { cookies } from "next/headers";
import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase/server";
import { waitUntil } from "@vercel/functions";
import { dub } from "@/lib/dub";
export async function GET(request: Request) {
const { searchParams, origin } = new URL(request.url);
const code = searchParams.get("code");
// if "next" is in param, use it as the redirect URL
const next = searchParams.get("next") ?? "/";
if (code) {
const supabase = createClient(cookies());
const { data, error } = await supabase.auth.exchangeCodeForSession(code);
if (!error) {
const { user } = data;
const rr_id = cookies().get("rr_id")?.value;
// if the user is created in the last 10 minutes, consider them new
const isNewUser =
new Date(user.created_at) > new Date(Date.now() - 10 * 60 * 1000);
// if the user is new and has a rr_id cookie, track the lead
if (rr_id && isNewUser) {
waitUntil(
dub.track.lead({
clickId: rr_id,
eventName: "Sign Up",
customerExternalId: user.id,
customerName: user.user_metadata.name,
customerEmail: user.email,
customerAvatar: user.user_metadata.avatar_url,
}),
);
// delete the clickId cookie
cookies().delete("rr_id");
}
return NextResponse.redirect(`${origin}${next}`);
}
}
// return the user to an error page with instructions
return NextResponse.redirect(`${origin}/auth/auth-code-error`);
}Поля запроса 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. |
Пример приложения
Чтобы узнать больше об отслеживании лидов с Supabase, ознакомьтесь со следующим примером приложения:
Supabase + Next.js App Router Example
Живой пример: сервис Extrapolate отслеживает регистрации через Supabase Auth и Next.js App Router.
Где смотреть конверсии
После настройки все отслеженные конверсии видны в аналитике воркспейса — в трёх представлениях:
- График по времени — клики, лиды и продажи в динамике: Аналитика .
- Воронка — конверсия и отвал на каждом шаге (клики → лиды → продажи): Аналитика в режиме воронки .
- Поток событий — каждое событие конверсии по всем ссылкам воркспейса в реальном времени: События .