Surrika

Удержание клиентов по когортам первого месяца покупки

Когорта первого месяца собирает покупателей по месяцу первой выигранной сделки. Удержание показывает, какая доля из них купила снова в первый и третий месяц после старта. Так видно, возвращаются ли клиенты после первой покупки мебели.

Покупатели

Как считать

  1. Для каждого покупателя находим месяц первой покупки, это его когорта.
  2. Берем последние 12 полных месяцев, чтобы в когортах были покупатели с одинаковым сроком наблюдения.
  3. Возврат на первый месяц считаем по покупке ровно через месяц после старта, на третий по покупке через три месяца.
  4. Долю считаем от числа покупателей в когорте.
  5. Покупки в месяц старта в возврат не включаем.

Расчет на выгрузках магазина

Пример посчитан на выгрузках вымышленного мебельного магазина: продажи сайта и трех маркетплейсов, реклама, сделки CRM и остатки за 2024-2025 годы.

Хочу понять, какие покупатели возвращаются после первой покупки мебели. Как посчитать удержание по когортам первого месяца и увидеть возврат через месяц и через три?

Удержание по когортам первого месяца

SQL, по которому посчитано

WITH won AS (
    SELECT
        customer_id,
        date,
        date_trunc('month', date) AS purchase_month
    FROM deals
    WHERE status = 'Выиграна'
      AND customer_id IS NOT NULL
),
bounds AS (
    SELECT
        date_trunc('month', max(date)) AS max_month,
        date_trunc('month', max(date)) - INTERVAL '12 months' AS min_cohort_month,
        date_trunc('month', max(date)) - INTERVAL '3 months' AS complete_3m_month
    FROM deals
),
first_purchase AS (
    SELECT
        customer_id,
        min(purchase_month) AS cohort_month
    FROM won
    GROUP BY customer_id
),
cohorts AS (
    SELECT
        f.cohort_month,
        count(*) AS customers
    FROM first_purchase f
    CROSS JOIN bounds b
    WHERE f.cohort_month >= b.min_cohort_month
      AND f.cohort_month < b.max_month
    GROUP BY f.cohort_month
),
returns AS (
    SELECT
        f.cohort_month,
        w.customer_id,
        date_diff('month', f.cohort_month, w.purchase_month) AS month_offset
    FROM first_purchase f
    JOIN won w ON w.customer_id = f.customer_id
    CROSS JOIN bounds b
    WHERE f.cohort_month >= b.min_cohort_month
      AND f.cohort_month < b.max_month
)
SELECT
    c.cohort_month,
    c.customers,
    round(
        count(DISTINCT CASE WHEN r.month_offset = 1 THEN r.customer_id END)::DOUBLE
        / c.customers,
        4
    ) AS retention_month_1,
    CASE
        WHEN c.cohort_month <= (SELECT complete_3m_month FROM bounds)
        THEN round(
            count(DISTINCT CASE WHEN r.month_offset = 3 THEN r.customer_id END)::DOUBLE
            / c.customers,
            4
        )
    END AS retention_month_3
FROM cohorts c
LEFT JOIN returns r ON r.cohort_month = c.cohort_month
GROUP BY c.cohort_month, c.customers
ORDER BY c.cohort_month

Где взять данные для когорт первого месяца

Когорты собирайте по сделкам из CRM, где есть покупатель, дата и статус. В продажах маркетплейсов покупатель не сохраняется, поэтому повторную покупку на Wildberries или Ozon с тем же человеком не связать. Для сайта и шоурума берите только выигранные сделки. Проигранная сделка не подтверждает покупку. Дату берите из сделки, а не из оплаты, иначе когорта сдвинется на месяц. Текущий месяц не включайте, он неполный.

Как читать удержание по когортам первого месяца

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

Что делать с удержанием по когортам

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

Частые ошибки

Считать удержание по числу сделок

Покупатель с двумя покупками в одном месяце дает две сделки и одно возвращение. Если делить число сделок на размер когорты, доля завышается, а иногда превышает 100%. Считайте разных покупателей, а не сделки.

Считать месяц по 30 дням

Календарный месяц не равен 30 дням. Покупка в начале следующего месяца может попасть в первый месяц, а при счете по 30 дням уйдет во второй. Берите номер календарного месяца от месяца старта.

Сравнивать неполный третий месяц

У последних когорт третий месяц после старта еще не закончился или не наступил. Ноль или пустое значение там не говорят об оттоке. Это отсутствие наблюдений. Сравнивайте третий месяц только у когорт, где он полностью прошел.

Вопросы

Как учитывать возврат товара в когорте?

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

Можно ли считать удержание по выручке?

Можно, но это будет удержание выручки. Для клиентской когорты считайте покупателей, иначе крупный чек одного клиента заменит возврат нескольких.

Посчитайте это на своих выгрузках

Бросьте выгрузки на доску Surrika и задайте вопрос обычными словами. Ответ придет графиком, а под ним будет SQL, по которому он посчитан.

14 дней бесплатно, карта не нужна.

По теме

Все задачи