All articles

RFM: The 50-Year-Old Customer Segmentation Every Small Business Should Steal

Your VIPs, your churn risks, and your dead weight are hiding in the same customer list. RFM is the simple scoring model that separates them in under an hour.

TL;DR. RFM (Recency, Frequency, Monetary) is a customer-segmentation model from 1995 that still beats most modern AI-powered alternatives for small businesses. You rank every customer on three dimensions, combine the scores, and get a list of your Champions, your At Risk customers, your Ghost signups, and your Lost cause — each deserving a very different email. You can build RFM in an afternoon from your Shopify or Stripe orders export. No data science required.

The segmentation hiding in your orders export

Every small business I talk to has the same two problems:

  1. They email every customer the same thing.
  2. They have no idea which customers are worth protecting.

Both problems have the same root cause: the customer list is one giant, undifferentiated column of email addresses. The person who bought €4,000 worth of product last year and the person who bought once two years ago and forgot you exist get the same newsletter. It’s not that you don’t know one from the other — it’s that your tools don’t.

RFM is how you fix that without hiring a data team.

What RFM actually is

Three questions, asked of every customer on your list:

  • Recency (R). When did this customer last buy?
  • Frequency (F). How many times have they bought, total?
  • Monetary (M). How much have they spent, total?

Each gets a score from 1 (worst) to 5 (best). Your most recent, most frequent, biggest-spending customer is a 555. Your long-gone, one-time, low-spend customer is a 111. Every real customer is a three-digit code somewhere in between.

That’s the whole model. It was developed in direct mail in the 1990s. It continues to work because the three dimensions genuinely capture most of what matters about a customer’s relationship with you, and because it’s simple enough to compute on any dataset you can export to a CSV.

Why it beats fancier alternatives for small businesses

You can pay Klaviyo, Segment, or a custom ML model to do “predictive” segmentation. They’re fine. For a business with under a few hundred thousand customers, they usually don’t beat RFM by enough to justify the cost or the dependency. Three reasons:

  • It’s interpretable. When a customer ends up in “At Risk”, you can see exactly why: score 2 on Recency, 5 on Frequency, 4 on Monetary. Loyal, spends well, but hasn’t bought in 90 days. That’s a customer to call personally. No ML model tells you that in one glance.
  • It updates cleanly. Re-running RFM next month is one click. No retraining, no drift, no hidden parameter tuning.
  • It’s honest about what it knows. RFM only uses purchase history. It doesn’t claim to know what customers feel or what they’ll click on. For most small businesses, purchase history is 90% of the signal anyway.

How the scoring works

Start with your orders export. One row per order, with at minimum: customer_email, order_date, and order_total. Then per customer, compute three raw numbers:

  • Raw Recency = days since the customer’s most recent order. Smaller is better.
  • Raw Frequency = count of orders.
  • Raw Monetary = sum of order totals.

Now convert each raw number into a 1–5 score by splitting your customer list into five equal groups (quintiles). The 20% of customers who bought most recently get R=5. The next 20% get R=4. And so on. Do the same for Frequency and Monetary independently.

That’s it. Every customer now has an R, F, and M score from 1–5, and a combined code like 544.

The segments that matter

125 possible codes is too many to act on. The standard RFM playbook groups them into seven segments you can actually do something with:

SegmentTypical RFM patternWhat they areWhat to send them
Champions555, 554, 544, 545Recent, frequent, big spenders. Your top 5–10%.Early access, referral asks, loyalty rewards. Do not discount.
Loyal543, 453, 452, 443Frequent buyers, good spend, maybe not the most recent.Keep warm. Product updates, category newsletters.
Potential Loyalists515, 514, 415Recent buyers, high spend, low frequency so far.Second-purchase nudges. Bundle offers.
New Customers51XFirst-time buyer in the last 30 days.Welcome series. Product education. Ask for a review.
At Risk255, 254, 245, 145Were frequent and high-spend — haven’t bought recently.Personal outreach, not a mass campaign. Call them if B2B.
Can’t Lose Them155, 154Top historical spenders, completely disengaged.Strong win-back offer. One shot, one chance.
Hibernating / Lost111–133Low on everything.Remove from frequent campaigns. Occasional reactivation only.

The exact thresholds vary by business. What matters is the shape: a small Champions group (5–10%), a bigger Loyal group, a middle mass of developing customers, an At Risk group worth fighting for, and a long tail of inactive customers you should stop emailing as often.

Building RFM in a visual pipeline

In a tool like Flowfile, RFM is about eight nodes. Here’s the workflow.

