In short: Allocating warehouse, transport and order handling cost as a percentage of revenue makes cost to serve proportional to revenue by construction, so the ranking it produces is the gross margin ranking it started with. Five drivers explain most of the real spread, being order size and frequency, drop density, delivery window width, returns and refusals, and payment terms priced at the business's marginal funding rate. Kaplan and Narayanan reported in the Journal of Cost Management in 2001 that the least profitable decile of customers consumed between fifty and two hundred percent of total profits. Exiting the loss makers is usually the wrong first move, because the fixed cost they were covering stays behind when they go.
Take two accounts on the same customer list with near identical annual revenue. The first takes a full trailer to one distribution centre on the same day every fortnight, orders forty lines at a time, and pays in thirty days. The second takes forty-one drops a month across a city, averages six lines an order, holds you to a two hour delivery window, refuses or returns four percent of what it takes, and pays in seventy-five days.
In the customer profitability report those two show the same gross margin percentage and sit two rows apart. Everything below gross margin is allocated as a percentage of revenue, so the allocation method is doing all the work in that report, and it settles the answer before any data gets examined.
Percentage of revenue allocation assumes the answer
Spread warehouse, transport and order handling costs across customers in proportion to what each one buys and cost to serve becomes proportional to revenue by construction. Every customer ends up with the same cost to serve ratio, the variance across the base is zero, and the profitability ranking that falls out is identical to the ranking by gross margin rate. The exercise produces no information that was not already sitting in the margin column.
So the reason nobody has found the loss making customers is that the model in use is incapable of finding them. Worth saying plainly to whoever owns the reporting, because the usual first response to a cost to serve request is that customer profitability is already reported monthly.
Building a model that survives finance review
Two things make a model usable for a decision. It reconciles to the general ledger, and every allocation runs off a driver somebody actually measured. Both are review questions and a model failing either one will be argued with rather than acted on.
Start from the cost pools that exist in the ledger. Inbound freight, warehouse labour, warehouse space and equipment, outbound transport, order administration, credit and collections, returns processing, and whatever field service or merchandising the business runs. Take them at their actual annual values from the accounts. What you allocate has to equal what is in those pools, and being able to demonstrate that on one line is what earns the model credibility in a room containing a controller.
Pick a driver for each pool that is recorded rather than estimated. Picks or order lines for picking labour. Pallet positions occupied and the duration for storage. Drops, stops and distance for delivery. Invoices, credit notes and query records for administration. Returns lines for returns handling. Where the only available driver is an estimate, mark that pool as estimated and leave the marking visible, because a reviewer will find it anyway and it lands better found by you.
Allocate at the transaction, then roll up. The unit of analysis is the order and the delivery. Customer level averages hide the specific effect you are hunting, which is that a customer's cost is driven by how their volume is broken up rather than by how much of it there is. A customer taking the same annual volume across a hundred and twenty orders instead of twenty-four is a completely different cost object, and only a transaction level model shows it.
Rate activities at practical capacity and report unused capacity separately. Kaplan and Anderson (2004), writing in Harvard Business Review, set out time driven activity based costing partly to fix this problem. Estimate the time each activity consumes and the cost per time unit at the capacity the resource can genuinely deliver, then charge each customer for the time they consume. Idle capacity falls out as its own line instead of being smeared across whoever happened to order that month. Forcing every cost in the pool onto customers makes a quiet quarter look like a customer problem and leaves the model indefensible as soon as volumes move.
The time driven version also survives longer. Activity based costing models built from interview based percentage splits are expensive to construct and go stale inside a year, which is the usual reason a cost to serve exercise happens once and is never repeated.
The drivers that explain most of the spread
Across most distribution businesses, five things account for the bulk of the variance.
Order size and frequency. The cost of processing an order line is close to fixed, so a six line order costs nearly as much to handle as a forty line one. This is the largest driver in most models and it gets worse as a relationship matures, because the customer learns to order more often in smaller quantities to reduce their own inventory. Their working capital improvement arrives on your cost line.
Drop density. Cost per drop falls with the number of stops on a route. A customer inside a dense urban cluster is subsidised by geography, and an identical customer ninety minutes off the route pattern costs several times more for the same pallet. Neither of them did anything to earn the difference.
Delivery window width. A two hour window can force a dedicated vehicle or a second trip, and it removes the route planner's ability to consolidate. Windows get granted in commercial negotiations without anyone pricing them, and they are frequently the most expensive concession in the whole agreement.
Returns, refusals and redeliveries. A refused delivery costs the outbound trip, the return trip, the putaway, and usually a credit note plus a query that delays payment on the entire invoice. Returns rates vary enormously across customers and the cost almost never gets attributed to the customer generating it.
Payment terms as a capital cost. Days outstanding priced at the business's marginal funding rate and charged to the customer taking them. That is arithmetic and it belongs in the model. Listing fees, rebates and promotional funding sit above this line and carry allocation questions of their own, which is a separate exercise with its own method.
The distribution that comes out, and why the tail surprises people
Plot cumulative profit against customers ranked from most to least profitable and the curve rises, peaks, and then declines. Kaplan and Narayanan (2001), in the Journal of Cost Management, described this shape and reported that across the companies they studied the most profitable twenty percent of customers generated somewhere between one hundred and fifty and three hundred percent of total profits, the middle group broke roughly even, and the least profitable decile consumed between fifty and two hundred percent of total profits. That is a published range from their work rather than a benchmark to hold yourself against, and its value is telling you what shape to expect before you look at your own.
Two features of the tail routinely catch people out on a first run.
The loss makers are usually not the small accounts. Small accounts cost little in absolute terms and rarely have the bargaining weight to demand expensive service. The customers destroying the most value tend to be large, well known names on thin negotiated margins with high order frequency, tight windows and long payment terms, because size is what bought those terms in the first place.
And the loss concentrates rather than spreading. It sits in a small number of accounts, and often in a small number of behaviours inside otherwise healthy accounts, such as one depot in a group ordering daily while the rest order weekly. That distinction matters for what you do next, because a behaviour is fixable in a way an account is not.
What to do with it, which is rarely to fire anyone
The instinctive response to the bottom of the curve is to exit those customers, and as a first move it is almost always wrong. In the short run a customer covering their attributable variable cost is contributing to fixed cost, and removing them leaves the same fixed cost spread across fewer accounts, which pushes more of the remaining base into the red. Run that loop twice and you have reasoned your way into a much smaller business. The mechanism has a name, the death spiral, and it remains the most common way a technically sound cost to serve model does damage.
The useful order of intervention starts at the order and works upward.
Change the order shape first. A minimum order value, fixed delivery days by route, ordering in layers or full pallets rather than in eaches, a lead time long enough to allow consolidation. These change your cost without touching the relationship, and a buyer measured on their own inventory will often take a scheduled order day in exchange for a modest price consideration.
Then make the service visible in the terms. A small drop charge below a threshold set from the model, a premium for a narrow window, a fee for expedited delivery. Pricing a service gives the customer a choice they did not previously have, and a meaningful share of them will take the cheaper option once the cost appears on an invoice.
Then look at the route to market. The smallest and most fragmented accounts often belong with a wholesaler or a third party distributor whose cost base was built for small drops. Moving them there keeps the volume and removes the cost from your building.
Price and exit come last. Exit should mean declining to renew on the current terms rather than stopping supply, because the capacity you free only becomes a saving if it can be removed or resold, and that is a separate question from whether the account looks unprofitable in a model. Where the answer turns out to be a price change, that decision has its own machinery and its own owner.
The limit
Allocation choices drive the result, and anyone claiming otherwise has run the model once.
Transport allocated by weight and transport allocated by cubic volume give different answers, and the gap is widest for exactly the customers you care about, the ones taking bulky low value goods. Warehouse space charged by pallet months and warehouse cost charged by throughput rank slow moving and fast moving customers in opposite orders. Order handling charged per order and charged per line reorders every small frequent buyer in the base.
The discipline that fixes this is to run the model under two defensible allocation bases and compare the rankings side by side. Customers holding their position across both are ready to act on. Customers whose sign flips between the two are unresolved, and the honest treatment is to label them that way and go and measure the driver that separates the two bases before anyone opens a negotiation.
There is a second limit underneath the first. A fully absorbed model, where every cost in the business is pushed down onto a customer, answers a question nobody asked. The decisions here are marginal ones about what changes if a customer's behaviour changes, and that calls for contribution after attributable cost, with the genuinely unattributable pool shown as a single number at the bottom rather than distributed. Both views have a use. Mixing them inside one report is how a good model ends up justifying a decision it does not support.
Take last month's delivery file and order file, count drops and order lines by customer, and divide your actual outbound transport and warehouse labour cost by those two counts. That is a day of work using data you already hold, and the ranking it produces will differ enough from the revenue ranking to make the case for building the real thing.