Free account

Save your progress

Keep lessons, quiz scores and your certificate in sync across devices. Lessons you already finished in this browser are added automatically.

At least 8 characters.

By continuing you agree to our terms and privacy policy. We store your name, email and course progress. No spam.

Track 4 · Retention, CRM & Lifecycle · Lesson 2 of 4

RFM Segmentation: Score Every Customer and Act on the Right Ones

Score customers on recency, frequency and monetary value, name the segments, give each one a playbook, and build it in a spreadsheet or SQL. Includes the B2B usage version.

TL;DR

Intermediate 15 min
  • RFM ranks customers on three behaviours that predict the next purchase: how recently they bought, how often, and how much. It comes from decades of direct-mail practice.
  • Score each dimension 1 to 5 with quintiles, then map score combinations to a dozen named segments that each get one clear action.
  • The value is in movement, not the snapshot. Track how many customers move between segments each month and build flows around those transitions.
  • In B2B SaaS, swap purchases for product usage: days since the last key action, active days per month, and seats or ARR.
KPIs it moves
  • Revenue share by segment
  • Segment migration rate
  • Repeat purchase rate
  • At-risk to active recovery rate
  • Champions count
Best for
  • E-commerce / D2C

Why this matters

Most CRM programmes send the same message to everyone, or segment on demographics that barely predict behaviour. RFM fixes that with three numbers almost every business already has in its order table.

The logic comes from catalogue and direct-mail marketers, who learned long before email that past buying behaviour is the best predictor of the next purchase. A customer who bought last week is far more likely to buy again than one who bought last year. Someone who has bought ten times is more likely than someone who bought once. And the value of a response depends on how much the customer spends.

What makes RFM worth learning in 2026 is not the model itself. It is that RFM gives every team a shared language. “We have 4,200 At Risk customers worth 18% of last year’s revenue” is a sentence finance, CRM and product can all act on.

The framework

The three dimensions

LetterQuestionD2C measureScore 5 means
RecencyHow recently did they buy?Days since last orderBought most recently
FrequencyHow often do they buy?Number of orders in the lookback windowMost orders
MonetaryHow much do they spend?Total or average net revenue in the windowHighest spend

Use a fixed lookback window, usually 12 or 24 months, so old one-off buyers do not dilute the ranking. Use net revenue (after discounts and returns), since COD refusals and returns can make gross spend misleading, especially in India.

From 125 cells to named segments

Three scores of 1 to 5 give 125 cells. Nobody runs 125 campaigns. Map them into about ten named segments driven mostly by R and F, with M used to prioritise inside a segment.

SegmentRule (R, F)Who they arePrimary action
ChampionsR 4-5, F 4-5Recent, frequent, high spendEarly access, referral ask, reviews, no discounts
LoyalR 3-5, F 3-5Steady repeat buyersCross-sell, loyalty tier, subscription offer
Potential loyalistsR 4-5, F 2-3Recent, a few ordersSecond-category nudge, membership pitch
NewR 5, F 1Just made a first orderOnboarding and second-order journey
PromisingR 4, F 1First order a little while agoSocial proof, replenishment timing, light incentive
Need attentionR 3, F 3Middling on bothPersonalised recommendations, limited-time content
About to sleepR 2-3, F 1-2Fading, low frequencyReminder of value, bestsellers, small offer
At riskR 1-2, F 3-5Used to buy often, gone quietWin-back series with tested offer
Can’t lose themR 1, F 5, high MBest customers now lapsingPersonal outreach, service recovery
HibernatingR 1-2, F 1-2Low and oldLow-cost seasonal sends, then sunset
LostR 1, F 1One order, long agoSuppress from paid channels, one last try, then remove

Segment playbooks

Goal: keep them buying and turn them into a growth channel.

Do:

  • Give early access to launches and limited drops
  • Ask for reviews and referrals right after a delivered order
  • Invite them to a VIP tier or customer advisory group

Avoid: blanket discounts. They would have bought anyway, so a discount is pure margin loss.

