new-lvl.pro · Кейсы · A/B · Notifications
Кейс // 12 мин чтения

Push дал ARPU +4%,
но через месяц
churn +12%

Синтетический разбор реалистичной ситуации: A/B на агрессивных push-уведомлениях, через неделю короткие метрики хорошие — раскатили на 100%. Через 28 дней — churn вырос, retention пробил, дисэйблы накопились. Разбираю, где смотрели не туда, и какой холдаут поставили в процесс, чтобы такое больше не пропустить.

Lyra: мобильный e-com маркетплейс

Lyra — синтетический e-com маркетплейс в мобильном приложении (категория «дом и хобби», крафт). 1.2M MAU, средний чек ₽2 400, конверсия из сессии в покупку 3.8%, неделя — типичный цикл покупки.

Push-уведомления — главный канал ремаркетинга. До эксперимента — 1 push в день: либо персональная подборка («новые мастера в категории, на которую ты подписан»), либо общий контент («трендовая категория недели»). Push-disable rate стабильный на уровне 9% накопительно за 90 дней.

CMO принёс гипотезу: «частота слишком низкая, у конкурентов push 2–3 раза в день — давайте поднимем». Команда монетизации согласилась, аналитика выкатила A/B. Я был в этой аналитике.

MAU
1.2M
Активная база — мобильное приложение, iOS и Android.
Базовый ARPU
₽ 312/неделя
Средний доход с активного пользователя за 7 дней. Считаем по всем активным, не только платящим.
Push-disable
9% / 90 дней
Доля юзеров, отключивших push в настройках за 90 дней. Это та метрика, на которую не смотрели.

Дизайн A/B: что меняем

Treatment-группа получала 3 push в день вместо 1. Содержание сохранили — те же персонализированные подборки, теперь с более узкими сегментами (по часу дня, по «недавно смотрел», по «оставил в корзине»). Содержание стало лучше по релевантности, но количество подросло втрое.

Дизайн
50/50 по user_id
Рандомизация на момент следующего push-окна. SRM-проверка перед анализом — chi-square p = 0.31, расхождения нет.
Длительность
7 дней
Стандарт «недельного теста» в продуктовой команде. Достаточная мощность для эффекта 3% и больше на ARPU.
Главная метрика
ARPU за 7 дней
Считаем как SUM(revenue) / DAU по периоду. Бизнес-приоритет: «короткосрочная выручка».
Guard-метрики
CR, sessions/user, D7-retention
То, что договорились смотреть. Из guard'ов не было push-disable rate и долгосрочного retention.

Короткие метрики: всё прекрасно

Через 7 дней снимаем замер. Результаты выглядят так, как мечтает CMO:

Метрика Control Treatment Δ p-value
ARPU 7d ₽312 ₽324 +4% 0.008
Sessions / user 11.6 13.0 +12% < 0.001
CR в покупку 3.8% 4.0% +5% 0.04
D7 retention 35% 38% +9% 0.002
Push-disable rate (за 7 дней) 0.6% 0.9% +50% 0.13

Главная метрика прошла, все guard'ы — в плюс. Единственный «жёлтый» сигнал — push-disable рос быстрее, но абсолютные числа маленькие (0.6% vs 0.9%), и p-value > 0.05. Команда обсудила и решила: «это шум, абсолютные числа невелики, на других guard-метриках всё хорошо — раскатываем».

// Тут была первая развилка
На обсуждении кто-то сказал: «может, продлим ещё на 2 недели?». Решили — нет, потому что «бизнес ждёт результата, бренд кампанию начинает в понедельник». Это было решение «не на основе данных», а «на основе календаря». Не оптимально, но в моменте казалось разумным.

Радость и раскатка на 100%

Раскатили на всю базу за один день. Закрыли A/B-конфигурацию в платформе экспериментов, удалили control-сегментацию, перевели систему на новый push-расход (3/день, та же логика персонализации).

День 0
Старт A/B
50/50 сплит. Control получает 1 push/день, treatment — 3.
День 7
Замер коротких метрик
ARPU +4%, sessions +12%, retention +9%. Push-disable не значимо.
День 8
Решение раскатить
CMO + product принимают решение. Аналитика подписывается. Holdout-группу не оставляем — это критическая ошибка, которую заметим позже.
День 10
100% базы получает 3 push/день
Configuration push-engine обновлён, бренд-кампания «новые мастера» стартует во вторник.
День 20
Первый «странный» сигнал
Push-disable за 20 дней — 4.2% накопительно. Это уже в 2 раза выше базы. Дашборд маркетинга поднимает руку, но решают «подождём, чтобы цифра устаканилась».
День 28
Когортный замер D28
Retention D28 пробил: 14% vs прогноза 17% (на основе исторических когорт). Churn-rate (90-day) трендирует +12%. ARPU «успокоился» на +0.5%, а не +4%.

