Как посчитать Repeat Purchase Rate в SQL

Проверь себя · 1/3разбор после ответа
Какое утверждение верно про DATE_TRUNC('week', ts) в PostgreSQL (где ts имеет тип timestamp)?

Зачем Repeat Purchase Rate

В e-com покупатель, сделавший 2+ заказа, окупает себя втрое быстрее того, кто купил лишь однажды. Repeat Purchase Rate (RPR) — индикатор лояльности и здоровья клиентской базы.

Формула

Repeat Purchase Rate = customers_with_2plus_orders / total_customers × 100%

Окно — обычно 90 или 365 дней.

Базовый расчёт

WITH user_orders AS (
    SELECT
        user_id,
        COUNT(*) AS orders_count
    FROM orders
    WHERE status = 'paid'
      AND created_at >= CURRENT_DATE - INTERVAL '365 days'
    GROUP BY user_id
)
SELECT
    COUNT(*) AS total_customers,
    COUNT(*) FILTER (WHERE orders_count >= 2) AS repeat_customers,
    COUNT(*) FILTER (WHERE orders_count >= 2)::NUMERIC * 100
        / NULLIF(COUNT(*), 0) AS rpr_pct
FROM user_orders;

По когортам

WITH first_orders AS (
    SELECT
        user_id,
        DATE_TRUNC('month', MIN(created_at)) AS first_order_month
    FROM orders
    WHERE status = 'paid'
    GROUP BY user_id
),
repeat_users AS (
    SELECT
        f.first_order_month,
        f.user_id,
        COUNT(o.order_id) AS total_orders
    FROM first_orders f
    JOIN orders o ON o.user_id = f.user_id
        AND o.status = 'paid'
    GROUP BY f.first_order_month, f.user_id
)
SELECT
    first_order_month,
    COUNT(*) AS new_customers,
    COUNT(*) FILTER (WHERE total_orders >= 2) AS repeated,
    COUNT(*) FILTER (WHERE total_orders >= 2)::NUMERIC * 100
        / NULLIF(COUNT(*), 0) AS rpr_pct
FROM repeat_users
GROUP BY first_order_month
ORDER BY first_order_month;
Закрепи формулу repeat purchase rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать repeat purchase rate в Telegram

По сегментам

По каналу привлечения:

WITH user_data AS (
    SELECT
        u.user_id,
        u.acquisition_channel,
        COUNT(o.order_id) AS orders
    FROM users u
    LEFT JOIN orders o ON o.user_id = u.user_id AND o.status = 'paid'
    WHERE u.signup_date >= CURRENT_DATE - INTERVAL '365 days'
    GROUP BY u.user_id, u.acquisition_channel
)
SELECT
    acquisition_channel,
    COUNT(*) AS customers,
    COUNT(*) FILTER (WHERE orders >= 2) AS repeat_customers,
    COUNT(*) FILTER (WHERE orders >= 2)::NUMERIC * 100
        / NULLIF(COUNT(*), 0) AS rpr_pct
FROM user_data
WHERE orders >= 1
GROUP BY acquisition_channel
ORDER BY rpr_pct DESC;

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

Ошибка 1. Считать в неполном году. Юзер купил в марте и ещё не сделал второй заказ. На графике RPR за апрель цифра занижена. Используйте только зрелые (matured) когорты.

Ошибка 2. Включать pending / cancelled заказы. Берите только status = 'paid'.

Ошибка 3. Два заказа в один день. Два заказа в одну дату — считать это повтором? В классической логике да, но интуитивно «повтор» — это возврат клиента спустя время. Отфильтруйте по условию time_between_orders > N days.

Ошибка 4. Путать RPR и частоту покупок. RPR — бинарная метрика: повторил клиент покупку или нет. Frequency — это число покупок. Это разные метрики, не путайте их.

Ошибка 5. Игнорировать автопродление подписки. В подписочной модели автопродление генерирует «повторы» автоматически. Поэтому RPR в e-com и в SaaS — это разные по смыслу понятия.

Связанные темы

FAQ

Какой RPR считается хорошим?

В e-com нормой считается 20-40%, в премиум-сегменте — 30-50%. В доставке FMCG показатель выше, 60% и больше, потому что товары покупают регулярно. Ориентируйтесь на свою категорию, а не на средний по рынку.

Чем RPR отличается от удержания?

Удержание (retention) — про активность: заходит ли пользователь в продукт. RPR — про покупки: платит ли он повторно. Метрики расходятся: удержание может быть 70% при RPR 20%, если пользователи заходят часто, но покупают редко.

Окно 90 или 365 дней?

Зависит от категории товара и типичного цикла повторной покупки. Для FMCG берут 30 дней, для одежды — 90, для электроники — 365. Ориентируйтесь на то, как часто в вашей категории вообще возвращаются за покупкой.

RPR падает — что делать?

Сначала когортный анализ — посмотрите, какие когорты просели и с какого момента. Дальше подключайте механики возврата: cross-sell-рассылки и пуши, пересмотр программы лояльности. И проверьте разрез по категориям — часто всё падение тянет одна конкретная товарная группа.

Бизнес с разовыми покупками?

В нишах вроде образования или продажи автомобилей RPR низкий по своей природе — такие покупки просто не совершают часто. Не сравнивайте его с FMCG, где повтор заложен в саму модель потребления.