Step 1: Read your orders export

Drop the Shopify or Stripe orders CSV onto the canvas. Each row is one order.

Step 2: Normalize emails

Add a Formula node that lower-cases the email column. This matters — Alice@Shop.com and alice@shop.com will split into two customers otherwise.

Step 3: Aggregate per customer

Add a Group By node keyed on customer_email. Compute three aggregations:

  • last_order_date = max(order_date)
  • order_count = count(*)
  • total_spend = sum(order_total)

Now every row is one customer with three raw numbers.

Step 4: Compute recency in days

Add a Formula node: days_since_last_order = today - last_order_date.

Step 5: Score each dimension

This is the clever part. Add a Polars Code or similar node (available in the desktop, web, and browser versions of Flowfile) that assigns quintile scores using qcut — the function that splits a list into equal groups. One line per dimension:

  • R_score: 5 for the most-recent quintile (smallest days_since_last_order), down to 1 for the oldest.
  • F_score: 5 for the top-frequency quintile, down to 1 for the bottom.
  • M_score: 5 for the top-spend quintile, down to 1 for the bottom.

If you don’t want to write a line of code, you can also approximate quintiles using five Filter branches and a union — slower to build, but fully click-through.

Step 6: Combine into an RFM code

A Formula node: rfm = R_score * 100 + F_score * 10 + M_score. You now have a three-digit code per customer.

Step 7: Assign segment labels

A Formula or Lookup node maps RFM codes to segment names using the table above. Customers who don’t match a named pattern get labeled “Other.”

Step 8: Write the output

A Write Data node exports customers_by_segment.csv (or .xlsx). You now have every customer tagged.

What to do with the output

The real return on RFM isn’t the file — it’s the decisions it enables. Three moves to run in the first month:

  1. Protect the Champions. Pull the Champions list into a separate CSV. Email them a personal thank-you or a referral offer. No discount. Discount your Champions and they’ll expect discounts forever.
  2. Save the At Risk group. These are your highest-leverage emails. A founder of a B2B business should personally call the top 20. An e-commerce shop should send a tightly personalized win-back — not a generic campaign.
  3. Stop emailing the Lost. Move them to a low-frequency list. Your open rates will climb, your deliverability will improve, and the cost of your ESP (email service provider) goes down because most ESPs bill on list size.

Similar businesses typically see the strongest return from the At Risk group — these are customers who used to spend with you and haven’t recently, and a good win-back message often reactivates a meaningful share of them.

Automating the monthly refresh

The whole pipeline is one file. Next month, drop in the fresh orders export and click Run. The segments regenerate in seconds. Customers who moved between segments (a Loyal who’s now At Risk, a Potential Loyalist who became a Champion) show up immediately. Over time, watching customers move between segments is itself a useful signal — a widening At Risk bucket is an early warning that retention is slipping.

Getting started

Flowfile is free, open-source, and runs locally — your customer data never leaves your laptop. The browser demo includes the nodes you need (Read CSV, Group By, Formula, Polars Code for the quintile step, Download) and runs with no signup.

A good first RFM project: pick the last 12 months of orders, build the pipeline above, and look at the Champions and At Risk lists the first week you have them. Nothing about your customer base will look the same again.


Related reading. Bubble + Stripe + Mailchimp: A Non-Technical Founder’s Playbook shows the data-joining pattern that gets you to a clean customer list, and The 10 Numbers Every Small Business Should Track Each Week covers the weekly scorecard that RFM complements.

Frequently asked questions

What does RFM stand for?
Recency, Frequency, Monetary. For each customer: how recently did they buy, how often do they buy, and how much do they spend. Score each dimension 1–5, combine, and you have a segment for every customer on your list.
How much data do I need before RFM is useful?
Around 200–300 customers with at least one purchase is the sensible floor. Below that the segments are too small to act on. Above that, every additional customer makes the model sharper.
Does this work for subscription businesses too?
Yes, with a tweak. Instead of number of orders for Frequency, use number of months active. Instead of total revenue for Monetary, use lifetime value. The scoring and segment labels carry over unchanged.
How often should I re-run the segmentation?
Monthly is the right cadence for most small businesses. Weekly is overkill — segments don't shift that fast. Quarterly is too slow — you miss the window on At Risk customers. Monthly gives you time to act on each cohort before it moves.
Do I need special software?
No. RFM runs on the same orders export you already have from Shopify or Stripe. A visual pipeline tool like Flowfile computes the scores and assigns segments in about eight nodes. No machine learning, no stats background required — it's ranking and addition.