Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки

Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки

Почему "сколько пришло и сколько зарегистрировалось" - это только половина правды, и что я сделал, чтобы видеть вторую.

Короткая мысль, с которой все началось

Регистрация - это не результат. Результат - это пользователь, который вернулся.

Звучит банально, пока не попробуешь честно ответить на вопрос "сколько из тех, кого мы привели в прошлом месяце, реально осталось с продуктом через неделю". Не в среднем по больнице, а по каждому каналу и каждой кампании, по дням: D1, D3, D7, D30.

Я попробовал ответить на этот вопрос в Яндекс Метрике и довольно быстро уперся в стену. А когда собрал нормальный когортный ретеншн сам - увидел вещи, которые в стандартных отчетах были не видны в принципе. Например, что наш лучший канал по регистрациям оказался одним из худших по удержанию.

Дальше по порядку.

Чего не хватает в Метрике

Сразу честно, чтобы не было разговоров в комментариях: когортный анализ в Яндекс Метрике есть. В вебной версии это отдельный отчет в платных отчетах - "Когортный анализ" и "Retention-анализ". Там можно выбрать когорту, метрику возвращаемости и посмотреть retention.

Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки

Проблема не в том, что инструмента нет. Проблема в том, что для продуктовой работы им почти невозможно пользоваться:

  • Ретеншн считается грубыми диапазонами дней - 0-1, 2-4, 5-10, 11-30. То есть чистого по-дневного D1 / D3 / D7 / D30 по когортам из коробки не получить. А именно это и нужно, чтобы видеть, на каком дне пользователи отваливаются.
  • Разрезать удержание одновременно по источнику и по UTM-кампании, да еще нормально выгрузить в удобный вид - отдельная боль.
  • Нет нормального контекста: какая база у когорты, дозрела ли она, можно ли вообще делать вывод по этим цифрам или там три с половиной человека.

По-хорошему за честным когортным ретеншном надо лезть в Logs API, выгружать сырые данные на уровне пользователей и считать самому в ClickHouse / DataLens или хотя бы в гугл-таблице. Это уже не "открыл отчет и посмотрел", это полноценный пайплайн.

А метрика при этом критичная. Без нее ты оптимизируешь привлечение вслепую: видишь регистрации, радуешься росту, а кто из этих людей реально пользуется продуктом через неделю - не знаешь.

Что я сделал

Я не стал поднимать тяжелый стек. Сделал инструмент поверх API Метрики прямо в Google Sheets - на Google Apps Script.

Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки

Логика простая. Раз в сутки скрипт сам, по триггеру, ходит в API Метрики, тянет данные и собирает в таблице:

  • Когортную матрицу ретеншна D0-D30 по дням с тепловой картой. Строка - дата регистрации (когорта), столбцы - дни с момента первого визита, в ячейке - доля вернувшихся. Это та самая классическая когортная "лесенка", ради которой все и затевалось.
  • Ретеншн D1 / D3 / D7 / D10 / D30 в разрезе каждого источника и каждой UTM-кампании. То есть не просто "общее удержание", а удержание по каналам - чтобы понимать, какой трафик приводит людей, которые остаются.
  • Дашборд с ключевыми метриками за период (визиты, пользователи, регистрации, целевые действия), сводными Weighted D1-D30 и авто-выводами.
  • Честный контекст к каждой когорте: размер, зрелость и пометку, можно ли вообще по ней делать выводы. Когорты с малой базой подсвечиваются серым - чтобы никто не побежал принимать решение по выборке из 4 человек.

Все живет в обычной гугл-таблице. Делится одной ссылкой, обновляется само каждое утро. Никаких BI-платформ, серверов и подписок.

Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки

Отдельно про методику, потому что это важно для честности цифр. Я считаю classic day retention - вернулся ли пользователь ровно на N-й день после первого визита. Это строгая метрика: для продуктов с нерегулярным заходом значения на D7+ будут низкими, и это нормально, это не "продукт умирает". Об этом я прямо пишу в самом дашборде, чтобы цифры никого не пугали и не вводили в заблуждение.

Что вылезло, когда я наконец это увидел

Вот ради чего все и делалось. Беру четыре основных канала за 30 дней и смотрю две метрики рядом: конверсию в регистрацию и D7 retention (вернулись на 7-й день).

Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки
  • finam_app / referral: конверсия в регистрацию 38% - лучший канал по конверсии. А D7 retention 1,8%.
  • youtube / influencer: конверсия 28%, D7 4%.
  • telegram / content: конверсия 18%, D7 1% - регистрируются и почти сразу отваливаются.
  • finamx-landing: конверсия 16% - средне. Зато D7 7,2% - лучший канал по удержанию.

Смотрите, что получается. Лучший канал по регистрациям и лучший канал по удержанию - это разные каналы. Более того, они идут почти в обратном порядке: чем выше конверсия в регистрацию, тем ниже удержание.

Если смотреть только на регистрации - а так смотрит большинство дашбордов - вывод напрашивается "льем в referral и telegram, там дешево и конверсит". А по факту эти каналы приводят людей, которые не задерживаются в продукте. Канал, который реально приносит остающихся пользователей (finamx-landing), по верхнеуровневым метрикам выглядит средненько и легко попадает под нож при оптимизации бюджета.

Вот это расхождение между "зарегистрировался" и "остался" - и есть та самая вторая половина правды, которую без когортного ретеншна по каналам просто не видно.

Регистрации врут. Как я собрал когортный ретеншн по дням, которого нет в Яндекс Метрике из коробки

Что я из этого вынес

Несколько мыслей, которые мне кажутся полезными за пределами конкретно моего кейса.

  1. Конверсия в регистрацию и удержание - разные метрики, и оптимизировать только первую опасно. Высокий CR может маскировать мусорный трафик.
  2. Когортный ретеншн по дням - это не "продвинутая аналитика для зрелых команд", а базовая гигиена. Без него вы не знаете, работает ли вообще ваше привлечение. И да, в коробочной Метрике этого нормально не сделать - это объективное ограничение инструмента, а не ваша лень.
  3. Не обязательно строить тяжелый пайплайн, чтобы закрыть эту дыру. Apps Script + API + гугл-таблица закрывают 80% потребности почти бесплатно. Тяжелый стек нужен, когда упретесь в объемы или в rolling retention - но это уже следующий шаг.
  4. Честность важнее красоты дашборда. Маленькие когорты, незрелые окна, строгая методика - все это надо подсвечивать прямо в отчете, иначе кто-нибудь примет решение по случайному всплеску на выборке из десяти человек.
4