Что это
Она показывает не красивые графики, а деньги: сколько ушло на рекламу, сколько людей пришло, сколько дошло до первого реального действия, сколько заплатило и что осталось в прибыли. По каждому каналу отдельно, с ROI.
Рядом - CRM: карточка на каждого человека. Откуда пришёл, что делал, сколько принёс.
Ценность тут не в интерфейсе, а в схеме данных и SQL-отчётах. Интерфейс вы перепишете под себя за вечер, а вот учёт визитов с атрибуцией, которая переживает регистрацию, руками собирается долго и с ошибками.
Что внутри
- Воронка по каналам: расход → охваты → переходы → регистрации → первое действие → оплаты → выручка → прибыль → ROI
- Свой учёт визитов с рекламной атрибуцией - не зависит от внешних счётчиков
- Порог 15 секунд: отсеивает ботов и случайные заходы из поиска
- UTM-разметка с разбивкой по каналам, кампаниям и креативам
- CRM: досье на человека - канал, действия, платежи, повторные оплаты
- Стоимость привлечения по каналам: CPC, CPL, CPG
- Ручной ввод рекламного расхода на /admin/spend
- Панель на отдельном поддомене + доступ по белому списку почт
- Согласие на аналитику и выключатель в личном кабинете - без серых схем
- Свои учётные записи не попадают в отчёты
- Готовые Prisma-миграции и 11 файлов тестов
Что понадобится
- Next.js 16 (App Router), React 19, Prisma 7, PostgreSQL
- Домен, на котором можно поднять поддомен
admin. - Яндекс.Метрика - по желанию, для сверки цифр
Стек другой? Переносите схему данных и SQL-отчёты - в них вся ценность, интерфейс проще написать заново.
Установка
Полная инструкция лежит внутри архива: КАК-ПОСТАВИТЬ.md для человека и ДЛЯ-ИИ.md - его копируешь в чат целиком вместе с архивом, если ставишь через Claude Code или Cursor. Кратко:
Шаги
- Распакуй архив и скопируй
src/в свой проект, сохранив структуру папок. - Открой
prisma-models.prisma, вставь модели в свою схему и свяжи с модельюUser- какие именно связи, написано в шапке файла. Готовые SQL-миграции лежат вprisma/migrations/.
npx prisma migrate dev --name analytics
- Пропиши переменные окружения:
ADMIN_EMAILS="твоя@почта.ru" # кому открыта панель, через запятую
ADMIN_HOST="admin.твойдомен.ru" # пусто - подойдёт любой поддомен admin.
ANALYTICS_IP_SALT="" # пусто - возьмётся AUTH_SECRET
NEXT_PUBLIC_METRIKA_ID="" # счётчик Яндекс.Метрики, если нужен
Пустой ADMIN_EMAILS выключает панель целиком.
- Вставь два куска в свой middleware - выдачу куки посетителя и разведение по хостам. Оба лежат готовыми в
proxy-fragment.ts. - Подключи
в корневом макете. - В обработчике регистрации вызови
attachVisitorToUser. Без этого шага канал не свяжется с человеком и воронка останется пустой - самая частая ошибка при переносе. - Прогони тесты из
tests/. Им нужна живая база.
Три вещи, которые стоит знать заранее
Атрибуцию нельзя восстановить задним числом. Если в момент перехода по объявлению метку не записали, канал этого человека потерян навсегда. Поэтому визиты пишутся раньше регистрации, а при регистрации превращаются в снимок, который больше не меняется. ПустойADMIN_EMAILS в проде - это не «панель закрыта», а «фильтр своих не работает». Собственные заходы и тестовые платежи попадут в отчёты как настоящие. У меня это однажды нарисовало выручку, которой не было.
Часовые пояса.** Даты хранятся в UTC, перевод в местное время идёт в два шага (AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Moscow'). Одношаговый сдвигает сутки на несколько часов, и графики врут незаметно - числа выглядят правдоподобно.
Чего внутри нет
Автоматической загрузки расходов из рекламных кабинетов - расход вводится руками. Уведомлений, рассылок и биллинга тоже нет: это отдельные части сервиса, завязанные на его провайдеров.
Про ключи
В архиве нет ни ключей, ни паролей, ни строк подключения - только имена переменных окружения. Домены и почты в тестах заменены на example.com.