Как посчитать Repeat Purchase Rate в SQL
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;По сегментам
По каналу привлечения:
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 — это разные по смыслу понятия.
Связанные темы
- Как посчитать frequency в SQL
- Как посчитать retention в SQL
- Как посчитать AOV в SQL
- Как посчитать LTV в SQL
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, где повтор заложен в саму модель потребления.