Step-by-step playbook

  1. Pull one row per customer. Customer ID, last order date, number of orders and net revenue, all inside the lookback window. Exclude cancelled, refused (COD) and fully returned orders.
  2. Choose the scoring method per dimension. Recency and monetary are continuous, so quintiles work. Frequency is lumpy (most customers have one or two orders), so use fixed thresholds such as 1, 2, 3 to 4, 5 to 9, and 10 or more.
  3. Score and label. Compute R, F and M scores, then apply the segment rules from the table above. Keep the rules in one shared file so analysts and CRM use the same definitions.
  4. Size each segment in customers and revenue. You will usually find a small group of Champions and Loyal customers carrying a large share of revenue. That tells you where a 1 point change matters most.
  5. Assign one owner and one action per segment. Each segment gets a goal metric, a journey and a guardrail (for example, maximum discount depth).
  6. Automate the refresh. Recompute daily or weekly and sync to your email, push and WhatsApp tools. Trigger journeys on segment changes, especially into At risk and out of New.
  7. Track migration monthly. Build a matrix of segment last month versus segment this month. The most important cells are New to Potential loyalist (second order) and Loyal to At risk (early churn signal).
  8. Prove incrementality. Keep a random 10% holdout per segment out of promotional sends for a full cycle. Compare revenue per customer, not open rates.

Building it in SQL

-- One row per customer, 24-month lookback, net of refusals and returns
WITH base AS (
  SELECT
    customer_id,
    DATE_DIFF(CURRENT_DATE(), MAX(order_date), DAY) AS recency_days,
    COUNT(DISTINCT order_id)                         AS orders,
    SUM(net_revenue)                                 AS monetary
  FROM orders
  WHERE order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 24 MONTH)
    AND status NOT IN ('cancelled', 'rto', 'refunded')
  GROUP BY customer_id
),
scored AS (
  SELECT
    *,
    6 - NTILE(5) OVER (ORDER BY recency_days ASC) AS r_score,  -- most recent = 5
    CASE
      WHEN orders >= 10 THEN 5
      WHEN orders >= 5  THEN 4
      WHEN orders >= 3  THEN 3
      WHEN orders = 2   THEN 2
      ELSE 1
    END AS f_score,                                            -- fixed thresholds
    NTILE(5) OVER (ORDER BY monetary ASC) AS m_score
  FROM base
)
SELECT
  *,
  CASE
    WHEN r_score >= 4 AND f_score >= 4                   THEN 'Champions'
    WHEN r_score = 1 AND f_score = 5 AND m_score >= 4    THEN 'Cant lose them'
    WHEN r_score <= 2 AND f_score >= 3                   THEN 'At risk'
    WHEN r_score >= 3 AND f_score >= 3                   THEN 'Loyal'
    WHEN r_score >= 4 AND f_score BETWEEN 2 AND 3        THEN 'Potential loyalists'
    WHEN r_score = 5 AND f_score = 1                     THEN 'New'
    WHEN r_score = 4 AND f_score = 1                     THEN 'Promising'
    WHEN r_score = 3 AND f_score <= 2                    THEN 'About to sleep'
    WHEN r_score = 2 AND f_score <= 2                    THEN 'Hibernating'
    ELSE 'Lost'
  END AS segment
FROM scored;

The order of the CASE rules matters: specific segments (Can’t lose them) must be tested before the broad ones that would otherwise catch them. The syntax shown is BigQuery. In Postgres, replace the date functions with CURRENT_DATE - MAX(order_date) and CURRENT_DATE - INTERVAL '24 months'.

Building it in a spreadsheet

With one customer per row (recency days in column B, orders in C, revenue in D, 5,000 customers):

  • Recency score: =6-MAX(1,ROUNDUP(PERCENTRANK.INC($B$2:$B$5001,B2)*5,0))
  • Monetary score: =MAX(1,ROUNDUP(PERCENTRANK.INC($D$2:$D$5001,D2)*5,0))
  • Frequency score: =IF(C2>=10,5,IF(C2>=5,4,IF(C2>=3,3,IF(C2=2,2,1))))

Then a lookup table maps each R and F pair to a segment name. A pivot table on segment gives counts and revenue share.

Worked example

Say a D2C coffee brand has 20,000 customers who ordered in the last 24 months and ₹6 crore of net revenue in that window.

After scoring:

SegmentCustomersAvg ordersAvg net order valueRevenueShare
Champions1,60012₹900₹1.73 cr29%
Loyal2,8006₹850₹1.43 cr24%
At risk2,4005₹850₹1.02 cr17%
All others13,2001.6₹860₹1.82 cr30%

The arithmetic for Champions: 1,600 x 12 x ₹900 = ₹1,72,80,000, about ₹1.73 crore, or 29% of revenue from 8% of customers.

Now size the At risk opportunity. These 2,400 customers averaged 5 orders but have gone quiet. Suppose a three-step win-back brings back 15% of them for one order of ₹850, while a 10% holdout shows only 5% would have returned anyway. Incremental return rate = 15% - 5% = 10 points. Incremental orders = 2,400 x 0.90 (the treated share) x 0.10 = 216. Incremental revenue = 216 x ₹850 = ₹1,83,600 from one order each, before counting the repeat orders a recovered regular tends to place.

