Lessons · Lesson 2 of 3
The router optimises the parcel and pays for it in margin
Price one ship-from-store decision properly: the parcel, the sale it displaces, the cancellation it avoids, and why a router that picks the nearest shop gets it wrong two times in three.
Lesson 2 of 3 · 36 min
The week the DC ran dry
A website sells something the warehouse has run out of. Many retailers now hand the order to a shop that still has one. It looks like a free rescue: an order that would have been refused becomes a sale. This lesson prices that rescue properly. It turns on a question the software never asks. What would that shop have done with the garment?
Week 7, the week starting 18 May 2026. Corvedale's website took 412 orders for CRV-4120 mid indigo that week. Hartswood could fill 268 of them. The other 144 were all size 12 or size 14, and Hartswood had none left in either.
Before omnichannel, those 144 orders were cancelled and that was the end of it. Corvedale's order-management system does something better. When the DC cannot fill a line, it looks for a shop that can, and sends the order there to be picked, packed and posted by a colleague. This is ship-from-store, and it is the single most valuable thing a retailer gets from putting shop stock on the website. A chain with 62 shops has 62 more places to send parcels from, and the stock is already paid for.
The router filled all 144. Monday's dashboard reported 144 orders saved and GBP 8,496.00 of revenue rescued — 144 pairs at GBP 59.00, which is arithmetically true.
The margin effect of that same week was GBP 883.20. It should have been GBP 1,238.40.
Price the decision, not the parcel
The unit of decision is one order line the DC cannot fill, with at least one shop holding the size. There are exactly two things Corvedale can do with it.
Ship from the store. A colleague leaves the shop floor, finds the pair, packs it by hand, and puts it in the carrier's evening collection.
| Pick and pack | Carriage | Total | |
|---|---|---|---|
| Hartswood DC, in a picking area, on a bulk carrier rate | GBP 1.85 | GBP 3.20 | GBP 5.05 |
| A shop, off the floor, hand-packed, single parcel | GBP 4.60 | GBP 5.90 | GBP 10.50 |
A shop parcel costs GBP 5.45 more than a DC parcel. That gap is real. It is also the least interesting number here, because it is not what the decision turns on.
Cancel the order. Corvedale prices a cancellation at GBP 6.80: GBP 2.30 of contact-centre handling and refund processing, plus GBP 4.50, which is its own valuation of the measured drop in repeat buying among customers whose order it cancelled. That second figure is Corvedale's own, from Corvedale's data, and you can argue with it. The sensitivity test at the end of this lesson shows exactly how much rests on it, which is the honest way to use a number like that.
Now the part that decides everything. Where does the unit come from, and what would that shop have done with it?
There are two answers, and they are not close.
| Ship from the shop | Cancel the order | Ship minus cancel | |
|---|---|---|---|
| A shop that would have sold the pair at full price | 59.00 taken, 10.50 to fulfil, and the shop sale is lost: 48.50 | 6.80 to cancel, the shop sells the pair at 59.00: 52.20 | −3.70 |
| A shop that would have cleared the pair at 50% off | 59.00 taken, 10.50 to fulfil: 48.50 | 6.80 to cancel, the pair clears at 29.50: 22.70 | +25.80 |
Every figure in that table is in pounds, and each branch uses exactly one pair. So the GBP 22.42 the pair cost appears on both sides and cancels out. Comparing only what differs is not a shortcut. It is the whole method. Put the cost of goods in and you end up comparing two numbers that both contain it, and concluding something about neither.
Read the two rows in words.
Shipping from a shop that was going to sell the pair anyway does not create a sale. It moves one, from the shop to the website, and charges GBP 10.50 for the move. Against that it saves the GBP 6.80 cancellation. The net is a loss of GBP 3.70, every time, on every such pair.
Shipping from a shop that was going to end the phase with the pair unsold turns a GBP 29.50 clearance into a GBP 59.00 full-price sale. After the cost of fulfilling it and the cancellation avoided, that is GBP 25.80 — nearly seven times the size of the loss on the other row, and the reason ship-from-store exists.
The router does not know which shop it is taking from
Corvedale's router ranks candidate shops by distance to the delivery address, then by whether the shop has room in tonight's collection. That is a sensible rule and somebody sensible wrote it. The nearest shop means the cheapest carriage, the fastest delivery promise and the lowest chance of a missed collection. All of that is true.
It also has nothing to do with the only thing that matters — and it is worse than that, because online orders cluster where people live, and Corvedale's biggest and fastest-selling shops are in exactly those areas. Ranking by distance is, in practice, ranking by rate of sale, the wrong way up.
Corvedale grades its shops: 10 grade-A shops in the largest catchment areas, 22 grade-B, 30 grade-C.
| Shop grade | Shops | Pairs pulled | Average cover in sizes 12 and 14 at week 7 | Weeks left in the phase |
|---|---|---|---|---|
| A | 10 | 88 | 1.8 weeks | 3 |
| B | 22 | 41 | 3.1 weeks | 3 |
| C | 30 | 15 | 5.4 weeks | 3 |
Cover is the forward-looking figure from track 17: units held divided by forecast weekly sales. It says how many weeks the stock will last. A shop with 1.8 weeks of cover and 3 weeks of phase left will sell everything it holds in that size before the phase ends. A shop with 5.4 weeks of cover will not.
So the test is one comparison — is this shop's cover for this size less than the weeks remaining? — and it sorts the 144 pairs cleanly:
- 96 pairs came out of shops with cover under 3 weeks: all 88 from the grade-A shops, plus 8 from grade-B shops selling ahead of their band. Every one of those was going to sell at full price where it stood.
- 48 pairs came out of shops with cover at or above 3 weeks: 33 grade-B and all 15 grade-C. Those were heading for clearance.
Two pulls in three came from the wrong shop. Not because anyone chose badly, but because the router was asked to keep carriage cheap, and it did.
The week, in money
| Node type | Pairs | Value per pair | Total |
|---|---|---|---|
| Shops that would have sold the pair | 96 | −GBP 3.70 | −GBP 355.20 |
| Shops that would have cleared the pair | 48 | +GBP 25.80 | +GBP 1,238.40 |
| Net against cancelling everything | 144 | +GBP 883.20 | |
| Best available: ship only from shops with cover at or above 3 weeks | 48 | +GBP 25.80 | +GBP 1,238.40 |
| Left on the table | GBP 355.20 |
Three readings of the same week, all correct. The difference between them is what this lesson is for.
The dashboard says GBP 8,496.00 of revenue rescued. The programme is worth GBP 883.20 against not having it. A router ranking by cover instead of distance would have been worth GBP 1,238.40 — 40% more, from changing one sort order.
How much of this rests on the GBP 6.80
Enough to state plainly, which is why it is stated.
The GBP 4.50 repeat-buying part is a judgement Corvedale made about its own data. Move it and the answer moves with it.
| Cost of a cancellation | Per pair, wrong shop | Per pair, right shop | Week net |
|---|---|---|---|
| GBP 0.00, a cancellation costs nothing | −GBP 10.50 | +GBP 19.00 | −GBP 96.00 |
| GBP 6.80, Corvedale's own figure | −GBP 3.70 | +GBP 25.80 | +GBP 883.20 |
| GBP 10.50, a cancellation costs what a shop parcel costs | GBP 0.00 | +GBP 29.50 | +GBP 1,416.00 |
If a cancellation costs nothing, the whole week's programme is negative: 144 parcels, GBP 8,496.00 on the dashboard, and GBP 96.00 of margin destroyed. The week breaks even at a cancellation cost of GBP 0.67. So Corvedale does not need to defend GBP 6.80 to justify having ship-from-store at all. It needs GBP 6.80 to be above GBP 0.67, which is not a hard case to make.
What GBP 6.80 does not do, at any value below GBP 10.50, is make a pull from a fast shop worth taking. The programme is right and the routing is wrong. Those are two separate arguments, and they get lost in each other every time somebody defends the whole thing as one thing.
Check yourselfYour ship-from-store cancellation rate is near zero and the finance director wants the exposure buffer removed, on the grounds that it withholds sellable stock from the website for no reason. What do you say?Show the answer
That the near-zero cancellation rate is what the buffer is buying, so removing it removes the evidence for keeping it. Corvedale measured 7.4% pick failures with no buffer and 2.1% with one. On the department's 11,480 store-fulfilled units that is 609 extra cancellations, GBP 4,141.20 at GBP 6.80 each, plus 609 customers who ordered something the shop could not find. The right counter-offer is not the buffer, it is the count. A shop whose stock record is accurate needs no buffer. So pay for regular stock counting in the ten shops that fulfil most, lower the buffer there first, and measure the fail rate before and after.
Prompt · Price my ship-from-store decisions, one node at a time
When the fulfilment dashboard shows saved orders rising and nobody has checked which shops the units came out of.
Act as a retail merchandiser who is paid to protect margin and has no attachment to a fulfilment metric. I want my ship-from-store programme priced properly for one style over one period. My inputs: style [CODE], retail price [AMOUNT], landed cost [AMOUNT], first markdown [PERCENT], clearance price [AMOUNT], distribution-centre fulfilment cost [AMOUNT] a parcel, store fulfilment cost [AMOUNT] a parcel, and my own costing of a cancelled order [AMOUNT] with its parts shown as [WHAT IS IN IT]. The period is week [NUMBER] of [NUMBER], so [NUMBER] weeks remain. Orders the distribution centre could not fill: [NUMBER]. Routed to shops: [NUMBER]. For each pull, here is the shop, its grade, and its weeks of cover for that size at the time: [PASTE THE LIST]. Do the following. First, build the per-unit comparison of ship against cancel for the two cases — a shop that would have sold the unit, and a shop that would have cleared it — and show that the cost of goods appears on both sides and drops out. Second, split my pulls into those two groups using cover against weeks remaining, and give me the period total, the best available total if the router had ranked by cover, and the difference. Third, put beside those the number my dashboard reports as revenue rescued, and say in one sentence why they are all correct and all different. Fourth, run the sensitivity test on my cancellation cost: give me the value at which a pull from a fast-selling shop breaks even, and the value at which the whole period breaks even. Fifth, write the routing rule I should ask for, in one sentence an engineer could build. Do not tell me the programme is good or bad as a whole. Separate the programme from the routing.
AI can make mistakes — check anything you act on.