# Retention падает. Продукт стал хуже?

Учебный кейс Натальи Ветошкиной. Все пользователи и события синтетические, seed 739127. Срез после полного 29 сентября 2026 UTC. Продукт — модель личного планировщика задач.

## Воспроизведение

Node.js 18+. Сохраните data.json, analysis.mjs и verify.mjs в одну папку. `node verify.mjs` проверяет данные, границы окон, декомпозицию и группы жизненного цикла. Для повторной генерации сохраните generate.mjs рядом и выполните `node generate.mjs`: он перезапишет data.json, users.csv и activity.csv в своей папке.

retention.sql — PostgreSQL-запрос с DDL для CSV. Загрузите users.csv в users и activity.csv в activity через CSV-import с заголовками. Изменяйте cutoff, lo/hi, return_event и selected_channel в params. Код SQL предназначен для PostgreSQL; браузер использует analysis.mjs.

## Контракт

- 13 317 уникальных user_id; 8 недельных когорт регистрации. Дата входа — первое создание аккаунта, а не первое событие после фильтра даты отчёта.
- 69 653 строки user × date × event_type. В CSV каждая такая строка уникальна. Это проекция активных дней, не сырые события и не число задач.
- Канал organic/paid зафиксирован при регистрации, не переатрибутируется.
- data.json содержит days (task_completed) и opens (session_open): уникальные смещения календарной даты UTC от даты регистрации. Каждое полезное действие сопровождается открытием, но не наоборот.
- D7 = [7,7], W1 = [7,13], W2 = [14,20], W3 = [21,27], W4 = [28,34], R7-34 = [7,34]. Все границы включены. Это календарный возраст, не rolling 24h и не следующая календарная неделя.
- Знаменатель — вся недельная когорта зарегистрированных выбранного канала. Числитель — уникальные пользователи с хотя бы одним выбранным событием в окне.
- Клетка зрелая, только если окно завершилось у всех участников когорты. Незрелая клетка — NULL. Итог — сумма числителей / сумма знаменателей зрелых когорт выбранного окна. Разные колонки могут иметь разный состав когорт.
- Ошибочный режим сохраняет всю когорту в знаменателе при незавершённых окнах; он демонстрирует смещение, не является допустимой итоговой оценкой.

## Главный результат

База — регистрации 3–16 августа; сравнение — 31 августа–13 сентября. Промежуточные недели не входят в сравнение, но присутствуют в общей таблице. Все сравниваемые окна W1 зрелые.

База: 986 / 2521 = 39.1115%. Новые когорты: 1178 / 3664 = 32.1507%.
Organic: 798 / 1738 → 486 / 998. Paid: 188 / 783 → 692 / 2666. Внутри обоих каналов retention выше, общий — ниже.

R = sum(weight[channel] * retention[channel]). Сначала меняем веса на новые при старых удержаниях, затем меняем удержания. Вклад состава = −9.1349 п.п.; внутри каналов = +2.1741 п.п.; сумма = −6.9608 п.п. Округление в интерфейсе только для отображения. При старых весах и новых удержаниях — 41.6343%. Порядок подстановки влияет на распределение вкладов; причинного вывода нет.

## Жизненный цикл

Те же 2521 человека базовых когорт, общие зрелые W1 и W2. Пять взаимоисключающих групп: есть действие в обеих неделях; реактивирован (есть W0, нет W1, есть W2); первая ценность только W2 (нет W0 и W1, есть W2); пропустил W2 (есть W1, нет W2); не активен в W1/W2. Все группы суммируются в исходную когорту. Реактивация — локальное определение; нет утверждения о вечном оттоке.

## Ограничения

Генератор специально задаёт рост W1 внутри каналов и рост доли paid: парадокс состава сконструирован для обучения. Активность остальных окон генерируется отдельно, поэтому модель не является реалистичной моделью зависимости привычек между неделями. Некруглые числа не делают данные реальными.

Нет сезонной идентификации, затрат, маржи, выручки, статистических интервалов, причинной оценки, настоящих логов назначения/идентичности. Поздние события, удаление аккаунтов, блокировки, склейка устройств и тестовый трафик не моделируются. Все эти проверки нужны в реальной работе. Событие регистрации не считается полезным действием автоматически.

## Источники определений

- https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-calculation
- https://amplitude.com/docs/analytics/charts/retention-analysis/retention-analysis-time

Дата проверки: 30 сентября 2026. Семантика нашего отчёта явно описана выше; настройки аналитических инструментов могут отличаться.
