Контекст
Зачем разбивать базу на сегменты, если есть выручка
Самая популярная клиентская сегментация — отсортировать всех по выручке и взять «топ-100». Иногда это работает (выбрать VIP-список для рассылки от CEO), но как операционная сегментация это плохо. Один и тот же «миллион выручки» в топе может быть у:
• клиента, который купил всё в первый месяц и больше не приходил,
• клиента, который покупает каждую неделю по чуть-чуть три года подряд,
• клиента, который раньше покупал часто, но последние полгода тихий.
Стратегия работы с этими тремя — разная. С первым надо понять, можно ли вернуть. Второго не трогать, чтобы не сломать. Третьего срочно поднимать win-back-кампанией, пока не ушёл совсем. На сортировке «по сумме» эти три случая выглядят одинаково.
RFM решает это, давая каждому клиенту три балла вместо одного:
R / Recency
Как недавно покупал
Дни с последней покупки. Чем меньше — тем выше балл (5 = совсем недавно, 1 = очень давно).
F / Frequency
Как часто покупает
Количество заказов за период. 5 — много заказов, 1 — один-два за всю историю.
M / Monetary
Сколько денег принёс
Суммарная выручка от клиента за период. 5 — крупные траты, 1 — минимальные.
Шкала 1–5 — это перцентили базы: 5 = верхние 20%, 1 = нижние 20%. Идея пришла из direct marketing 1990-х (Miglautsch, 1995) и до сих пор работает в e-com и ретейле, потому что три измерения дают плотный сигнал о клиенте, который читается с одного взгляда.
Кодировка простая: соединяем три балла подряд. 555 — лучший клиент: недавний, частый, крупный. 111 — худший. Между ними — 125 ячеек, из которых складываются 10–11 практических сегментов.
Реализация
SQL за 30 минут: NTILE(5) на каждой оси
Считаем RFM на нашем маркетплейс-датасете. Структура простая: таблица orders с user_id, created_at, amount. Делаем за три шага.
Шаг 1: агрегаты на юзера
rfm_step1.sql
WITH user_agg AS (
SELECT
user_id,
MAX(created_at) AS last_order_dt,
COUNT(*) AS orders_cnt,
SUM(amount) AS total_revenue
FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY user_id
)
SELECT * FROM user_agg;
Окно — 12 месяцев. Меньше — потеряем «спящих» с длинным циклом покупок (мебель, электроника). Больше — притянем юзеров, которые уже точно не вернутся (тогда они должны быть в Lost, а не в Hibernating). Для FMCG-кейсов берут 90–180 дней.
Шаг 2: NTILE(5) на каждую ось
rfm_step2.sql
WITH user_agg AS (/* как выше */),
rfm_scores AS (
SELECT
user_id,
last_order_dt,
orders_cnt,
total_revenue,
-- R: чем недавнее, тем выше балл
NTILE(5) OVER (ORDER BY last_order_dt DESC) AS r_score,
-- F: чем больше заказов, тем выше балл
NTILE(5) OVER (ORDER BY orders_cnt DESC) AS f_score,
-- M: чем больше revenue, тем выше балл
NTILE(5) OVER (ORDER BY total_revenue DESC) AS m_score
FROM user_agg
)
SELECT * FROM rfm_scores;
Три NTILE(5) на трёх разных ORDER BY — каждый юзер получает три балла независимо. Это квинтили: 20% юзеров с самой свежей покупкой получают R=5, следующие 20% — R=4, и так далее. Аналогично для F и M.
// Тонкий момент с Recency
Для Recency сортируем по
last_order_dt DESC — недавняя дата получает первый NTILE. Если перепутать сортировку, у тебя «давно купившие» окажутся в R=5, и всё дерево сегментов перевернётся.
Шаг 3: RFM-код и сегмент
rfm_step3.sql
WITH user_agg AS (/* шаг 1 */),
rfm_scores AS (/* шаг 2 */),
rfm_final AS (
SELECT
user_id,
r_score,
f_score,
m_score,
-- Объединяем в код вида '555'
CONCAT(r_score, f_score, m_score) AS rfm_code,
-- Усреднённый FM-балл — пригодится для сегментации
(f_score + m_score) / 2.0 AS fm_avg,
CASE
WHEN r_score >= 4 AND (f_score + m_score) >= 8
THEN 'Champions'
WHEN r_score >= 3 AND (f_score + m_score) >= 6
THEN 'Loyal'
WHEN r_score >= 4 AND (f_score + m_score) <= 4
THEN 'New customers'
WHEN r_score >= 3 AND (f_score + m_score) <= 4
THEN 'Promising'
WHEN r_score = 3 AND (f_score + m_score) BETWEEN 5 AND 7
THEN 'Need attention'
WHEN r_score = 2 AND (f_score + m_score) >= 5
THEN 'At risk'
WHEN r_score <= 2 AND (f_score + m_score) >= 8
THEN 'Cannot lose them'
WHEN r_score = 2 AND (f_score + m_score) BETWEEN 3 AND 4
THEN 'About to sleep'
WHEN r_score = 1 AND (f_score + m_score) BETWEEN 3 AND 5
THEN 'Hibernating'
WHEN r_score = 1 AND (f_score + m_score) <= 2
THEN 'Lost'
ELSE 'Other'
END AS segment
FROM rfm_scores
)
SELECT segment, COUNT(*) AS users, SUM(*) OVER () AS total
FROM rfm_final
GROUP BY segment
ORDER BY users DESC;
Готово. На маркетплейс-датасете (~80к юзеров с заказами за 12 месяцев) этот запрос отрабатывает за пару секунд и сразу даёт сводку: «12% — Champions, 18% — Loyal, 9% — At risk, 6% — Cannot lose them, 14% — Hibernating». Можно сразу строить из этого треугольник миграций сегментов от месяца к месяцу и считать revenue per segment.
⌬
Сделай RFM на нашем маркетплейс-датасете
В премиум-блоке SQL-тренажёра есть задача «Собрать RFM-сегментацию за 12 месяцев». Один и тот же скелет SQL, реальный продуктовый датасет, автопроверка по референс-запросу.
Открыть тренажёр
Карта
11 классических сегментов
125 ячеек 5×5×5 неудобно держать в голове. Их сводят в 10–11 практических сегментов. Деления у разных источников немного отличаются (Putler, Optimove, Authority Hacker — варианты), но скелет один и тот же.
Недавние, частые, крупные. 5–15% базы дают 40–60% выручки. На них держится магазин.
Loyal customers
R 3–4 · FM 6–8
Стабильные постоянные клиенты. Покупают чаще среднего, чек ровный, лояльны бренду.
Potential loyalists
R 4–5 · FM 5–7
Свежие, среднее F и M. Прокачаются в Loyal при правильном онбординге и второй покупке.
New customers
R 4–5 · FM 1–4
Только что зарегистрировались или сделали первую покупку. F и M ещё низкие — но это нормально.
Свежие, но не такие, как New customers — у них меньше теплоты, нужны более активные действия.
Need attention
R 3 · FM 5–7
Средние по всем осям. Без внимания скатятся в About to sleep — пока ещё можно удержать.
About to sleep
R 2 · FM 3–4
Раньше покупали средне, последние месяцы тихие. Без триггера уйдут в Hibernating.
Раньше покупали хорошо, но последние недели/месяцы тихие. Самый эмоциональный сегмент — теряем deal'ы.
Cannot lose them
R 1–2 · FM 8–10
Бывшие чемпионы, исчезли. Каждый из них стоит как 5 новых — терять нельзя ни при каких условиях.
Давно и редко. Шансы реактивации низкие, но при правильном триггере 5–10% возвращаются.
Покупали один раз очень давно. Реактивация почти не окупается — не тратим бюджет на этот сегмент.
// Подсказка для аналитика
Стартовая проверка сегментации — это
распределение выручки по сегментам. В здоровой базе e-com: Champions + Loyal + Cannot lose them = 70–80% выручки. Если Champions меньше 5% или Lost больше 50% — продукт «протекает» через retention.
Что делать
Action на каждый сегмент: e-com кейс
Сегментация без действий — упражнение в Excel. Реальная ценность RFM в том, что под каждый сегмент привязан конкретный сценарий работы. Ниже — что обычно делают в e-com.
Программа лояльности с накопительными бонусами. Early access на новинки. Персональные подарки в день рождения. Никаких скидочных уведомлений — могут обесценить чек.
удержать; превратить в адвокатов
Программа «приведи друга» — Loyal обычно охотно рекомендуют. Кросс-селл в смежные категории. Отзывы и UGC — они напишут.
расширить; превратить в Champions
Potential loyalists
прокачать F
Триггер на вторую покупку (скидка 10–15% на следующий заказ). Подписка на категорию интереса. Программа лояльности от уровня 1.
довести до 3-й покупки
Welcome-серия писем: подсказки, бестселлеры, экспресс-FAQ. Промокод на вторую покупку — действует 30 дней. Сбор предпочтений (категории, бренды).
первый месяц = критичный
Чек-ап от менеджера (особенно если средний чек выше среднего). Персонализированные рекомендации на основе первой покупки. Бесплатная доставка на 3-й заказ.
подняться по F
Need attention
не дать заснуть
Лёгкий ремаркетинг по любимой категории. Информация о новых поступлениях. Без агрессивных скидок — пока не нужно.
удержать R
About to sleep
мягкий триггер
Push «давно вас не видели + интересные новинки». Скидка 10%. Опрос «почему перестали покупать» — даёт качественную инфу для продукта.
вернуть в активные
Персональный win-back с агрессивной скидкой (20–30%). Менеджер по аккаунту в B2C-крупных кейсах. Опрос NPS — узнать причину.
срочно вернуть; окупается
Cannot lose them
любой ценой
VIP-возврат: личный звонок, эксклюзивный оффер, доступ к закрытой коллекции. Это бывшие 5–10% от выручки — экономика win-back окупается даже на одном возврате.
не считать ROI per touch
Hibernating
массовая реактивация
Дешёвые каналы (email, push) с большой скидкой. Если за два касания не реагируют — переводим в Lost и не тратим бюджет.
тестируем; не тратим много
Удаление из CRM-кампаний (экономия на коммуникациях). Используем только для статистики и lookalike в платном трафике.
не работаем активно
Эта таблица — не «правда», а отправная точка. На зрелой команде CRM экономика по каждому сегменту считается отдельно: cost per touch, CR в покупку, revenue per touch. Если At risk даёт ROI 5× а Hibernating 0.4× — на At risk идёт бюджет, на Hibernating — нет.
Миграция сегментов: главный KPI RFM-команды
Самая ценная картинка из RFM — не один срез на дату, а матрица переходов между сегментами от месяца к месяцу. Если Champions массово утекают в At risk, а not New customers → Promising / Potential loyalists, продукт «протекает» там, где у тебя пробоина.
rfm_migration.sql
WITH rfm_curr AS (/* rfm_final за последние 30 дней */),
rfm_prev AS (/* rfm_final за период 30–60 дней назад */)
SELECT
prev.segment AS from_segment,
curr.segment AS to_segment,
COUNT(*) AS users,
SUM(curr.total_revenue) AS revenue_at_destination
FROM rfm_prev prev
JOIN rfm_curr curr USING (user_id)
GROUP BY prev.segment, curr.segment
ORDER BY users DESC;
Через эту матрицу видно, что реально работает в CRM: если после win-back-кампании At risk → Loyal вырос с 2% до 8%, кампания окупилась. Если Cannot lose them → Lost не уменьшился — менять стратегию.
Границы
Где RFM не работает
Метод универсальный, но не везде. Есть три типа продуктов, на которых RFM в классической форме либо ничего не показывает, либо вводит в заблуждение.
// граница 01
B2B с малой базой
10–50 ключевых клиентов на компанию. NTILE(5) на 30 клиентах даёт по 6 в каждой группе — это не сегментация, это шум. Любое R, F, M рассчитывается на одном-двух наблюдениях за период, перцентили нестабильны от месяца к месяцу.
для B2B — качественная сегментация: размер компании, индустрия, статус сделки, account-based-маркетинг. RFM применим только на B2C-объёме (от 1000 активных клиентов).
// граница 02
Single-purchase товары
Свадебные платья, мебель, машины, недвижимость, B2B-софт с долгим контрактом. У большинства клиентов orders_cnt = 1 — Frequency как ось не работает. Champions и Loyal становятся одним и тем же сегментом.
используй RM (без F) или замени F на «количество просмотров каталога», «количество чатов с менеджером» — что-то, что у тебя реально меняется по юзеру. Это уже не классический RFM, но логика работает.
// граница 03
Подписки и SaaS
У большинства Monetary одинаковый — все на одном тарифе. Frequency = 1 платёж в месяц, тоже одинаковый. R теряет смысл — пока подписка активна, юзер «recent» по умолчанию. RFM становится одномерным и бесполезным.
замени метрики: F → активные дни за месяц, M → реально используемые фичи или часы продукта, R → дни с последнего ключевого действия. Это уже engagement-сегментация (HEART, Pirate), а не классический RFM.
// граница 04
Перекошенное распределение Monetary
В маркетплейсе с дорогими редкими товарами (предметы коллекционирования, оптовые B2B) Monetary может иметь распределение 80/20: 20% клиентов делают 95% выручки. NTILE(5) поделит «равномерно», но смысла мало — 80% юзеров окажутся в M=1, и эта группа неинформативна.
используй логарифм или процентили на хвостах: NTILE(5) на LOG(total_revenue + 1), или вручную разбей M на 5 групп по бизнес-границам.
Собеседование
RFM в кейс-интервью
RFM спрашивают и на технических собесах (по SQL и оконкам), и на продуктовых (когда обсуждают сегментацию и CRM). Сильный ответ — это не пересказать 11 сегментов, а показать, что ты понимаешь логику и границы.
- Что такое RFM-сегментация и чем она отличается от сортировки по выручке?
- Напиши SQL для R, F, M по таблице orders.
- Почему NTILE(5), а не NTILE(10) или NTILE(3)? Когда что брать?
- У нас 100 юзеров — стоит ли строить RFM? Если нет, что вместо?
- Champions массово утекают в At risk за последний месяц — какие гипотезы и куда смотреть?
- Как ты адаптируешь RFM под SaaS-подписку?
- Какая практическая ценность от того, что мы знаем «12% базы — champions»?
// Шаблон ответа
(1) RFM = 3 балла (R, F, M) по каждому клиенту через NTILE(5) — это перцентили базы.
(2) 125 ячеек сводятся в 10–11 практических сегментов: champions, loyal, at-risk, hibernating, lost.
(3) Главная ценность — не сам срез, а
матрица миграции между сегментами от месяца к месяцу. Она показывает, где продукт «протекает».
(4) Метод не работает на B2B, single-purchase и подписках — там адаптация. На 95% продуктовых собесов этого хватает.
Что такое RFM-сегментация простыми словами?
RFM — это способ разбить клиентскую базу на сегменты по трём измерениям: Recency (как недавно купил), Frequency (как часто покупает), Monetary (сколько денег принёс). Каждому юзеру даём по баллу 1–5 по каждой оси (через NTILE(5) в SQL) и комбинируем в код вида 555 для лучших и 111 для самых холодных. Получается 125 возможных групп, которые сводят в 10–11 практических сегментов: champions, loyal, at-risk, hibernating и так далее.
Чем RFM отличается от сортировки по выручке?
Сортировка по выручке смешивает в одну кучу клиента, который купил миллион 3 года назад и больше не приходил, и клиента, который купил миллион вчера и стабильно покупает каждую неделю. У них разная работа — с первого надо понять, можно ли вернуть, со вторым — удержать. RFM это разделяет тремя осями сразу, и стратегия для каждого сегмента становится осмысленной.
Сколько баллов брать — 3 или 5?
Для базы 10к+ активных юзеров — 5 баллов (NTILE(5)). Это даёт 125 ячеек, из которых видны champions (555) и lost (111). Для базы 1–10к — 3 балла (NTILE(3)), иначе квантили получаются слишком тонкими и сегменты нестабильны. Для B2B (10–100 клиентов) RFM в классическом виде не работает — там нужна качественная сегментация.
Какой период брать — месяц, квартал, год?
Зависит от цикла покупок. FMCG / e-com продукты — 90–180 дней. Электроника, мебель, путешествия — 12 месяцев. Подписки — 30–60 дней последней активности. Слишком короткое окно теряет «спящих с длинным циклом», слишком длинное — притягивает уже точно ушедших. Безопасный дефолт для e-com — 12 месяцев.
Какие 11 классических сегментов в RFM?
Champions, Loyal customers, Potential loyalists, New customers, Promising, Need attention, About to sleep, At risk, Cannot lose them, Hibernating, Lost. Карта пришла из direct marketing 1990-х (Miglautsch, 1995), до сих пор применяется в e-com и ретейле в почти неизменном виде.
Можно ли применять RFM к подпискам или SaaS?
В классической форме — плохо. У подписки Monetary почти всегда одинаковый (тариф), а Frequency определяется не покупками, а engagement. Адаптация — заменить F на «количество активных дней в месяц», M на «фактически используемые фичи или часы продукта». R остаётся как «дни с последней активности». На single-purchase товарах (свадебные платья, авто) F отсутствует — используют RM или другие методы.
Что лучше — RFM или ML-кластеризация (k-means)?
RFM — это интерпретируемая жёсткая разметка, которую может прочитать продакт и CRM-менеджер. K-means даёт «более правильные» кластеры по структуре данных, но менее интерпретируемые («кластер 3» сложно объяснить бизнесу). Практически часто комбинируют: RFM как базовая разметка для бизнес-коммуникации, ML — как уточняющий слой для подбора оптимальных триггеров и оффера внутри сегмента.
Что дальше
Связанные материалы
Главное про RFM
RFM — это не «модная штука из 1990-х», а рабочая базовая разметка клиентской базы, которую читает и аналитик, и продакт, и CRM-менеджер. 30 строк SQL, три NTILE(5), 11 сегментов — и сразу видно, на чём держится бизнес и где он протекает.
Запомни три вещи: (1) RFM ≠ сортировка по выручке, главная ценность — разделить «недавнего, частого, крупного» от «крупного, но давно ушедшего». (2) Один срез RFM скучный — настоящая ценность в матрице миграции сегментов между периодами. (3) Метод не для B2B, single-purchase и подписок — там адаптации, не классика.
Следующий шаг: возьми свои данные за 12 месяцев и собери RFM по шаблону выше. На любом адекватном e-com датасете запрос отрабатывает за минуты, а инсайтов даёт на месяц вперёд для CRM-команды.
АТ
Андрей Тарасенко
// Продуктовый аналитик · Авито · Ментор
RFM — первая сегментация, которую я показываю CRM-команде, если её ещё нет. Простая, понятная, интерпретируемая. Главная ценность — не первая картинка, а вторая: матрица переходов сегмент → сегмент. На ней видно, что реально работает в коммуникациях и где продукт «протекает» по retention.
Написать в Telegram