Bullwhip effect: a small steady rise becomes a violent swing upstream
A small, permanent rise in demand becomes a violent swing four levels upstream. Then you switch on one piece of information and most of it disappears.
- The permanent rise10 units a week
- Biggest supplier order289 units
- Weeks with no order at all4 weeks
What each level ordered
units ordered a week| Level | Ordered | On hand | Owed |
|---|---|---|---|
| Store | 120 | 191 | 0 |
| Distributor | 144 | 171 | 0 |
| Plant | 195 | 125 | 0 |
| Supplier | 289 | 40 | 0 |
Each level's forecast is set beside the simplest forecast there is, which is last week's number. The page prints both and calls neither one right.
| Measure | Its own forecast | Last week's number |
|---|---|---|
| Store | 0.8 units | 0.3 units |
| Distributor | 1.6 units | 1.0 units |
| Plant | 4.8 units | 3.1 units |
| Supplier | 15.2 units | 10.1 units |
A level whose own forecast is further from the demand it saw than last week's number was is not doing anything wrong. It is smoothing, which is what smoothing costs, and four levels of it is the swing above.
Who can see the demand
| Measure | As it is | If shared |
|---|---|---|
| Store | 23 | 23 |
| Distributor | 51 | 34 |
| Plant | 153 | 48 |
| Supplier | 289 | 70 |
Nothing about the goods, the lead time or the batch size has to change. If every level forecast from what the customer actually bought, the swing at the supplier would fall from 289 units to 70 units.
Why it happens
Nobody in this chain is behaving badly. Each level is looking at the orders it receives, noticing that its shelf is emptier than it wants, and ordering enough to refill it. The trouble is that the order it places is the next level's demand signal, and it already has the refill baked into it. Four levels of that and the raw material order bears no useful relationship to what anyone bought.
Sharing customer demand changes the signal each level sees, with the lead time, batch size and ordering rule held fixed.
Here is the maths
Fixed example: 40 weeks, demand of 100 units a week rising to 110 in week 6, lead time 2 weeks, batch size 1, smoothing weight 0.3, stock correction 0.5 and supply line weight 0. The readout shows week 9.
- Model version
- 1.0
The formula, in words
- Each level places one order a week, and it is built from three pieces: what it expects to sell, plus a correction for the stock it is missing, plus a correction for the orders it has already placed and not yet received. The third piece is the one that gets dropped in real life, and dropping it is what this page's default setting does.
- The forecast is an exponentially smoothed average of whatever signal the level can see, weighted 30% on the newest week. Every level uses the same rule; only the signal differs.
- The stock correction closes half the gap each week, not all of it. Closing all of it in one week would be a deadbeat controller, would produce a single spike rather than a wave, and would look nothing like how anybody actually orders.
- The target is two weeks of cover plus whatever should be on the way, which for a two week lead time is one more week of orders in transit.
- Batching holds an order back until it reaches a whole batch, then releases whole batches and carries the remainder. Nothing is invented and nothing is lost. It moves when orders happen, not how many.
- Sharing demand changes one thing. Instead of forecasting from the orders it receives, each level forecasts from what the customer actually bought. Every other line of the model is untouched.
A worked example
Take the supplier, four levels up, in the first two weeks after the step.
Everything is flat until week 5: every level holds 200 units, has 200 more on the way, forecasts 100 and orders 100.
In week 6 demand goes to 110. The store ships 110 instead of 100, so it ends the week with 190 on hand instead of 200. Its forecast moves to , its target moves to , and it orders . It has ordered one more unit than the ten extra it sold, which is entirely reasonable.
The distributor now sees an order for 111 rather than 110. It ships 111, ends on 189, forecasts 103.3, targets 206.6 and orders . The plant sees 112.1 and orders 113.3. The supplier sees 113.3 and orders 114.6. Four sensible decisions have turned a ten unit rise into a fifteen unit rise.
In week 7 the same four decisions run again on stock that is now genuinely short. The store orders 120, the distributor 132, the plant 147, the supplier 164. By week 9 the supplier is ordering 289 units a week to serve a customer buying 110.
At the store in week 7, last week's number is 110, its own forecast is 103 and demand is 110. The naive error for that week is 0 units and the smoothed forecast error is 7 units. The table averages the same two distances across all 40 weeks for every level.
Then it stops. The stock it ordered arrives, every level is far above its target, and the supplier orders nothing at all for four weeks. Its own inventory peaks at 589 units against a normal 200.
What this does not model
Price promotions and forward buying, which are a second and separate cause of the same effect. Rationing when a supplier allocates short supply and buyers inflate orders to get a bigger share. Capacity limits, so no level here is ever unable to produce. Order cancellation, returns and shelf life. Any randomness at all: demand here is a clean step or a clean spike, real demand is neither, and adding noise would make the mechanism harder to see rather than more honest. Cost is not modelled anywhere on this page, because the point is the shape of the orders, not the price of them. The error table is an in sample mean absolute error over this fixed deterministic run. It is not a rolling origin test, a scaled error measure or a claim about performance on a noisy demand history.
Check it yourself
Switch What each level watches to Everyone sees end demand and change nothing else. The store's swing stays at 23 units, because the store could already see the demand. The supplier's falls from 289 to 70. The lead time, the batch size and the ordering rule are exactly what they were.
A simulation of an ordering rule, not a model of any real chain. Four levels, one product, one lead time everywhere, unlimited capacity and no randomness: real chains have none of those properties, and the numbers here are the behaviour of the rule. It describes why order swings grow upstream and it settles no question about a particular supplier, a particular contract or a particular stock policy.
Related
- Kingman's formula: one more job doubled the waitA bench running at 90% looks busy and behaves fine, right up until it does not. What sets the wait is how full it is, and how unevenly the work arrives.Interactive lesson · 3 min
- Safety stock: variance beats the average lead timeTwo suppliers both quote 30 days. One of them quietly costs you triple the safety stock.Interactive lesson · 2 min