learn-rfm-modeling-with-phoebe / Session 3 of 6
Learn RFM Modeling with Phoebe · Session 3 of 6

The RFM bench

Sessions 1 and 2 argued that the knife decides the segment. Tonight the argument is replaced by a count. Four thousand real customers, sampled from the 93,358 you built, sit in this page. Seven ways of cutting them are computed in front of you: two eight-group splits, the tutorial route of fifths collapsed to eight, Klaviyo's published rule, quintiles into Putler's eleven, a merchant's own thresholds, and the tempting simplification of adding the three scores into one number. For each, the page counts how many people the cut calls its best, how many of those bought exactly once, who lands in the win-back audience, and what a message to that audience would return on a response model the widget prints in full. The people never change. Only the knife does.

🔴 Bench night Bring your session 2 numbers No code tonight, all clicking 45 min
0-3 · Welcome 3-14 · How to read the bench 14-40 · The seven cuts, in order 40-45 · Q&A
Part 0

Where we start

A bench is a fixed set of people and a fixed set of questions, so that when two cuts give two answers the only thing that differed was the cut. The people are real: 4,000 rows drawn with a seeded generator from the Olist table of session 1, each carrying its recency in days, its count of delivered orders and its total payments. The questions are the four that decide whether an RFM project pays: who is called best, whether they deserve it, who gets the win-back message, and what that message returns.

🎫 Clear all three quiz questions to stamp your passport measured = counted from the 4,000 rows modelled = from the stated response model

★ What you walk out with tonight. The measured answer to "how many of our Champions bought once" under seven cuts, the two-column habit of reading yield per message and total side by side, and the reason one total score is not a simplification but a blindfold.

Part 1 · covers what the bench measures

Four questions, two kinds of number

6 min live

Every readout on the bench carries a small tag. measured means the number was counted from the rows and would be the same in any spreadsheet. modelled means it depends on assumptions the widget states, and would change if you changed them. Reading the tag before the number is the whole skill.

THE BENCH: FIXED PEOPLE, SEVEN KNIVES, FOUR DIALS 4,000 real customers a seeded sample of the 93,358 mean median Klaviyo Putler threshold sum seven ways of cutting the same three columns MEASURED top group share, revenue MEASURED bought once inside the top group MEASURED win-back audience size, repeat share MODELLED five stated assumptions yield per message, total Three dials would read the same in any spreadsheet. The fourth would move if you changed the model, and the widget prints the model.
🔍 Click to zoom - the tangerine knife is the anti-lever, and the tangerine dial is the one whose number you must read the tag on first
LiveThe three measured dials, and why "bought once" is the one to watch3 min▶

Top group share and revenue share. How many people the cut calls its best, and how much of the money they hold. A top group that is 16 percent of customers and 27 percent of revenue looks healthy until you read the next dial.

Bought once, inside the top group. The share of the "best" customers who have exactly one delivered order. A Champion who bought once is a first-time buyer wearing a badge, and every action aimed at Champions, early access, a loyalty tier, a personal note, is being spent on someone the shop has met once. On a base where 97 percent buy once, this dial is where the cuts separate.

Win-back audience, and its repeat share. How many people the cut would put on the win-back list, and what fraction of them have ever bought twice. A win-back message assumes a relationship to win back. Sent to a one-time buyer it is an acquisition message with a discount attached.

Self-studyThe modelled dial, and the five numbers under it3 min▶

Yield needs a response model, and no dataset carries one. The bench states five numbers and uses nothing else: a lapsed one-time buyer reorders on their own 1.0 percent of the time and a message lifts that by 15 percent; a lapsed repeat buyer reorders 4.0 percent of the time and a message lifts that by 50 percent; a message costs R$ 0.30; one in ten of every audience is held out and never messaged; the reactivation order is worth that customer's own average order from the data. Net yield is incremental revenue minus message cost, and per-message yield divides that by the messaged count.