Compare that with sending the same offer to all 20,000 customers. Champions would redeem it on orders they were already going to place, which is pure margin loss. Segmenting first is what makes the economics work.

B2B SaaS vs D2C: what changes

In SaaS, customers pay on a schedule whether or not they use the product, so purchase recency is useless. Swap in usage.

DimensionD2CB2B SaaS equivalent
RecencyDays since last orderDays since the account last did the key value action (sent a campaign, ran a report, shipped a build)
FrequencyOrders in 12 to 24 monthsActive days in the last 28, or weekly active users divided by paid seats
MonetaryNet revenueARR, or paid seats
Extra dimensionCategory breadthFeature breadth: number of core features used

Segment names change too. “At risk” becomes “high ARR, falling usage”, which goes to customer success with a 60 to 90 day lead on renewal. “Champions” become expansion and case study candidates. “Low ARR, no recent usage” gets automated re-onboarding rather than a human call.

How to measure it

MetricDefinitionWindow
Segment size and revenue shareCustomers in segment, and their net revenue / total net revenueLookback window, refreshed monthly
Segment migration rateCustomers who moved from segment A to B / customers in A at startMonth over month
Second-order rate (New)New customers who placed a second order / new customersWithin your inter-purchase window
At risk recovery rateAt risk customers who returned to R 3 or better / At risk customers at start60 days, compared with a holdout
Incremental revenue per customerRevenue per treated customer minus revenue per holdout customerOne full purchase cycle

Report migration as a matrix, not a list. A healthy programme moves customers up and to the left over time. If At risk grows faster than Loyal for three months in a row, your retention problem is getting worse, regardless of what the total revenue line says.

Case study · Flipkart Shopsy

Case study: RFM-driven push and in-app campaigns during Big Billion Days (vendor-reported)

  • 4x Conversion uplift (Big Billion Days)
  • 2x Retention uplift
  • 3x Stickiness uplift
  • None (vendor case) Measurement method disclosed

Shopsy, Flipkart's value-commerce app, describes in a MoEngage case study how it used RFM segmentation to drive action-oriented campaigns. The platform split users into RFM segments and showed the count and share of users in each, so campaign managers could target a precise segment without building custom queries. Shopsy paired those segments with personalised push notifications and offers shown at the top of the app to nudge customers toward purchase. The case study reports a 4x uplift in conversions during the Big Billion Days sale, a 2x uplift in retention, a 3x uplift in stickiness, and monthly active users roughly tripling over the 2022 period it covers. Read these as the vendor and the customer presenting them: the document does not describe control groups or how uplift was measured, which is exactly the gap this lesson's measurement section teaches you to close. The useful takeaway is the operating model. RFM became the targeting layer every campaign started from, rather than a one-off analysis.

Sources: MoEngage: Flipkart Shopsy Observes 4X Uplift in Conversions (case study PDF)

Pitfalls vs pro moves

What amateurs do What top 1% growth teams do
Run RFM once as a slide for the leadership offsite. Recompute scores daily or weekly in the warehouse, sync segments to the CRM, and trigger journeys when a customer changes segment.
Send the same 20% discount to every segment. Match the action to the segment. Champions get early access and referral asks, not discounts. Discounts are reserved for at-risk customers where a holdout proves they are incremental.
Use one global quintile across product lines with very different price points and cycles. Score within comparable groups (category, country, or plan) so a monthly coffee buyer and a once-a-year mattress buyer are not ranked on the same recency scale.
Let NTILE split ties arbitrarily, so two customers with 1 order land in different frequency scores. Use fixed business thresholds for frequency (1, 2, 3 to 4, 5 to 9, 10 or more orders) when the distribution is lumpy, and quintiles only where values are continuous.
Treat a customer with one large order as a Champion. Weight recency and frequency above monetary value when naming segments. Big one-off orders predict repeat behaviour far less than steady frequency.

Knowledge check

Knowledge check

3 questions · pick an answer to see the reasoning

  1. Q1. A D2C tea brand finds 9% of customers score R1, F5, M5: they used to buy every month and spend the most, but have not ordered in 120 days. What should the first action be?

  2. Q2. Your SQL uses NTILE(5) on order count. 62% of customers have exactly one order. What goes wrong?

  3. Q3. A B2B SaaS company wants an RFM-style model. Which mapping fits best?

Sources

  1. MoEngage: Flipkart Shopsy case study (PDF)

Updated