Отслеживание конверсий доступно на тарифе Business и выше .
В отслеживании конверсий событие lead — это
действие, которым пользователь показывает интерес к продукту:
- зарегистрировался;
- записался на демо;
- подписался на рассылку.
Событие лида задаёт личность клиента и ссылку, по которой он пришёл: все его дальнейшие действия (покупка, апгрейд тарифа) атрибутируются той же ссылке.
В этом руководстве мы сосредоточимся на отслеживании регистраций новых пользователей для SaaS-приложения, использующего NextAuth.js для аутентификации.
Что нужно до начала
Сначала включите отслеживание конверсий для ссылок: без него клик не связывается с последующими событиями лида и продажи.
Для ссылок партнёрской программы шаг можно пропустить — 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).
Настройка параметров NextAuth.js
Далее настройте параметры конфигурации NextAuth.js для отслеживания событий конверсий лидов с помощью TypeScript SDK dub.
Вот как это работает в двух словах:
- Отследите регистрацию через событие
signInв NextAuth. - Если пользователь новый — проверьте, есть ли cookie
rr_id. - Если cookie есть — отправьте событие лида в Revroute через
dub.track.lead. - Удалите cookie
rr_id.
Под капотом Revroute записывает пользователя как клиента и связывает его с событием клика, откуда он пришёл. Уникальный ID пользователя теперь является источником истины для всех будущих событий — поэтому cookie rr_id больше не нужен.
// app/api/auth/[...nextauth]/options.ts
import type { NextAuthOptions } from "next-auth";
import { cookies } from "next/headers";
import { dub } from "@/lib/dub";
export const authOptions: NextAuthOptions = {
...otherAuthOptions, // your other NextAuth options
events: {
async signIn(message) {
// if it's a new sign up
if (message.isNewUser) {
const cookieStore = await cookies();
// check if rr_id cookie is present
const rr_id = cookieStore.get("rr_id")?.value;
if (rr_id) {
// send lead event to Revroute
await dub.track.lead({
clickId: rr_id,
eventName: "Sign Up",
customerExternalId: user.id,
customerName: user.name,
customerEmail: user.email,
customerAvatar: user.image,
});
// delete the cookies
cookieStore.delete("rr_id");
cookieStore.delete("rr_partner_data");
}
}
},
},
};В NextAuth.js флаг isNewUser доступен только при работе через
базу данных —
иначе он вернёт undefined. В этом случае перенесите логику выше в
callback signIn.
Поля запроса 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. |
Создание обработчика маршрутов NextAuth.js
Наконец, импортируйте переменную authOptions, созданную ранее, и используйте NextAuth для создания обработчика маршрутов NextAuth.js.
// app/api/auth/[...nextauth]/index.ts
import { authOptions } from "./options";
import NextAuth from "next-auth";
const handler = NextAuth(authOptions);
export { handler as GET, handler as POST };Где смотреть конверсии
После настройки все отслеженные конверсии видны в аналитике воркспейса — в трёх представлениях:
- График по времени — клики, лиды и продажи в динамике: Аналитика .
- Воронка — конверсия и отвал на каждом шаге (клики → лиды → продажи): Аналитика в режиме воронки .
- Поток событий — каждое событие конверсии по всем ссылкам воркспейса в реальном времени: События .