Change any of the five and the yields change. What does not change is their ordering across cuts, because that follows from the measured repeat share of each audience: an audience that is 100 percent repeat buyers responds on the repeat rates, an audience that is 2.4 percent repeat buyers responds almost entirely on the one-time rates. The pages that quote a yield quote it as "on the stated model", and the only thing they claim from it is the order.

Build-along · the bench

Seven cuts, computed in front of you

★ 26 min · the main event

Work down the seven in order. For each, read the verdict line, then the six readouts, then the segment table underneath. Say out loud what changed and what did not before moving to the next. The last one is the anti-lever: it is the simplification everyone reaches for, and the bench shows what it costs.

Read it in this order. Top group, then bought once, then the win-back audience and its repeat share, then the two yields with their tags. The first cut is the eight-group taxonomy at the mean, exactly what session 1 built, and it is worth sitting with how small its top corner is before looking at what the vendor rules do to the same people.

Part 2 · covers what the seven cuts find

Same people, seven answers

6 min live

The bench above computes these live; the numbers here are the ones it produces on the 4,000 rows, written down so they can be argued with after class. On the full 93,358 the shares move by fractions of a point and the ordering does not move at all.

WHO EACH CUT CALLS ITS BEST bar = share of 4,000 customers in the top group · hatching = the part of it that bought exactly once Mean split, eight 0.97% none of them bought once Median split, eight 1.40% none bought once Merchant thresholds 0.70% none bought once Fifths, then collapse 6.38% 84.7% bought once Klaviyo's six 13.30% 89.9% bought once Quintiles into Putler 15.90% 91.5% bought once One total score 7.98% 83.1% bought once the blue sliver in each hatched bar is the part that has ever bought twice Same 4,000 people. The cut, not the customers, decided whether the shop has 39 Champions or 636.
🔍 Click to zoom - three cuts produce a small top group entirely of repeat buyers; four produce a large one that is mostly first-time buyers with a badge
CutGroupsTop groupBought onceWin-back audienceRepeat buyers in itYield per message *Net total *
Mean split, eight80.97% · 2.4% of revenue0%33100%R$ 3.46R$ 103
Median split, eight81.40% · 2.6%0%50100%R$ 2.84R$ 128
Klaviyo's rule, six613.30% · 23.6%89.9%6303.7%R$ 0.15R$ 83
Quintiles into Putler's eleven7 of 1115.90% · 27.0%91.5%7672.4%R$ 0.02R$ 13
Merchant thresholds70.70% · 1.3%0%24100%R$ 2.44R$ 53
Fifths, then collapse to eight86.38% · 13.2%84.7%42212.6%R$ 0.53R$ 203
One total score37.98% · 18.5%83.1%2,5552.5%R$ 0.02R$ 53

* modelled, on the response model the widget prints. The other six columns are counted.

LiveFinding 1: the cut decides who is called best2 min▶

Two vendor defaults call 13 and 16 percent of a base where 97 percent bought once Champions, and nine in ten of those Champions bought exactly once. The three splits that put the knife somewhere the base can actually clear produce a top group of about 1 percent, none of whom bought once. Same people. A Champions tier funded on the first kind of cut spends most of its budget welcoming first-time buyers with a loyalty programme.

LiveFinding 2: fifths on a tied column are decided by row order2 min▶

In the 4,000, frequency is 3,883 ones. Ranking them into fifths gives 800 identical one-time buyers a frequency score of 1 and 683 identical one-time buyers a score of 5, in row order. Averaged with the spend score, enough of them reach the Champions corner to fill it. This is not a flaw in Putler's map or Klaviyo's rule; it is what any equal-count bin does to a column that is almost all one value, and the "fix" for the duplicate-edge error does it silently. Session 2 has the population version: 18,672 against 15,871.