Длинные метрики: всё плохо

К 28-му дню картина перевернулась. Поскольку holdout-группы не было, чтобы сравнить «как было бы без раскатки», сравниваем с историческими когортами того же периода прошлого года и с пред-периодом (с поправкой на сезонность):

Метрика D28 Историч. Сейчас Δ
D28 retention 17% 14% −18%
90-day churn 22% 24.6% +12%
Push-disable rate (28d) 3.5% 7.1% +103%
App-uninstall rate (28d) 5.8% 7.0% +21%
ARPU 28d (накопленный) ₽1,160 ₽1,167 +0.6%

Что произошло. Агрессивные пуши действительно сработали в первую неделю: люди заходили чаще, покупали быстрее, ARPU рос. Но каждый дополнительный push увеличивает шанс отключить уведомления или удалить приложение. К концу 4-й недели:

Каждый второй «прирост ARPU» был не «новой выручкой», а ускорением покупок, которые юзер сделал бы и так — просто раньше.
Push-disable rate удвоился — 7% базы отключили уведомления за 28 дней, против исторических 3.5%. Это полупогибший канал ремаркетинга на постоянку.
App-uninstall +21% — часть юзеров просто удалила приложение, не разбираясь в настройках.
ARPU стабилизировался на +0.6% — мы не зарабатываем «+4%», как обещали бизнесу. Реальная цифра — почти ноль, при том что мы потеряли retention и часть канала ремаркетинга.

// Чистый proof: «short-term врёт»
Если бы тест шёл не 7 дней, а 28 — мы бы увидели всю картину сразу. ARPU начал отъезжать вниз уже на 12–14-й день, retention пробил на 21-й. Цена в 3 недели терпения вместо раскатки — десятки тысяч ушедших юзеров и месяцы работы канала, который теперь надо чинить.

5 системных ошибок процесса

Этот кейс — не про «push-уведомления плохие». Это про сломанный процесс экспериментов. Те же агрессивные пуши с правильным процессом дали бы либо «слабо положительно, удерживаем», либо «отрицательно, откат». Не «победа короткой неделей, проигрыш месяцем». По частоте ошибок, с которыми такое случается.

// ошибка 01
Слишком короткий тест для long-cycle поведения
Цикл покупки у Lyra — неделя. Цикл «накопить раздражение» от push — 2–3 недели. Цикл «отключить уведомления / удалить приложение» — 3–4 недели. 7-дневный тест короче самого важного процесса, который мы пытались измерить. Это уже сломанный дизайн.
// ошибка 02
Нет holdout-группы после раскатки
Раскатили на 100% — потеряли «зеркало» для долгосрочного сравнения. Без holdout-группы D28-retention сравниваем с историческими когортами + сезонностью — это работает, но менее точно. Нормальная практика — оставлять 5% holdout, который не получает изменения никогда. На нём считают long-term эффект.
// ошибка 03
Не было guard-метрики push-disable
Push-disable — это метрика «здоровья канала». Когда меняешь push, обязательно мерить отписки. Мы их не мерили в guard'ах: значение в дизайне выскочило, но не было порога — «если push-disable растёт быстрее +20%, останавливаем». Без порога это просто «один из метриков», который не блокирует решение.
// ошибка 04
Нет когортного среза по push-fatigue
Прирост ARPU был не у всей базы. Юзеры с высокой push-получаемостью до теста (>10 push в неделю по доменам) активировались хуже, а уходили чаще. Юзеры с низкой — отреагировали лучше. Усреднённый ARPU спрятал гетерогенность. Когортный анализ по push-fatigue показал бы это сразу.
// ошибка 05
Решение «по календарю», а не «по данным»
«Бизнес ждёт, бренд-кампания в понедельник» — это уважительная причина в моменте, но опасная как принцип. Если бы тест продлили на 14 дней — увидели бы тренд push-disable и решение могли бы быть другим. Прецедент создаёт привычку.

Что положили в процесс после кейса

После 28-дневного замера откатили — вернули 1 push/день, обновили процесс экспериментов. 5 изменений, которые с тех пор удерживают команду от повторения.

