Where we start
Four sessions in, you have a table with a three-digit code on every customer and you know that the code depends on where the knife went. The temptation now is to export the win-back group to the email tool and press send. Every step of that is a decision with a price: which action fits the corner, through which channel, how often, to how many, and how you will know afterwards whether it did anything. The last question is the one most RFM projects never ask, and it is the one that decides whether the segmentation was worth building.
★ What you walk out with tonight. An action table that reads each corner's definition backwards into a first move, a channel and a cap; the habit of opening a vendor's docs to find its cut before funding anything aimed at its "Champions"; a seeded holdout on your own win-back audience; and a one-page campaign spec with the measurement written into it before the send, so that the result is a lift and not a story.
One action per corner, and a cap on each
5 min liveEach of the eight codes is a sentence about a customer: recent or not, once or often, big or small. Read the sentence backwards and it tells you the first move. A customer who is frequent and big but quiet does not need a discount, she needs a reason and a question. A customer who is recent, once and small needs the second order and nothing expensive. Give every corner exactly one action, one channel, and a frequency cap, and write the three down together.
LiveThe action is the segment's definition read backwards3 min▶
Start from what the code says is missing. 111 High value is missing nothing, so the action is to protect: early access, a human touch at the moments that matter, and never a discount they did not need, because a discount to someone who was going to buy anyway is margin given away. 101 Key develop is recent and big but only once, so the whole job is the second order: a category cross-sell, a reason to return before the memory of the first order fades. 011 Key win-back is frequent and big and gone quiet, so win back with a relevant new arrival rather than a blanket coupon, and ask why they left, because the answer is worth more than the order.
001 Key potential, one big order long ago, gets one cheap reactivation attempt and then release; the corner is 12.1 percent of Olist customers and 26.6 percent of revenue, which is exactly why a blanket effort is tempting and exactly why it must be capped. 110 General potential, recent and frequent with small baskets, wants the basket raised at the checkout with bundles and a free-shipping threshold, not a message. 100 General develop, the biggest corner on Olist at 37.9 percent, is onboarding to the second order at low unit cost. 010 General retain gets content and no spend. 000 Low value is deprioritised, and "deprioritised" means the cap is zero, written down, so nobody adds them to a blast later.
Then extend every row with two more columns: the channel and the frequency cap. The channel follows the action (a human touch is a call or a handwritten note, onboarding is a short series, basket-raising is on-site). The cap is the promise you make to the customer's attention, and it is the column that turns an action table into an operating rule, because without it every corner drifts toward the email tool.
Self-studyPutler's action column, quoted3 min▶
The eleven-group map that most tutorials copy comes with its own action column, and it is worth reading beside the eight-corner table above because it says the same things at a finer grain. Quoted from putler.com/rfm-analysis, in short form:
| Putler segment | Suggested action |
|---|---|
| Champions | Reward them; they can be early adopters of new products |
| Loyal customers | Upsell higher-value products; ask for reviews |
| Potential loyalist | Offer membership or a loyalty programme |
| New customers | Onboarding support, early success |
| Promising | Brand awareness, free trials |
| Needs attention | Limited-time offers based on past purchases |
| About to sleep | Share valuable resources, popular products |
| At risk | Personalised reconnect, offer renewals |
| Can't lose them | Win back via renewals or newer products; talk to them |
| Hibernating | Other relevant products and special discounts |
| Lost | Revive with a reach-out campaign, or ignore |
Notice what is missing from both tables: a channel and a cap. Vendor action columns tell you what to say and never how often, because the vendor is paid per message. Add the two columns yourself.
A Douyin brand room and its old customers. Live commerce on Douyin is now mostly brands broadcasting from their own rooms: the 2025 white paper from 索象集团 (Suoxiang Group) and 中国直播产业研究院 (China Live Streaming Industry Research Institute) puts 2024 Douyin GMV above 3 trillion yuan, live streaming above 58 percent of sales, and 店播 (brand self-broadcast) at 41 percent against 达播 (creator-hosted) at 38 percent; CBNData's 2025 read puts 店播 (brand rooms) at about 70 percent of live revenue. An operator running a brand room therefore owns a returning audience and can act on it: a returning viewer who bought twice and has gone quiet is a win-back corner, and the room's own schedule is the channel. What no primary source publishes is the repeat-purchase rate of any of these rooms, so any 复购率 (repeat-purchase rate) figure you meet in a deck is a vendor or press claim and should be labelled as one. The mechanism transfers; the rate must be measured in your own room.
Read the cut before the name
4 min liveIf the segment came out of a marketing platform, somebody else chose the knife, and the name on the group tells you nothing about who is in it until you have read their rule. The rules are usually published. Klaviyo's help centre states its recency thresholds and its use of thirds; Putler publishes its score ranges. Read them, then check one thing on your own data before spending a cent on the top group: how many of its members bought exactly once.
LiveRead the cut before the name3 min▶
Klaviyo's published rule (help centre article 17797937793179): recency scores 3 for a last order within 180 days, 2 within 365 days, otherwise 1; frequency and monetary are split into thirds; six named groups are assembled from listed sets of three-digit codes. Putler's rule (putler.com/rfm-analysis): quintile scores 1 to 5 on each of R, F and M, frequency and monetary averaged, and eleven segments defined by published score ranges.
Run both on Olist's 93,358 customers and the top groups are large. Klaviyo's map calls 13.9 percent of customers Champions, and 91.0 percent of those Champions bought exactly once. Putler's calls 16.1 percent Champions, of whom 92.1 percent bought once. Neither rule is broken. On a base where 97 percent of customers bought once, a frequency column split into thirds or fifths has to put most of the identical one-time buyers somewhere, and the pandas rank(method="first") convention that every tutorial uses to get past the duplicate-edge error assigns them by row order. One replication note applies to both: neither product documents its tie handling for a column that is 97 percent ties, so these are properties of that convention on this base, not claims about either product's live output.
The professional norm that follows: before funding anything aimed at a tool's top group, compute the share of that group who bought exactly once on your own data. If it is nine in ten, the group is not "your best customers", it is "recent single big baskets with a row-order score", and the right action is Key develop's second-order push rather than High value's protect. The name on the group did not tell you that. The cut did.
Self-studyWhat the six-group and eleven-group maps agree on: recency dominates2 min▶
Put the two vendor maps side by side and one structural agreement stands out: the recency score does most of the sorting. Klaviyo scores recency on calendar thresholds (180 and 365 days) and only then splits the other two columns into thirds, so a customer's recency band decides which third of the map she can land in at all. Putler averages F and M into a single second axis and reads the map as recency against that average, so recency is one of only two axes and the one not diluted by averaging. On Olist the effect is visible in the population shares: Klaviyo's "Recent" group is 21.6 percent, Putler's "Loyal" 31.6 percent and "Potential loyalist" 24.3 percent, all bands of recent buyers with modest F and M.
That is a defensible design choice for a message-sending tool, because recency is the one column that predicts whether a message will be opened. It is a poor design choice for deciding who is worth a discount, because a recent one-time buyer and a recent ten-time buyer land in the same band under both maps. The eight-corner taxonomy keeps frequency as its own digit for exactly this reason, and it is why the 101 and 111 corners get different actions even though most tools would put them in one group.
The lift is a difference, never a rate
6 min liveSome of the people you message would have bought again anyway. A report that counts every reorder in the messaged group as the campaign's revenue is counting those people twice: once as customers, once as a result. The only way to know how many is to hold some of the audience back, message the rest, and measure both groups over the same window. Hughes's test mailing in 1994 was this step. Holding out a random tenth is the modern version.
LiveThe lift is a difference, never a rate4 min▶
The procedure has four lines. One: take the audience the segment defines and mark a random tenth held out, with a seed, before anyone sees the list. Two: message the other nine tenths and never message the tenth, for the whole window. Three: after the window (say 90 days from the send), compute the reorder rate in each group. Four: the lift is the treated rate minus the held-out rate, and incremental orders are the lift times the treated count.
What the held-out rate exposes is the organic reorder: the share of this audience that buys again with no message at all. Every one of those, in the treated group, will show up in the platform's "attributed revenue" because the platform attributes any purchase after a send to the send. Revenue that would have happened anyway is the organic rate times the treated count, and it is not the campaign's. Vendor content occasionally concedes the point; one vendor-side blog puts the organic share of win-back revenue attributed under Klaviyo's methodology at 15 to 22 percent. That is a vendor or press claim, not checked at source here, and the honest reading is not the number but the admission: the attribution model itself says some of what it attributes was not caused.
The same sheet must carry contact cost and the frequency cap from Part 1. Net incremental is incremental revenue minus the cost of every message sent, including the ones to people who would have bought anyway, and the cap is what stops the cost line from being paid twice a week. A lift that does not clear the cost is a campaign that lost money while reporting a positive attributed number, and that is a common outcome, not a rare one.
Self-studyHow big a holdout: a tenth is a convention, the real answer is the smallest group that can still show a difference2 min▶
Ten percent is a habit inherited from the direct-mail test cell, and it is a reasonable habit on a large audience. It is the wrong habit on a small one. On the session 3 bench, the mean-split win-back corner is 33 people; a tenth of that is 3, and three people cannot show a difference in reorder rate against thirty. The right question is: what is the smallest held-out group that could still show the lift I am hoping for, at the reorder rates I expect? That is a sample-size calculation, and it depends on the organic rate, the lift you would act on, and how sure you need to be.
Two consequences for RFM practice. First, the holdout share should be decided per audience, and for a small corner it may need to be a third or a half, or the corner may need to be pooled with a neighbour before it can be tested at all. Second, an audience too small to test is an audience too small to campaign on with any confidence about the result; the honest move is to act on it anyway if the action is cheap, and to say plainly that the outcome will be an anecdote. The maths of the calculation belongs to Experimentation, which owns power, minimum detectable effect and the sequencing of tests.
"私域复购是公域的3-5倍 (private-domain repurchase is 3 to 5 times public-domain)." The claim that private-domain (WeChat community, mini-programme, owned-group) repurchase runs three to five times the public-domain rate is everywhere in Chinese growth writing, and its most recent home is a 2026 article on the 腾讯云开发者社区 (Tencent Cloud developer community). It is an industry claim, it names no dataset, and it is unverified. It is also a claim a single shop can settle for itself in one quarter: take the shop's lapsed repeat buyers, message half through the community and hold the other half out, and read the two reorder rates. Whatever the multiple turns out to be for that shop is worth more than any multiple in an article, and the operator will have it before the next quarter's budget is set.
Message everyone in win-back
3 min liveThe sentence sounds like a plan. It is a plan whose cost was set in session 2, when the knife decided how many people "win-back" contains. On the bench in session 3, the same 4,000 real customers give a win-back audience of 33, 50, 767 or 2,555 depending on the cut, and under the stated response model those audiences pay back very differently per message and in total. Read both columns, because they do not agree on the winner.
LiveYield per message and total pull in different directions3 min▶
From the bench in session 3, on the stated response model (lapsed one-time buyers reorder on their own 1.0 percent of the time and a message lifts that by 15 percent; lapsed repeat buyers reorder 4.0 percent of the time and a message lifts that by 50 percent; a message costs R$ 0.30; a tenth of every audience is held out):
| Cut | Win-back audience | Repeat buyers in it | Net yield per message | Net total |
|---|---|---|---|---|
| Mean split, eight (code 011) | 33 | 100% | R$ 3.46 | R$ 103 |
| Median split, eight (code 011) | 50 | 100% | R$ 2.84 | R$ 128 |
| Quintiles into Putler's eleven (At risk + Can't lose) | 767 | 2.4% | R$ 0.02 | R$ 13 |
| One total score (the middle band) | 2,555 | 2.5% | R$ 0.02 | R$ 53 |
Two columns, two orderings. Per message, the mean split wins because every one of its 33 people is a proven repeat buyer. In total, the median split wins because it has 50 such people rather than 33, and the extra 17 are worth more than the small drop in yield each. Neither column is "the" answer. The per-message column is what a finance partner reads (what does each contact return?), the total column is what a growth lead reads (what does this campaign return?), and a spec that shows only one of them is hiding a decision.
What transfers and what does not. The reais are on a model and will not be your numbers. The ordering is not on the model: it follows from the measured repeat-buyer share of each audience, 100 percent under the two-way splits against 2.4 and 2.5 percent under the quintile and sum cuts, and that share is a fact about who the knife put in the group. Any response model in which repeat buyers reorder more readily than one-time buyers will reproduce the ordering. That is why "message everyone in win-back" costs what it costs: under a quintile or sum cut, "everyone" is 767 or 2,555 people of whom nineteen in twenty have never bought twice.
The campaign spec with a holdout, on your rfm table
★ 22 min · everyone buildsSix steps in pandas on the rfm table from session 1, with its three-digit code column from the mean split. The campaign has not run, so nothing below prints a result; the measurement template carries placeholders and is left ready. Where a number is printed, it is from the Olist population and your table will differ.
The action table as a dictionary. Code to (action, channel, cap), joined onto the table so every customer carries her first move. Caps are yours to set; these are placeholders.
Pick the audience. One corner, by its code, from the table as of the snapshot. On Olist at the mean split this is 0.79 percent of 93,358 customers; yours will differ.
Mark the holdout, seeded, before anyone sees the list. A tenth by convention tonight; Part 3's self-study says when a tenth is too small. The seed is what lets a second analyst reproduce exactly who was held back.
Write the spec as a dictionary and print it. Audience definition with the snapshot date, the cut, the holdout share and seed, the metric with its window, and the cost per message. This is the sheet in the figure above; it goes in the ticket before the send.
The measurement template, with placeholders. After the window closes you fill two rates from two groups; everything else is arithmetic on them. It is written now so that the definition of "lift" is fixed before anyone has a result to prefer.
The bought-once check on your tool's top group. Apply the tool's published rule to your table (session 2 built both vendor maps), then ask what share of its top group has F of 1. If the answer is nine in ten, the action is Key develop's, not High value's.
Save the spec and the held-out ids together, dated. spec_011_2018-09-01.json and heldout_011_2018-09-01.csv. The result is only a measurement if the same file that says who was held back also says when and by what rule, and session 6 will ask for both when the model is re-run.
Before session 6
45 min- Write the spec for one segment on your own table. Seven fields, one page, before any list is exported. If you cannot fill the metric field with a window, you are not ready to send.
- Find your tool's cut in its documentation. The recency thresholds or quantiles, how frequency and monetary are split, and how ties are handled. If tie handling is not documented, write "not documented" in the spec; that is a finding.
- Compute the bought-once share of its top group on your data, as in step 6. Decide whether the action for that group is protect or get-the-second-order, and say which fact decided it.
- Decide the holdout share using the Experimentation course's guidance on the smallest group that can show the lift you would act on. If your audience is too small to test, write that down too, and pool or proceed knowingly.
Three questions
Clear all three and session 5 gets stamped in your passport.
1 · A platform reports R$ 40,000 of revenue attributed to a win-back campaign. Why is the lift a difference rather than that number, and what does attributed revenue hide?
A platform attributes any purchase after a send to the send. Without a held-out group there is no way to know how many of those purchases were organic, and vendor content itself concedes the organic share is not zero. The lift is the only number that pays for the message, and it is a difference between two groups measured over the same window.
2 · Your marketing platform shows 14 percent of customers as "Champions". Why check the bought-once share of that group before funding a campaign aimed at them?
The rules are published and should be read. Splitting a frequency column that is 97 percent ties into thirds or fifths has to put most identical one-time buyers somewhere, and the common rank convention assigns them by row order. The bought-once share on your own data tells you whether the group is a core to protect or recent single big baskets to develop.
3 · On the bench, the mean split gives the best net yield per message (R$ 3.46) but the median split gives the largest net total (R$ 128). Why can the two columns rank the cuts differently, and which of the figures transfers to your data?
Neither column is the answer alone. A spec that shows only one of them is hiding a decision. The per-message ordering is robust because it is driven by who the knife put in the audience (100 percent repeat buyers under the two-way splits against 2.4 and 2.5 percent under the quintile and sum cuts), and that share is measured, not modelled.
What this session teaches, and where it came from
Every fact on this page, and its verification tier, is recorded in the course's source map.
Session 5 cheat sheet · pin this
You have a spec with a holdout in it and a table dated 2018-09-01. Session 6 keeps the model alive: how often to re-run it, how to tell drift in the groups from drift in the knife, the one-page RFM spec that travels with every table, and the two moments when RFM should hand off, to CLV when you need a forecast per customer and to clustering when the three columns stop being enough.