THE SAME 4,000 PEOPLE, NARROWED FOUR WAYS TO A WIN-BACK MESSAGE widths on a square-root scale · tangerine = the people a win-back is for Mean split 4,000 33 in win-back 33 ever bought twice 30 messaged, 3 held out R$ 103 R$ 3.46 a message Fifths, then collapse 4,000 422 in win-back 53 ever bought twice 380 messaged, 42 held out R$ 203 R$ 0.53 a message Quintiles into Putler 4,000 767 in win-back 18 ever bought twice 690 messaged, 77 held out R$ 13 R$ 0.02 a message One total score 4,000 2,555 in win-back 63 ever bought twice 2,300 messaged, 255 held out R$ 53 R$ 0.02 a message The third row is the one the message is for. Read it against the fourth: 690 messages to reach 18 repeat buyers, or 30 to reach all 33.
🔍 Click to zoom - net totals are on the stated response model; the row that drives them, repeat buyers in the audience, is counted
LiveFinding 3: the win-back audiences differ by a factor of 77, and the two yield columns disagree2 min▶

Thirty-three people under the mean split, all repeat buyers. Four hundred and twenty-two under the tutorial route, one in eight a repeat buyer. Two thousand five hundred and fifty-five under one total score, one in forty a repeat buyer. On the stated model the per-message yield runs from R$ 3.46 down to R$ 0.02, and that ordering is robust because it tracks the measured repeat share. But the total column ranks the cuts differently: the median split's 50-person audience returns R$ 128 against the mean split's R$ 103, because it is larger and still all repeat buyers, and the tutorial route's 422-person audience returns the biggest total of all, R$ 203, at R$ 0.53 a message, because one in eight of them is a repeat buyer and there are many of them. Neither column is "the" answer. Per message tells you how well the cut found the right people; total tells you how many of them there were to find.

Self-studyThe honest dip: Putler's eleven produced seven2 min▶

Four of Putler's segments are empty on this base: New, Promising, Can't lose and Lost. The map reaches those corners through a combined frequency-and-monetary score of 1 or 4 to 5 at a given recency, and averaging two quintile scores on a base where the frequency score is arbitrary and the spend score is skewed never quite lands there. This is not a defect in the bench and it is not a defect in the map. It is a measurement: a taxonomy written for a repeat-purchase business has four rooms that a one-time-buyer marketplace never fills, and the shop that adopts it will carry four empty segments in its dashboard forever.

Part 3 · covers the anti-lever

One total score is a blindfold, not a simplification

4 min live

Adding the three scores into one number feels like a cleanup. Three columns become one, the dashboard gets a single ranking, and a threshold on it defines the audience. The bench counts what the addition throws away.

TWO DIFFERENT PEOPLE, ONE NUMBER code 5 · 1 · 1 bought yesterday, once, small a first-time buyer code 1 · 5 · 1 frequent, small baskets, gone a year the win-back case itself sum = 7 same band THE MIDDLE BAND, 8 TO 12 80 codes hidden inside one number 2,555 people 1 in 40 has ever bought twice R$ 0.02 per message, on the model 125 codes become 13 sums. Nineteen different codes share the sum 9. The message that fits one of them is noise to the others.
🔍 Click to zoom - the two people on the left need opposite messages, and the total score cannot tell them apart
LiveWhy addition is the wrong operation2 min▶

The three digits are not three measurements of one thing. Recency says whether the relationship is alive, frequency says whether it is a habit, monetary says what it is worth. Adding them treats a day of recency as interchangeable with an order of frequency, and the sum forgets which was which. A 5-1-1 and a 1-5-1 both score 7; the first wants an onboarding message and the second wants a win-back, and a campaign built on the band sends both the same thing.

The bench's count is the argument: 80 of the 125 codes fall into the middle band. Any audience defined on that band is a mixture whose composition nobody chose. The eight-group taxonomy of session 1 keeps three bits and eight names; it is already the simplification, and it is the smallest one that still tells the two people apart.

Self-studyWhen a single score is fine, and it is not this2 min▶