// фикс 01
Holdout-группа 5% — навсегда
Каждый эксперимент с долгосрочными последствиями (notifications, pricing, monetization) оставляет 5% holdout-группу, которая не получает изменение никогда. На ней считаем D28 / D60 / D90 retention и долгосрочный ARPU. Это даёт честное «зеркало» для бизнеса.
// фикс 02
Минимальная длительность теста = 2 × цикл
Правило: длительность теста не короче, чем двойной цикл того поведения, которое мы пытаемся изменить. Для push-fatigue это 28 дней. Для конверсии в покупку — 2 недели. Для платных подписок — 60–90 дней. Если бизнес «не может ждать» — делаем минимальный rollout 5–10%.
// фикс 03
Guard-метрики с порогами, не «просто смотрим»
У каждого эксперимента — список guard-метрик с пороговыми значениями. Для push: push-disable +20% за период, app-uninstall +15%, отписки от email +25%. Если порог пробит — авто-остановка, не «человеческое обсуждение». Это самый быстрый способ не «увлечься».
// фикс 04
Когортный срез по fatigue в каждом «канальном» эксперименте
Для каждого юзера считаем push_fatigue_score = взвешенная сумма push-получаемости за 30 дней. В анализе A/B обязательно — срез эффекта по квинтилям fatigue. Это сразу показывает, что «средний рост» это смесь сильно разных эффектов.
// фикс 05
Pre-mortem перед каждой раскаткой
15 минут перед раскаткой команда отвечает на 3 вопроса: (1) «через 28 дней мы увидели, что всё плохо — что это будет за метрика?»; (2) «как мы это поймём через холдаут или исторические когорты?»; (3) «какой rollback-сценарий?». Если на любой вопрос нет ответа — раскатка не идёт.

5 уроков из кейса

// урок 01
Короткие метрики врут, особенно когда они в плюс
D1-D7 могут быть «выигрышем за счёт будущего»: ускорил покупки, которые юзер сделал бы и без push, — короткая ARPU выросла, длинная не изменилась. Если изменение влияет на привычку (notifications, реклама, ценообразование) — без 28-day замера решение принимать опасно.
// урок 02
Holdout-группа 5% — это страховка, а не накладные расходы
Часто слышу «мы потеряем 5% выручки, оставив холдаут». Это не «потеря» — это цена за возможность увидеть правду. Без неё все долгосрочные эффекты сливаются с сезонностью, и через год невозможно сказать, какая фича работает.
// урок 03
Длительность теста = 2× цикл целевого поведения
Если цикл покупки — неделя, длительность — 2 недели минимум. Если цикл «накопить раздражение» — 3 недели, длительность — 6 недель. Если ты тестируешь monetization, цикл — это retention curve до точки стабилизации (60–90 дней).
// урок 04
Channel-disable rate — главная метрика «здоровья» канала
Для уведомлений: push-disable, email-unsubscribe, in-app-modal dismiss. Это необратимые метрики: отписавшийся юзер не отпишется обратно, отключивший пуш не включит. Они и есть guard, который должен прерывать тест.
// урок 05
Гетерогенный эффект > средний
«Средний ARPU +4%» — это смесь «+12% у одних» и «−6% у других». Если ты раскатываешь на всех — получаешь смесь эффектов в реальной базе, и часть юзеров реально проигрывает. Сегментный анализ (по fatigue, по сегменту RFM, по поведению) показывает, кому изменение реально полезно — и кому нет.

Связанные материалы

Главное из кейса

Самый дорогой класс ошибок в продуктовой аналитике — это не «не нашли эффект, когда он был». Это «нашли эффект, которого не было». Раскатили — потеряли часть базы — год чиним. Короткие метрики дают именно эту иллюзию: видишь движение в плюс, не видишь будущей цены.

Запомни три ориентира: (1) длительность теста = 2× цикл того поведения, которое меняешь; (2) 5% holdout — обязательное страхование любых изменений с долгосрочным эффектом; (3) guard'ы на необратимых метриках (отписки, удаление приложения) — с порогами, не «на глаз».

Следующий шаг: посмотри последние 5 A/B-тестов твоей команды. Сколько из них длились дольше двойного цикла целевого поведения? У скольких был holdout? У скольких — guard на необратимых метриках с автоматическим прерыванием? Часто ответ — «ни у одного». Это и есть тот процесс, который выловит твой собственный «push +4%».

АТ
Андрей Тарасенко
// Продуктовый аналитик · Авито · Ментор

Эта ошибка дорогая, потому что выглядит как победа. Команда счастлива, метрики хорошие, презентовали наверх — а через месяц приходит реальность. Я после такого случая стал злым на холдауты: трачу 10 минут на убеждение продакта, экономлю команде 2 месяца ловли последствий. Если ты ловишь себя на «всё хорошо за неделю, раскатываем» — остановись и проверь, посчитал ли ты долгосрочное.

Написать в Telegram
// ХОЧЕШЬ ЕЩЁ КЕЙСОВ?

Практикуй кейсы на тренажёре

В SQL-тренажёре — задачи по мотивам реальных собесов: воронки, когорты, retention, revenue. Пишешь запрос — получаешь проверку.

▶ Открыть SQL-тренажёр ★ Premium · 80 задач
Все материалы: База знаний · Telegram