Somebody in your business can name the top ten customers by revenue. Ask which ten make the most money and you get the same list back, because that is the only list anyone has.
It is usually wrong, and it is wrong in a way the accounts cannot show you. The cost of serving a customer sits in a pool called transport, or distribution, or overheads, and it is spread out again in a way that guarantees no customer stands out.
This is about how that spreading works, why it hides the losses, and how to find them with a week of work rather than a costing project.
Spreading cost by revenue gives everyone the same margin, by construction
Take three customers. All three buy the same product at the same price. All three run an 18% gross margin. Nothing about the goods separates them.
| Customer A | Customer B | Customer C | |
|---|---|---|---|
| Revenue, baht a year | 12,000,000 | 12,000,000 | 1,000,000 |
| Pallets a year | 360 | 360 | 30 |
| Orders a year | 24 | 240 | 60 |
| Average order | 15 pallets | 1.5 pallets | 0.5 pallets |
| Delivery | Full ten-wheel load, one province | City branches, shared six-wheel run | Dedicated four-wheel trip, 320 km each way |
| Days to pay | 30 | 90 | 60 |
Now cost them properly. Say a ten-wheel vehicle-day costs 12,000 baht, a six-wheel day 8,000 and a four-wheel day 5,000. A ten-wheel takes 15 pallets and a six-wheel 8, so five of B's 1.5-pallet drops share one six-wheel run. C is far enough out that the round trip plus loading does not fit inside one working day, so each delivery consumes about one and a half vehicle-days. Order handling, from taking the order to issuing the invoice, costs 250 baht whatever the size. Money costs 7% a year.
| Customer A | Customer B | Customer C | |
|---|---|---|---|
| Vehicle-days used | 24 | 48 | 90 |
| Transport, baht | 288,000 | 384,000 | 450,000 |
| Order handling, baht | 6,000 | 60,000 | 15,000 |
| Money tied up in receivables | 69,000 | 207,000 | 11,500 |
| Total cost to serve | 363,000 | 651,000 | 476,500 |
| Gross margin, baht | 2,160,000 | 2,160,000 | 180,000 |
| Profit after serving | 1,797,000 | 1,509,000 | β296,500 |
| As a share of revenue | 15.0% | 12.6% | β29.7% |
C loses just under 300,000 baht a year on a million baht of sales.
Here is what the accounts show instead. Total cost to serve across the three is 1,490,500 baht on 25,000,000 baht of revenue, which is 5.96%. Spread it across customers in proportion to revenue, the way almost every management pack does, and every one of them reports a net margin of 18% minus 5.96%, or 12.04%. All three. Identical.
C, which is destroying 296,500 baht, appears to be contributing about 120,000. The reported figure is wrong by 417,000 baht, and it is wrong in the flattering direction.
This is not an accounting mistake to be corrected with more care. It is arithmetic. Any allocation base that moves with revenue returns the company average to every customer. The number was never capable of telling you anything, because you put the answer in yourself when you chose the base. Allocating by weight or by case does the same thing in a different currency, which is worth remembering when choosing which unit to measure transport in.
What actually varies between two customers
Look at where A and C separated. Not the product, not the price, not the margin. Six things:
- Order size. The single biggest driver. A drop costs roughly the same whether it is fifteen pallets or half a pallet, because what it consumes is a stop, a gate, a signature and a slot in a finite day
- Order frequency. Sixty small orders and twelve larger ones can carry exactly the same goods. One of them costs five times more to deliver
- Where the customer is relative to everyone else. Not distance from you. Distance from the run you were going to make anyway. A customer sitting on an existing route is nearly free. A customer forty kilometres off it is a dedicated trip
- Vehicle forced. A site that cannot take a ten-wheel truck has chosen a smaller vehicle for you, and smaller vehicles cost more per unit carried before they leave the yard
- Time taken at the delivery point. Not billed, usually not recorded, and it comes straight out of the number of drops the vehicle can do that day. This is why waiting at a delivery point is rent on a finite day rather than a nuisance
- How long they take to pay. Covered below, because most people leave it out
Notice that none of these appear on a sales report, and five of the six are known to your transport planner already. The information exists. It has simply never been put next to the revenue.
The shape you are looking for
You are not hunting for one bad customer. You are looking for a curve.
The pattern found in most businesses is that about 20% of the range produces 80% of sales, the next 30% produces about 15%, and the last 50% of the range produces about 5%. That final half is where loss-makers live, and the standard advice on it is blunt: the tail of the curve is often uneconomic and should be looked at for rationalisation.
The important word is looked at. The tail is where to search, not a list of customers to drop. Some of them are new accounts that have not grown yet. Some are small but easy, sitting on a route you already run. The point of the curve is that it tells you where to spend a week, and it is not on the top ten.
Run the same arithmetic on lanes
Routes hide losses the same way, using kilometres instead of revenue.
A lane is not the outbound leg. It is the round trip, because the truck comes back whether or not it is paid to. So the real question on any lane is what share of the round trip is loaded.
Thailand has a measured example. A study of goods vehicles serving the Free Zone at Suvarnabhumi Airport found that 41.64% of the distance run carried no goods. The share depended heavily on vehicle size:
| Vehicle | Share of distance run empty | Share loaded |
|---|---|---|
| Four-wheel | 46.26% | 53.74% |
| Six-wheel | 38.45% | 61.55% |
| Ten-wheel | 23.27% | 76.73% |
Read the right column. On the same cost per kilometre run, a four-wheel operation has to recover that cost over 53.74 loaded kilometres in every hundred, and a ten-wheel operation over 76.73. That makes the four-wheel cost per loaded kilometre about 43% higher before anything else is counted.
That is the same finding as Customer C, arrived at from the other direction. The customer whose site forces a small vehicle is not only using a more expensive truck per pallet. They are buying a higher share of empty running with it.
Two traps follow.
A lane can be worth running at a loss. If the outbound leg to a region is the only way to position a vehicle for a well-paid return, then the outbound leg is not a separate business. Judge the pair. Splitting a round trip into two lanes and dropping the loser is one of the more expensive things a costing exercise can talk you into.
A lane can look good because it is eating someone else's return leg. The mirror of the same problem. If a lane only works because it uses capacity that was going to come back loaded anyway, it is not adding what it appears to add.
The workable rule is to cost the round trip, then ask what the vehicle would otherwise have done. If the honest answer is "come back empty", the lane is carrying cost that was going to be spent anyway.
Money is a cost to serve, and in Thailand it is not a small one
The line most often missing from this analysis is the customer who pays late.
Nationally, the shape of the problem is visible. In Thailand's logistics bill for 2024, transportation was 47.9% and inventory holding was 44.7%. Almost half of what the country spends moving goods is actually the cost of goods sitting still and the money tied up in them. A customer who holds your cash for ninety days is consuming the same resource as a customer who holds your truck for three hours.
Pricing it is one line of arithmetic. Average receivable is revenue multiplied by payment days divided by 365. Multiply that by your borrowing rate. The 7% used above is close to the national reference point: NESDC put the minimum loan rate at an average of 7.1% in 2024, up from 6.8% in 2023.
That is where the receivables row in the table came from. Customer B at 90 days ties up 2,958,904 baht on average, costing about 207,000 baht a year. Customer A at 30 days ties up 986,301, costing about 69,000. Same revenue, same margin, 138,000 baht of difference that nobody is looking at.
If you are the smaller party, there is a published standard to argue from. The Trade Competition Commission has issued a guideline on credit terms where an SME is the seller. It sets 45 days for trade, manufacturing and services, and 30 days for agricultural goods and lightly processed agricultural products. A longer term is not automatically improper, but it needs a business, marketing or economic reason that can be explained. Delaying payment beyond the agreed term without good cause is listed as conduct that may be unfair, as is changing the term without at least 60 days notice.
Three details in it are worth knowing precisely.
- The clock starts on delivery plus correct paperwork, not on the invoice date and not on the buyer's month-end run. Goods must match the agreed quantity, type and quality, and the documents must be correct and complete. A recurring delay caused by your own paperwork is a cost you created
- The 30 to 45 day standard did not come from nowhere. The notification records that it was proposed by NESDC and the Bank of Thailand
- The SME definition tightened in 2022. A manufacturer must have both employment of not more than 200 and revenue of not more than 500 million baht. A service, wholesale or retail business must have both not more than 100 employees and not more than 300 million baht. Before that amendment either test would do, so a business that qualified in 2021 may not qualify now
Payment terms cut both ways, and if you want the view from the other side of the invoice, they are also one of the main reasons a carrier quietly stops quoting for your work.
Fix it before you drop it
A cost to serve analysis that ends in a list of customers to fire has usually failed. Almost every loss-maker is losing money because of how it is served, not because of who it is, and the pattern is fixable without touching the price.
Work down this order.
- Change the order pattern. This is where nearly all the money is. C went from 60 deliveries a year to 12 monthly ones, carrying identical goods. Transport falls from 450,000 to 90,000, order handling from 15,000 to 3,000, and a customer losing 296,500 baht a year turns into one making 75,500. Cost per pallet delivered falls from 15,000 baht to 3,000. Nothing about the relationship changed except the calendar
- Set a minimum order size, or price below it. Lowering a minimum brings in revenue and brings in delivery cost with it. Test both halves before you move it in either direction
- Fix the delivery days. A customer who accepts Tuesday and Friday can be put on a route. A customer who orders whenever cannot, and pays for a dedicated trip without knowing it
- Check the service level is one they asked for. Improving service costs far more near the top of the scale than in the middle, and a two-point improvement close to 100% often costs a great deal while going completely unnoticed by the customer receiving it. Some cost to serve is service nobody wanted
- Then talk about terms and price. By this point you know what you are asking for and why, which is a different conversation from asking for more money
What dropping a customer actually removes
One warning before anyone acts on a ranking.
Most transport cost is a vehicle and a day, and both continue after a customer leaves. If you drop 8% of your revenue and the fleet still runs the same number of vehicle-days, you removed the revenue and kept the cost. The remaining customers then absorb the whole of it, and the next report shows a fresh set of loss-makers who were fine last quarter.
The test is simple. Ask what resource actually goes away. If dropping the customer removes a vehicle-day, a shift, a run or a site, the saving is real. If it removes a name from a list, it is not.
That is also the test for whether a fix has worked. C's fix removed 72 vehicle-days a year, cutting 90 down to 18. Those days now exist for something else, which is the only reason the saving is real.
Do this in a week, not a quarter
Full activity costing across every customer is a project, and projects like that get abandoned around the point where somebody asks for gate times by site. You do not need it. You need a ranking, and a ranking survives rough numbers.
- One quarter of data is enough. Long enough to cover ordinary variation, short enough that somebody will actually pull it
- Take the top 20 customers by revenue, plus 20 drawn from the tail. The top 20 is where the money is. The tail is where the losses are. The middle can wait
- Collect five fields per customer: number of deliveries, average size of a delivery, vehicle type used, whether the delivery shared a run or went alone, and average days to pay
- Use one rate per vehicle-day, one rate per drop and one rate per order. Averages are fine. You are ranking customers against each other, not filing accounts
- Do routes on the round trip, with the loaded share of distance next to each one
- Check the ranking against the people who do the work before you show it to anyone. A dispatcher will tell you in ten minutes which sites lose an afternoon, and that is a cost your data does not have
If the answer changes what anyone does, it was precise enough. If it does not, more decimal places will not help.
What to change on Monday
- Find out how transport cost is allocated to customers in your accounts. If the base is revenue, weight or cases, the customer margins in your pack carry no information at all
- Pull one quarter: 20 large customers, 20 from the tail. Deliveries, drop size, vehicle type, shared or dedicated, days to pay
- Cost each one in vehicle-days, not in kilometres. The day is what runs out
- Add the receivables line. Revenue times days divided by 365, times your borrowing rate
- Rank by profit after cost to serve, and look at the bottom, not the top
- For each loss-maker, ask the order-pattern question first. How few deliveries could carry the same goods
- For every lane, write the loaded share of the round trip next to it, and ask what the vehicle would have done otherwise
- Before dropping anyone, name the vehicle-day, shift or site that disappears. If you cannot name one, you are giving away revenue and keeping the cost
The aim is not a scorecard. It is that the next time somebody says a customer is important, everyone in the room knows which half of that sentence they mean.