A single ranking earns its place when the action is the same for everyone and only the order matters: who to call first from a list where every call is the same call. RFM's whole purpose is that the action differs by corner, so a ranking that forgets the corner has removed the thing the model was for. If a dashboard needs one number, show the code and sort by recency within it; that keeps the corner visible and still gives a list.

The honest nuance: a weighted sum with recency weighted heavily is closer to defensible, because recency dominates response in most direct-marketing tests. Session 4 covers weighting. Even then, the weights are a business judgement to be tested, not a simplification to be assumed.

Real world

A dashboard with one RFM score per customer is a common request because it sorts. It also sorts a customer who bought yesterday for the first time above a four-order regular who has been gone six months, if the newcomer's basket was bigger, and a growth team reading the top of that list as "our best" will thank first-time buyers for their loyalty while the regulars leave unnoticed. The fix costs nothing: keep the three digits in the export and let the sort be on recency within the code.

Homework

Before session 4

30 min
  1. Run the bench's seven cuts on your own table with the session 2 helper, and fill the same eight-column table. Circle the cut your tooling uses.
  2. Change the response model in your head. Double the one-time-buyer lift. Does the per-message ordering change? It should not, and being able to say why in one sentence is the point.
  3. Count the empty rooms. Under the taxonomy your tool uses, how many segments hold fewer than 1 percent of customers? Each one is a dashboard tile that will never mean anything.
  4. Bring the events table, not the order table, if your product has one. Session 4 is about the platforms where the order table describes almost nobody.
Check yourself

Three questions

Clear all three and session 3 gets stamped in your passport.

1 · Under quintiles into Putler's eleven, 15.9 percent of the 4,000 are Champions and 91.5 percent of them bought exactly once. What produced that?

Equal-count bins on a column that is almost all one value are arbitrary by row order, and the duplicate-edge "fix" runs it silently. The map is a taxonomy for a repeat-purchase business applied to a base that does not have one; neither is wrong, the combination is.

2 · The median split returns the largest total (R$ 128) while the mean split returns the highest yield per message (R$ 3.46). Which cut is better?

The two-number habit exists because a single number hides the trade-off. D is the trap the bench is built to expose: a large audience with a positive total can still be R$ 0.02 a message, which is a campaign that barely covers its own cost.

3 · Why is one total score called a blindfold rather than a simplification?

RFM exists because the action differs by corner. A ranking that forgets the corner has removed the thing the model was for. Where one list is genuinely needed, sort by recency within the code so the corner stays visible.

Sources covered

What this session teaches, and where it came from

✓Every share, count and revenue figure on the benchComputed in the browser from a seeded 4,000-row sample of the Olist customer table built in session 1; verified against an independent pandas run before any page quoted it
✓Klaviyo's six-group rule and Putler's eleven-segment mapThresholds and code lists quoted from their published pages; tie handling for a 97 percent tied column is documented by neither, so the replication uses the pandas rank convention and says so
◐The two yield figuresModelled on five stated assumptions printed under the bench; only their ordering is claimed, because it follows from the measured repeat share
◐How often the vendor defaults mislabel on other basesNot claimed. Olist is a one-time-buyer marketplace; a subscription or grocery base would give different shares under every cut, and only the mechanism transfers

Every fact on this page, and its verification tier, is recorded in the course's source map.

Session 3 cheat sheet · pin this

Read the tag before the numbermeasured = counted from rows; modelled = depends on stated assumptions.
"Bought once" inside the top groupThe dial where cuts separate: 0 percent or 90 percent on the same people.
Fifths on a tied columnDecided by row order. 800 identical people scored 1, 683 scored 5.
Two yield columns, alwaysPer message says how well; total says how many. They can rank cuts differently.
One total score80 of 125 codes in one band. 5-1-1 and 1-5-1 both sum to 7.
Empty rooms are a measurementPutler's eleven produced seven here. A taxonomy built for repeat purchase has rooms a one-time base never fills.