Inventory pain usually arrives through customers. A dormant account suddenly orders a pallet, or a top account quietly shifts its basket toward low-margin lines. RFM analysis, scoring clients on recency, frequency, and monetary value, turns the order history already in your ERP into an early warning that operations, not just marketing, can act on.

Key takeaways

  • RFM analysis scores each client on how recently, how often, and how much they buy, using invoice history you already have.
  • Quintile scoring (1 to 5 per dimension) is enough. Skip weighted models until the simple version produces repeated false alarms.
  • Six segments cover most B2B wholesale books: Champion, Loyal, New, Potential, At-Risk, Lost.
  • Every segment has an inventory implication. An at-risk account puts the stock you hold for it at risk too.
  • Attach top accounts to every SKU flag so purchasing and sales look at the same evidence.

The three dimensions, computed from invoices

RFM needs nothing more than dated invoices with a client identifier and a net total. Each client is scored per period, typically per year, on three facts.

  • Recency. Days since the client's last invoice. Fewer days is better.
  • Frequency. Number of distinct invoices in the window. A client who orders weekly is structurally different from one who orders quarterly, even at the same annual spend.
  • Monetary. Sum of net invoice value in the window. Use margin instead of revenue if your cost data is reliable; it changes who your champions are.

Each dimension is ranked into quintiles across the client base and scored 1 to 5, then the three scores are summed to a total between 3 and 15. That is the whole model. Its strength is that anyone in the ops meeting can recompute a score by hand and agree with it.

Six segments and what they mean for stock

Customer segmentation in B2B wholesale is only useful if a segment changes what purchasing does. The table below maps each segment to the signal that defines it and the inventory decision it should trigger.

SegmentSignalInventory implication
ChampionHigh on all three: recent, frequent, high valueProtect their core SKUs with tighter stockout windows and a policy buffer
LoyalFrequent and recent, mid valueStable demand base; use their cadence to sanity-check velocity trends
NewRecent, low frequency so farDo not size reorders on their first orders; confirm the pattern first
PotentialGrowing frequency or value, not yet top quintileWatch for basket expansion into lines you hold thin
At-RiskHistorically high value, recency slippingStock held for them is now speculative; freeze reorders on their exclusive lines
LostNo orders for a long period, once activeAny SKU that only they bought is a dead-stock candidate

Why operations should care, not just sales

A "high monetary, low recency" account is the classic at-risk client, and the sales team will hear about it eventually. Operations should hear about it first, because the stock in the warehouse was bought on the assumption that this account keeps ordering. If it churns, three months of cover on its favourite lines becomes six.

The reverse case is just as costly. A "rising frequency" account that starts pulling promotional SKUs can drive a stockout on a line shared with twenty other customers. The velocity trend will catch it in a few weeks; the client segment change can catch it sooner, because the shift shows up in one account's cadence before it moves the SKU total.

Link client segments to SKU risk

The most useful join in wholesale analytics is client segment to product flag. When a SKU appears on the stockout watchlist, attach the top accounts by recent pull. Sales sees who is exposed; purchasing avoids over-ordering "for everyone" when the demand is really one champion's project.

When a SKU rises on the stock risk score, attach the accounts that used to buy it. If they are all at-risk or lost, the line is not slow, it is orphaned, and it belongs on the stop-buy list today. This join is also what makes an evidence-backed inventory meeting work: everyone argues from the same account list, not from memory.

Keep it operational

  • Start with quintiles per dimension and the six segments above. Add weights only after a quarter of observed false alarms.
  • Score per client-year so a long-standing account is not penalised for a slow January against its own December.
  • Use CRM data where you have it. HubSpot deals and contacts add context the ERP lacks, such as an open renewal or a new buyer at the account.
  • Review segment moves monthly. A champion sliding to at-risk is a meeting item; a new account becoming loyal is a reorder policy change.

How Flowra handles this

Flowra computes RFM scores from your invoice history on every nightly refresh: recency, frequency, and monetary value are each quintile-ranked 1 to 5 per client-year and summed, and each client is placed in one of six segments, Champion, Loyal, New, Potential, At-Risk, or Lost. Alongside the descriptive segments, models trained on your own history flag churn risk and spend collapse at the account level, and margin squeeze where a client's basket mix is eroding profitability. Client data can come from the ERP or from HubSpot and accounting connectors. A sales lead can ask in Slack "which accounts are at risk this quarter?" and get the list with the evidence and a confidence badge, drawn only from the computed data. When an at-risk account is tied to a SKU flag, the recommendation names the account, so purchasing and sales decide together. See how the same signal is phrased for each role.

Flowra · recommendation draftConfidence: High
Freeze reorders on three SKUs bought almost exclusively by client 1174, now At-Risk
Fact
Client 1174 moved from Champion to At-Risk: last invoice 74 days ago against a 12-day historical cadence, spend down 61% over the last quarter. SKUs 6010, 6011, and 6014 drew 88% of their volume from this account.
Forecast
Churn risk 0.79. Without the account, reconstructed cover on the three SKUs rises from 28 days to over 200.
Recommendation
Cancel the open PO on SKU 6011 and set the three lines to stop-buy pending a sales call. Alternative: keep one reorder cycle if sales confirms a live quote.
Hypotheses
No other account has started buying these lines. The account's silence is not a seasonal pattern seen in prior years.
Next step
Approve, adjust the quantity, or ask why. Nothing changes in the ERP until you do.
Data refreshed 8 h ago · 36 months of history · Source: Odoo (read-only) + HubSpot

Frequently asked questions

What is RFM analysis in B2B?

RFM analysis scores each business customer on recency of last order, frequency of orders, and monetary value over a period, usually from invoice history. Each dimension is ranked into quintiles and scored 1 to 5, and the total places the client in a segment such as Champion, At-Risk, or Lost.

How does RFM analysis help inventory management?

Stock is bought on assumptions about who will keep ordering. When a high-value account's recency slips, the stock held for it becomes speculative, and when a new account's frequency rises, shared SKUs can stock out. Linking client segments to SKU flags lets purchasing act before the SKU totals move.

How much order history do I need for RFM analysis?

Twelve months of dated invoices with a client identifier and net total gives stable quintiles for most wholesale books. Shorter windows work for high-frequency businesses. Scoring per client-year avoids penalising an account for its own seasonal quiet period.

Related reading

See it on your own data. Upload a CSV or connect Odoo, WooCommerce or SQL — first stock-risk report in minutes, no credit card.

Get my free inventory report →