525,000 shipments. One question: which of them made money?
In short. A Saudi logistics operator had rich operational data, 525,000 shipment rows, and no way to connect it to cost. We built a TDABC model that attributed the full cost of the network to every route and client. The operator's first whale curve showed profit concentrated in a minority of clients, with a long tail served below cost.
Published with the client's consent, identity withheld · TDABC
THE ENGAGEMENT
Scoping
The board's question framed as cost objects: routes, clients, contracts.
Data intake
Full shipment dataset and cost base from the systems already in place.
Model build
Cost pools, capacity cost rates, time equations. Weeks, not quarters. CONFIRM: duration
Handover
The model lives in CostCtrl; the finance team refreshes it. CONFIRM: cadence
Every shipment left a data trail. None of it connected to cost.
The operator moves freight across the Kingdom for a broad client base: contract clients, ad-hoc shippers, long-haul lanes and dense local distribution. Pricing was built on tariffs and negotiation history, not on what a lane or a client actually consumed.
The finance team could say what the fleet cost in total. It could not say what client A on route B cost per shipment. That is the standard condition of the industry, not a failure of this team.
The question the board wanted answered was simple to ask and impossible to answer from the ledger: which routes and which clients are carrying the business, and which are being carried?
What can you do with 525,000 rows?
Quite a lot, if you resist the urge to sample. We took the full shipment dataset, 525,000 rows covering CONFIRM: period covered by the dataset, and used it as the transactional backbone of a TDABC model. No new IT: the ERP and the operations systems already held everything the model needed.
A structured operating model
Line-haul, first and last mile, cross-dock handling, customer service, administration and fleet ownership, mapped into cost pools with a clear capacity measure for each: driver hours, vehicle hours, dock hours.
Capacity cost rates
For each pool, the cost of capacity supplied divided by practical capacity. Not theoretical capacity: practical capacity, the hours the resource is realistically available to do work.
Time equations
The cost of a shipment is not one number, it is a formula. Distance, weight class, stops, handling type, waiting time and paperwork each add minutes. Time equations let 525,000 different shipments each get their own cost without 525,000 different studies.
Attribution, then aggregation
Cost per shipment rolls up to cost per route, per lane, per client, per contract. The model answers at whatever level the decision sits.
FROM ROWS TO RATES
Three findings shaped the conversation.
The whale curve existed here too. Ranking clients from best to worst and plotting cumulative profit produced the familiar shape: a minority of clients generating well over 100% of profit, a long tail giving it back. The peak of the curve reached CONFIRM: cumulative profit peak as % of total before the tail pulled it down.
Route economics diverged sharply. Dense, well-utilised lanes subsidised thin ones. Some routes priced as premium were, at true cost, marginal; some unglamorous lanes were quietly excellent. CONFIRM: number of routes modelled and share found below full cost
Waiting time was a cost object nobody owned. Time equations exposed hours consumed at client sites and gates that no tariff recovered. Once it had a number attached, it became negotiable. CONFIRM: estimated annual cost of unrecovered waiting time
The model did not tell the operator to fire clients. It told the operator, for the first time, what each client conversation was worth.
THE OPERATOR'S FIRST WHALE CURVE
Decisions, in the client's hands, followed the numbers.
Re-priced with evidence
Contract renewals moved from negotiation folklore to cost-based floors, lane by lane.
Restructured the thin lanes
Consolidation, revised frequencies and, where volume could not cover capacity, honest conversations about minimum commitments.
Put waiting time in the contract
Detention terms grounded in measured hours rather than round numbers.
Kept the model alive
The dataset refreshes, the rates recalculate, and cost-to-serve is now a recurring management view rather than a one-off study. CONFIRM: refresh cadence
Pricing from a position of knowledge.
The first commercial cycle run on the model produced CONFIRM: client-approved outcome figure. More durable than any single number: the question "what does this client really cost us?" now has an answer that updates itself.
A business that could see its shipments can now see its profit.
Fair questions.
- How long does a model like this take with a large dataset?
- Data volume is not the bottleneck; data meaning is. Once the fields were understood, the 525,000 rows ran through the time equations in minutes. The build, end to end, took weeks rather than quarters. CONFIRM: actual engagement duration
- Did this require new software in operations?
- No. The model was built on extracts the operator already produced. It now lives in CostCtrl, where the finance team refreshes it.
- Does TDABC work for ad-hoc, non-contract freight?
- Yes. Time equations do not care whether a shipment is contracted or spot; they cost the activity actually performed. Spot work is often where the pricing surprises are largest.
- Is a whale curve normal in logistics?
- In our experience, yes. Networks share capacity across clients, so cross-subsidy is structural until someone measures it. The curve is not a verdict on the sales team; it is a property of unmeasured cost-to-serve.
What is hiding in your shipment data?
You already have the rows. A 30-minute scoping call tells you whether they can become a cost-to-serve model.