RFM Segmentation: 12 Months of Orders → 20 Named Segments (Klaviyo + ChatGPT)
Contents
A coffee-supply client called me last quarter convinced they had 18,000 "active" customers. They had 18,000 subscribers who had ever bought. We pulled 12 months of Klaviyo orders, ran RFM (Recency, Frequency, Monetary) scoring, and the real picture dropped out: 1,240 Champions, 1,850 Loyal, and 14,900 customers whose last order was more than 365 days ago. Sixty percent of their broadcast list was Hibernating. They were sending the same "we miss you, 15% off" email to Champions and to people who had mentally moved on three buying cycles ago. Open rates had drifted from 38% to 14% in 18 months, and the team had blamed the subject lines. The subject lines were fine. The segmentation was the problem.
RFM is the oldest trick in direct-response marketing and it is still the cleanest. Three numbers per customer, one named bucket per customer, one email angle per bucket. The bottleneck has never been the math — it has been the naming. A spreadsheet of R, F, and M scores is unreadable to a copywriter at 6 p.m. on a Tuesday. Turning those scores into "this customer is a Champion" or "this customer is Hibernating" is what makes the framework usable, and it is exactly the part that ChatGPT is unusually good at.
Here is the full workflow I ran on the coffee client, condensed to a 90-minute exercise you can do this week.
Step 1 — Export 12 months of Klaviyo orders
In Klaviyo: Analytics → Metrics → Placed Order → Export to CSV. Pull the full 12-month window. The columns you need: Email, Order ID, Order Total, Order Date. If you sell on multiple platforms, repeat the export for each and concatenate — Klaviyo's CSV (comma-separated values) is the lingua franca, but Shopify, Recharge, and Amazon order exports all map cleanly with a column rename.
The reason for 12 months specifically: a 90-day window under-weights high-AOV (average order value) seasonal buyers (Black Friday, holiday gifting). A 24-month window dilutes Recency so much that 70% of your list collapses into the bottom R bucket. Twelve months is the sweet spot for most DTC (direct-to-consumer) brands — long enough to capture a full seasonal cycle, short enough that "last order 11 months ago" still means something.
Step 2 — Score every customer 1–3 on R, F, and M
Open the export in Google Sheets or your notebook of choice. For each unique email, compute:
- R = days since last order (smaller is better)
- F = number of orders in the window
- M = total spend in the window
Then assign a 1–3 score on each dimension. Do not use quintiles (5 buckets) — Klaviyo's RFM logic uses a 1–3 composite for a reason, and 1–3 is what makes the resulting 20 named segments possible. Use percentile cutoffs that are tuned to your business, not industry defaults:
- R=3: last order within the last 90 days
- R=2: last order 91–270 days ago
- R=1: last order 271+ days ago
- F=3: 4+ orders in the window
- F=2: 2–3 orders in the window
- F=1: 1 order in the window
- M=3: top 33% by total spend
- M=2: middle 33%
- M=1: bottom 33%
Concatenate into a single RFM cell (e.g. 3-2-3). You now have 27 possible cells, but only ~20 of them carry meaningful marketing weight — and that is the part you delegate to ChatGPT.
Step 3 — The prompt that names all 20 segments
Save this prompt. Paste in the RFM cell, the count of customers in that cell, and your average order value.
You are an ecommerce retention strategist. I'm giving you a 12-month RFM analysis from Klaviyo for a [category] brand with [X] active customers and an AOV of $[Y]. R=3 means last order within 90 days, R=2 means 91–270 days, R=1 means 271+ days. F=3 means 4+ orders, F=2 means 2–3, F=1 means 1. M=3 means top 33% by spend, M=2 means middle, M=1 means bottom.
Generate exactly 20 named RFM segments. For each, give: (1) a memorable human name, (2) the RFM cells it covers, (3) the percentage of the list it should typically represent, and (4) ONE campaign angle that would land for that segment — not a generic discount, a specific message. Skip any RFM cell that is empty or statistically meaningless in ecommerce.
You will get a table that looks like the one below. The exact segment names vary by model version, but the buckets and the angles hold.
The 20 RFM segments
| # | Segment name | RFM cells | Typical size | Campaign angle |
|---|---|---|---|---|
| 1 | Champions | 3-3-3, 3-3-2, 3-2-3 | 5–8% | Early access + a thank you note from the founder. Never discount. |
| 2 | Loyal High-rollers | 3-3-3 (M=3 only) | 2–4% | Behind-the-scenes content, referral invite, loyalty tier upgrade. |
| 3 | Loyal Regulars | 3-3-2, 3-2-2 | 5–7% | Subscription nudge or "you might also like" based on past orders. |
| 4 | Newest Buyers | 3-1-3, 3-1-2, 3-1-1 | 6–10% | Day 0–14 post-purchase education series. Do not pitch a second SKU yet. |
| 5 | Potential Loyalists | 3-2-2, 3-2-1 | 5–8% | Cross-sell the natural second product. Free shipping over threshold. |
| 6 | Promising | 3-1-2, 2-3-2 | 3–5% | Story-driven brand email + review request for what they bought. |
| 7 | About to Wake | 2-3-3, 2-3-2 | 2–3% | Limited-time new-arrival preview. |
| 8 | Need Attention | 2-2-2, 2-2-3 | 5–7% | "It's been a minute" personal-style email. No discount. |
| 9 | Slipping Regulars | 2-3-1, 2-2-1 | 4–6% | Light win-back: product recommendation, no urgency yet. |
| 10 | Cool High-Spenders | 2-1-3 | 2–3% | "We built this for you" — high-AOV product release. |
| 11 | Discount-Dependents | 3-1-1, 2-1-1 | 4–6% | First-purchase follow-up with a single-use offer. |
| 12 | At Risk | 1-3-3, 1-3-2, 1-2-3 | 3–5% | Urgency-driven "we miss you" with a real reason to return. |
| 13 | Cannot Lose | 1-3-3 (M=3) | 1–2% | Personal outreach from a real human. Email + SMS, no automation. |
| 14 | High-Spend Lapsed | 1-2-3, 1-1-3 | 1–2% | Concierge win-back. Free shipping + a hand-picked recommendation. |
| 15 | Recent Lapsed | 1-2-2, 1-2-1 | 3–5% | 21-day re-engagement flow, 4 emails, escalating offer. |
| 16 | Cold Prospects | 1-1-2 | 2–3% | Reactivation with a 30–40% offer. One shot, then suppress. |
| 17 | Hibernating Most | 1-1-1, 1-1-2 (long tail) | 30–45% | Single "are you still interested?" email. Default to suppression after. |
| 18 | One-and-Done Buyers | 1-1-1 (F=1 historically) | 15–25% | Survey ask: "What stopped you from coming back?" |
| 19 | Gift-Only Buyers | 1-1-2 (Q4 heavy) | 3–5% | Next year's gift guide in October. Do not re-engage out of season. |
| 20 | Testers / Wheel-Spinners | 1-1-1 (low M) | 2–4% | One 50%-off breakup email. If they don't bite, suppress forever. |
A few notes that matter more than the table does. First, segments 17 and 18 will always be the largest in absolute count — that is the headline. The 60% of the list that is Hibernating or one-and-done is not a failure of marketing, it is a feature of how customer bases work. The mistake is treating them as if they are still in play.
Second, the campaign angle is one sentence on purpose. A 20-segment table with a paragraph of guidance per row is unusable. One angle, one email, ship it. You can A/B test the angle in month two; the point of month one is to have different messages going to different people.
Third, regenerate the table quarterly. RFM is a snapshot, not a state — someone who was a Champion in March can be At Risk by July. The prompt above is idempotent (running it again on fresh data produces the same naming scheme), so what changes is the population inside each segment, not the segment names.
The four watch-outs
Do not import the segments into Klaviyo as static lists. Klaviyo can compute RFM via profile properties and update them daily, but if you freeze a segment from a one-off CSV export, you are sending the wrong email to the wrong person within three weeks. Use the RFM composite as a custom property, build dynamic segments off it, and let Klaviyo refresh it.
The "Loyal High-rollers" segment is where you make or lose money on retention. Sending them the same 15% coupon you send to Cold Prospects trains your best customers to wait for the discount. The angle for that segment is access, not price.
AOV distorts M. If your top 33% by spend is dominated by a few wholesale buyers, the entire M=3 column becomes that wholesale cohort, and your "Champions" segment looks like a B2B (business-to-business) account list. Strip wholesale and B2B orders before scoring M.
RFM does not capture channel preference. A Champion who only opens SMS and a Champion who only opens email need different delivery, not different copy. Layer channel preference on top of RFM — the segment is the what, the channel is the how.
The coffee client rebuilt their broadcast calendar around this 20-segment table in two weeks. Open rate on the Champions segment went from 31% (blended average) to 58% in the first month, because they were no longer competing with a Hibernating segment for inbox attention. Revenue per send on At Risk went from $0.11 to $0.84, because the message finally matched the state. Total email revenue grew 22% in the quarter — not from a cleverer subject line, but from admitting that the list was not what they thought it was.
The list almost never is.