Case study · Logistics · Saudi Arabia

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

525,000
shipment rows used in full as the transactional backbone of the model. No sampling.
100%
of the network's cost attributed to routes, clients and contracts through time equations
1st
whale curve the operator had ever seen of its own client base

THE ENGAGEMENT

Phase 1

Scoping

The board's question framed as cost objects: routes, clients, contracts.

Phase 2

Data intake

Full shipment dataset and cost base from the systems already in place.

Phase 3

Model build

Cost pools, capacity cost rates, time equations. Weeks, not quarters. CONFIRM: duration

Phase 4

Handover

The model lives in CostCtrl; the finance team refreshes it. CONFIRM: cadence

01The challenge

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?

02The approach

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.

01

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.

02

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.

03

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.

04

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

525,000 shipment rows Cost pools + practical capacity Time equations (distance, stops, handling, waiting) Cost per shipment Route / client / contract profitability Capacity cost rate = cost of capacity supplied / practical capacity
From rows to rates: the sequence that turned raw shipment data into route and client profitability.
03What the model showed

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

100% CONFIRM: peak % Served below cost Clients ranked best to worst Cumulative profit (% of total)
Illustrative of the pattern found: profit concentrated in a minority of clients, a long tail served below cost. Peak value pending client approval.
04What the client did with it

Decisions, in the client's hands, followed the numbers.

01

Re-priced with evidence

Contract renewals moved from negotiation folklore to cost-based floors, lane by lane.

02

Restructured the thin lanes

Consolidation, revised frequencies and, where volume could not cover capacity, honest conversations about minimum commitments.

03

Put waiting time in the contract

Detention terms grounded in measured hours rather than round numbers.

04

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

05The outcome

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.

06FAQ

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.
Start here

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.

M
Ask us anything
usually replies in minutes
Hi. I can answer the quick questions about cost, method and timing right here. For anything specific to your business, I'll hand you to Miguel on WhatsApp.
Free. No bot loops. Straight to a person.