返回博客

用 RFM 模型给用户行为打标签

做 CRM 相关功能时,有一道我曾经绕了很久的弯路:后台有用户的历史消费数据,产品想在用户详情页展示「这个用户是什么类型的客户」,一开始我的第一反应是——写一段 if/else,按消费金额高低分个 VIP、普通、沉睡三档,完事。

结果一线用的反馈是:「VIP 里面有人两年没来了,普通里面有人上周刚买了三次,这个标签没什么用。」

问题出在哪里?单维度排序忽略了时间维度和频次维度。一个历史高消费用户如果已经一年没来,给他贴「重要客户」标签只会误导跟进动作。

RFM:三条维度,各自说话

RFM 是一个经典的用户分层框架,核心思路是用三个维度独立打分,再组合出用户类型:

  • R(Recency):距上次消费多久?越近分越高
  • F(Frequency):近一年买了几次?越多分越高
  • M(Monetary):近一年花了多少?越多分越高

每个维度独立打 1-5 分,≥3 算「高」,<3 算「低」,三个维度的高低组合出 2³ = 8 种用户类型。

用近一年而非累计数据

F 和 M 优先取「近一年」窗口内的数据,而不是用户全生命周期累计值。原因是:一个三年前的高消费用户如果已经两年没来,他的「当前行为模式」是沉睡,不是价值客户。累计数据会掩盖这个信号。

8 种类型的核心价值:每种类型对应一个行动

分出 8 种类型的意义不是「贴标签」,而是让每个标签直接对应一个具体的跟进建议:

| 类型 | R | F | M | 行动方向 | |------|---|---|---|---------| | 重要价值客户 | 高 | 高 | 高 | 保持关怀,给专属体验 | | 重要发展客户 | 高 | 低 | 高 | 提升到店频次 | | 重要保持客户 | 低 | 高 | 高 | 尽快召回,时间窗口短 | | 重要挽留客户 | 低 | 低 | 高 | 发送专属挽回优惠 | | 一般价值客户 | 高 | 高 | 低 | 推荐高客单价产品 | | 一般发展客户 | 高 | 低 | 低 | 新客培养期,耐心跟进 | | 一般保持客户 | 低 | 高 | 低 | 适当问候,维持存在感 | | 一般挽留客户 | 低 | 低 | 低 | 低优先级,节日触达即可 |

每一行的「行动方向」才是真正交付给一线员工的东西。数字本身没有意义,意义在于它能驱动什么行为。

阈值不是一成不变的

评分阈值需要根据行业特性校准。同样是零售场景,高频快消品和低频奢侈品的 F 轴、M 轴阈值可以相差几倍:

中端零售(客单价 200-800):
  M: 5000+ → 5分,2000+ → 4分,500+ → 3分

奢侈品(客单价 3000+):
  M 阈值整体上调 3-5 倍

高频快消(月均购买 5+ 次):
  F 阈值整体上调 2-3 倍

校准方式是看实际分布:如果超过 50% 的用户落在同一个类型,说明阈值需要调整。建议每季度检查一次分布情况,防止大多数用户都聚集在「一般挽留」里,导致分层失去意义。

数据兜底策略

在实际落地时,有一个细节值得注意:统计 API 的数据(近一年频次、金额)通常是异步加载的,而用户基本信息(最近消费时间、累计消费金额)是同步可用的。

合理的策略是:

  1. 页面初始化时用基本信息中的累计数据做一次初步评分,先渲染出类型标签
  2. 统计 API 返回后,用近一年数据重新计算,更新评分和类型

这样既保证了首屏不空白,又保证了最终展示的是更准确的近期行为数据。两次计算的结果可能不同,但这是预期内的——数据精度在提升。

一句话心法

分层的价值不在于告诉系统「这是谁」,而在于告诉一线员工「现在该怎么做」——类型和行动建议要成对设计,否则分层就只是漂亮的标签游戏。