Сервис онлайн-записи для салонов красоты в Алматы подключил событийную аналитику, чтобы считать активацию и время до первой пользы и видеть, где салоны застревают в настройке. Через неделю в отчёте странность: Мадина, администратор салона на Абая, приняла 60 записей, а её сменщица Жанна ни одной. Обе работают на одном телефоне за стойкой, Мадина утром, Жанна вечером. Приложение передавало ID пользователя только при регистрации, а Мадина регистрировалась как раз с этого телефона. При выходе ID не сбрасывался, при входе Жанны не менялся, и всё, что делала Жанна, ушло на Мадину. Цифры в уроке условные.
Один телефон, две сотрудницы
Мадина работает
События с ID Мадины
Мадина выходит
reset(): сбросить ID пользователя и обновить ID устройства
Жанна входит
Передать ID Жанны
Записи Жанны в её ленте
Передавайте ID при каждом входе и при запуске с сохранённым входом.
Amplitude или Mixpanel: короткий ответ
Amplitude и Mixpanel записывают каждое действие человека в продукте как событие со свойствами и строят из событий воронки, удержание и поведенческие когорты. Для сайта, где главное событие - заявка, хватает GA4, а эти два инструмента нужны, когда человек работает в продукте под своим аккаунтом, возвращается неделями с разных устройств и вам важен его путь внутри продукта.
Оба собирают события с сайта, из приложения и с сервера, поэтому для сервиса записи выбор решают четыре вещи: сколько событий будет в месяц, как считается время до пользы, где хранится тариф и во что обойдётся счёт по салонам. Вот что говорят документация и страницы цен на октябрь 2026 года:
| Amplitude | Mixpanel | |
|---|---|---|
| За что платят | За события | За события |
| Бесплатный план | 2 млн событий в месяц | До 1 млн событий в месяц |
| Ограничения бесплатного плана | 10 сохранённых графиков на организацию, нет своих поведенческих когорт, данные за год | 5 сохранённых отчётов на пользователя, когорты нельзя сохранить |
| Первый платный план | Plus: первые 2 млн событий бесплатно, дальше по объёму | Growth: первый 1 млн событий бесплатно, дальше по объёму |
| Окно воронки по умолчанию | 1 день по UTC | 7 дней |
| Время до конверсии | Среднее, медиана, распределение | Среднее, медиана, перцентили |
| Свойства пользователя в отчётах | Значение на момент события | Последнее значение профиля |
| Счёт по салонам | Accounts, платное дополнение (на странице цен - Growth и Enterprise) | Group Analytics, платное дополнение для Growth и Enterprise |
Цены и лимиты взяты со страницы цен Amplitude, страницы цен Mixpanel и из правил подсчёта событий в Mixpanel, окна воронок и время до конверсии - из справки по воронкам Amplitude и по воронкам Mixpanel.
Ни один из инструментов не исправит ошибку из истории Мадины и Жанны: она сидит в том, как приложение передаёт данные, и чинится одинаково в обоих.
План событий для сервиса записи
План начинается с вопросов о пути салона к оплате и заканчивается списком событий, которые на них ответят:
| Событие | Когда отправляется | Свойства |
|---|---|---|
salon_signed_up | Сервер создал аккаунт салона | city |
master_added | Мастер сохранён | masters_total |
service_added | Услуга сохранена | services_total |
schedule_saved | Сохранено расписание мастера | masters_with_schedule |
online_booking_enabled | Салон включил онлайн-запись | days_since_signup |
booking_created | Запись сохранена в календаре | source = online или admin |
subscription_paid | Банк подтвердил платёж за месяц | revenue = 12000, currency = KZT |
В каждом событии передают ещё salon_id и plan. Событие отправляют, когда сервер подтвердил действие, а не когда нажали кнопку: booking_created уходит, когда запись сохранена, а не когда клиентка нажала «Записаться» и, может быть, закрыла страницу на следующем шаге. Имена в том же формате, что в плане событий приложения доставки: строчные латинские буквы и подчёркивание, одно имя на сайте и в приложении. Сумму платежа называют revenue, а валюту currency: по этим полям Amplitude показывает платёж в отчёте Revenue LTV (учёт выручки в Amplitude).
Отдельное событие для ага-момента не нужно, но в воронке по людям первую онлайн-запись не увидеть: её делает клиентка, а не владелица салона. Такую запись найдёт воронка по салонам в Accounts или Group Analytics либо база данных. Без дополнения можно заранее договориться, что сервер отправляет онлайн-записи как booking_created с ID владелицы салона. Тогда в отчётах по людям, например «кто сколько записей принял», такие события отфильтровывают по source = online, иначе все онлайн-записи достанутся владелице.
Канал регистрации в план тоже вписывать не нужно: на сайте оба SDK сами читают UTM-метки. Amplitude сохраняет первые метки в свойствах пользователя initial_utm_source, initial_utm_campaign и других (метки в Browser SDK 2), Mixpanel добавляет метки к событиям страницы и записывает первые в профиль вошедшего человека (метки в JavaScript SDK Mixpanel). Воронку по каналам строят с разбивкой по initial_utm_source, поэтому ссылки в рекламе размечают по общей схеме UTM.
Свойство события, человека и салона
Свойства бывают трёх видов. Свойство события описывает одно действие: source у записи. Свойство пользователя описывает человека: его роль, owner, admin или master. Свойство салона описывает аккаунт целиком: тариф, город, число мастеров.
Тариф меняется: салон две недели был на пробном периоде, потом заплатил. Здесь инструменты ведут себя по-разному. Amplitude записывает значения свойств пользователя в каждое событие на момент этого события и задним числом их не меняет (свойства пользователя и события в Amplitude). Mixpanel соединяет события с последним состоянием профиля и для того, что меняется со временем, например тарифа, сам советует передавать значение в свойствах события (профили пользователей в Mixpanel). Если тариф хранится только в профиле Mixpanel, все записи салона, который потом заплатил, окажутся в отчёте платными, включая сделанные на пробном периоде.
Поэтому plan кладут в свойства каждого события. Тогда вопрос «сколько онлайн-записей салоны получают на пробном периоде» оба инструмента посчитают одинаково.
Считать салоны, а не людей
Платит салон, и активируется тоже салон. Оба инструмента по умолчанию считают людей, и в обычной воронке все шаги должен пройти один человек (отчёты по аккаунтам в Amplitude). Если владелица зарегистрировала салон, а администратор добавил мастеров и включил запись, в воронке по людям этот салон до активации не дойдёт.
Счёт по салонам дают платные дополнения: Accounts в Amplitude и Group Analytics в Mixpanel. На страницах цен эти дополнения указаны для Growth и Enterprise, условия у Amplitude - через отдел продаж. С ними салон считается дошедшим до шага, даже если шаги делали разные сотрудники.
Задним числом группы не включаются ни в одном из инструментов. В Mixpanel ключ группы заводят в настройках проекта до того, как пойдут данные (настройка групп в Mixpanel), а в Amplitude изменения групп действуют только на новые события. Пока дополнение не куплено, salon_id всё равно передают в каждом событии: по нему можно фильтровать и разбивать отчёты на любом плане, а долю активированных салонов посчитает база данных сервиса.
Вход и выход: как не склеить двух администраторов
Оба инструмента различают устройство и человека. Пока человек не вошёл, его события подписаны ID устройства, который SDK создаёт сам. После входа приложение передаёт ID пользователя, и инструмент связывает анонимные события с этим человеком. Amplitude сводит оба ID к своему внутреннему Amplitude ID (как Amplitude считает уникальных пользователей), Mixpanel связывает пару $device_id и $user_id. Правила ниже для режима Simplified ID Merge (идентификация в Mixpanel), режим проекта видно в его настройках.
Четыре правила, которые защищают от истории Мадины и Жанны:
- ID пользователя - внутренний номер из базы, а не телефон или email. Ни Amplitude, ни Mixpanel не умеют объединять два ID пользователя. Если ID построен на номере телефона и администратор сменил номер, в отчётах появится новый человек. Amplitude к тому же по умолчанию удаляет из события ID короче 5 символов и отклоняет значения вроде
null,none,0и-1(требования к ID в HTTP API Amplitude). Если номер в базе короче пяти символов, дополните его префиксом (u_04821) или передавайтеmin_id_lengthв запросе к HTTP API. - ID передают при каждом входе и при запуске приложения, если человек уже вошёл. Mixpanel называет оба момента в своих рекомендациях и просит отправить после этого хотя бы одно событие, иначе связь не появится. Передача ID только при регистрации - ровно та ошибка, с которой начался урок.
- При выходе ID сбрасывают. Amplitude советует обнулить ID пользователя и создать новый ID устройства, в Browser SDK 2 это делает один вызов
reset()(Browser SDK 2). Без этого Amplitude считает, что анонимные события после выхода сделал последний вошедший на этом устройстве. В Mixpanelreset()очищает сохранённые ID и создаёт новый$device_id, и вызывать его советуют при выходе и при истечении сессии. - Тем, кто не вошёл, ID пользователя не придумывают. У анонимного человека и так есть ID устройства, а выдуманный ID потом не свяжется с настоящим.
Ещё одна деталь Mixpanel: связь устройства с человеком доходит до всех отчётов в течение 24 часов. В воронке через вход, построенной в тот же день, часть людей выглядит отвалившимися, хотя они дошли. Воронки вокруг регистрации смотрят на следующий день.
Четыре сценария до запуска
Прежде чем показывать отчёты команде, разработчик и аналитик проходят четыре сценария на тестовых аккаунтах и смотрят ленту событий каждого человека: в Amplitude это страница User Activity, в Mixpanel - Activity Feed в разделе Users.
| Сценарий | Что должно получиться |
|---|---|
| Владелица посмотрела сайт и зарегистрировала салон | Действия до регистрации и после - в ленте одного человека |
| Администратор вошёл с ноутбука, потом с телефона | Один человек, а не два |
| Мадина вышла, Жанна вошла на том же телефоне | Записи Жанны в ленте Жанны |
| Человек вышел и продолжил без входа | Новый анонимный человек, а не Мадина |
К ним стоит добавить перезапуск приложения у вошедшего человека и истёкшую сессию. Если после перезапуска события приходят без ID пользователя, приложение не передаёт его при запуске.
Как выбрать под свой продукт
Тариф уже решён: plan лежит в каждом событии. Остальное для сервиса записи сводится к расчётам.
Объём. У сервиса 1 200 работающих салонов. Если салон принимает около 300 записей в месяц, это 360 000 событий booking_created, а с настройкой и платежами меньше 400 000. Оба бесплатных плана это выдержат. Ломает расчёт автоматический сбор. Amplitude Browser SDK 2 по умолчанию сам отправляет просмотры страниц, начало и конец сессии, работу с формами и другие события, а Mixpanel с включённым автосбором по умолчанию собирает просмотры страниц, клики, ввод в поля, прокрутку, отправку форм и другие действия. Каждое такое событие идёт в счёт. Если в каждом салоне страницы сервиса в браузере открывают около ста раз в день, это ещё 3,6 млн просмотров в месяц, больше обоих бесплатных лимитов. На бесплатном плане Mixpanel после миллиона событий отчёты закрываются до следующего месяца или до перехода на платный план. Автосбор того, что вы не собираетесь смотреть, выключают до запуска.
Время до пользы. Активацию сервис считает за 7 дней после регистрации. В Mixpanel окно воронки уже такое, а в Amplitude по умолчанию стоит один день, и салоны, включившие запись на второй-седьмой день, окажутся среди отвалившихся, пока окно не поменяют. Время до конверсии оба инструмента считают только по дошедшим, так что долю дошедших выписывают рядом.
Салоны. Пока новых салонов 200 в месяц, их активацию проще считать в базе данных, а дополнение покупать, когда понадобятся воронки по салонам в самом инструменте. У обеих компаний есть программы для стартапов с бесплатным первым годом: Amplitude даёт план Growth компаниям, где меньше 20 сотрудников и инвестиций меньше $10 млн, Mixpanel - компаниям младше пяти лет с инвестициями до $8 млн.
Если выбрать не получается, отправьте один и тот же план событий в оба инструмента на две недели с выключенным автосбором: на таком объёме оба бесплатны. Потом постройте в каждом три отчёта по людям: воронку настройки, удержание по неделям и регистрации по каналам. Сверьте цифры с базой данных и оставьте инструмент, где команда быстрее получила ответ и где цифры сошлись.
Упражнение: записи Жанны у Мадины
Возьмите продукт с входом в аккаунт, с которым вы работаете, или сервис записи из урока.
Выполнено 0 из 5
Теперь вопрос, который вам зададут. Основатель видит отчёт и пишет: «У Жанны ноль записей за неделю. Она вообще работает?» Что вы ответите и о чём попросите разработчика?
Жанна работает: её записи ушли с ID Мадины, потому что приложение передаёт ID пользователя только при регистрации, а при выходе не сбрасывает. Разработчика нужно попросить передавать ID при каждом входе и при запуске с сохранённым входом, а при выходе вызывать reset(), после чего пройти четыре сценария заново. Исправление подействует на новые события. Записи за прошлые недели по администраторам лучше посчитать в базе данных сервиса, где у каждой записи есть автор, а отчёт «кто сколько записей принял» показывать основателю только после исправления.
Видео: знакомство с Amplitude
Первый день интенсива Adventum: интерфейс Amplitude и отчёты по конверсии.