Demand Forecasting for Small Retailers: From Gut Feel to Reorder Points You Can Trust
Clean your sales history, forecast with a simple moving average, measure the error with WAPE and bias, and turn it into a reorder point and safety stock you can defend. One worked SKU, a 30-minute weekly routine, and when machine learning is worth it.
Author
Anichur Rahaman
1 month ago11 min read1 views
The best-selling kettle is gone from every shelf of a three-shop homeware retailer, and on this Friday morning a customer is asking for the display model, and the supplier says the next delivery takes two weeks. In the back room, a box of 140 candle holders that nobody asks for has sat since last October.
Nothing here is carelessness. The kettle's reorder level was set by eye months ago, when it sold 30 a week. It now sells 50, and nobody recalculated. (This is an illustrative scene, not a real shop.)
You do not need a data-science team to fix this. You need clean sales history, one or two simple formulas, and the discipline to spend your attention on the products that matter. Most of the value comes from a short list of habits, not from clever models.
This article walks through them with one worked example, a SKU that sells 50 a week like the kettle: cleaning the history, forecasting with a moving average, measuring the error, turning the forecast into a reorder point you can trust, and deciding how much effort each SKU deserves. All numbers in the example are illustrative.
Forecast demand, not sales
Your system records sales. What you want to forecast is demand: what customers would have bought if the shelf had never been empty and nothing unusual had happened.
The two differ more than people expect. A product that was out of stock for three days shows zero sales on those days, and a naive forecast treats that as weak demand. The next order is then too small, and the product runs out again. This loop shrinks the range of your best sellers, month by month.
Clean the history before you forecast
Before any formula, spend ten minutes on the last 8 to 12 weeks of each important SKU. Look for four things:
Stockouts. Days with zero stock understate demand. Estimate the lost sales from the normal daily rate and add them back.
One-off bulk orders. A company buying 10 units for an event is not a trend. Remove the excess, or the forecast will chase a spike that will not return.
Promotions. A discount week pulls sales forward. Flag it, and either exclude it or forecast promoted and normal weeks separately.
Returns. Decide whether you forecast gross sales or net of returns. For items with high return rates, net demand is what you actually need to restock.
Here is an illustrative SKU over eight weeks. Week 2 included a one-off bulk order of 10 units, and in week 4 the item was out of stock for one day (about 7 units of lost sales at the normal daily rate of 50 ÷ 7).
Week
Recorded sales
Adjustment
Cleaned demand
1
44
0
44
2
71
−10 (bulk order)
61
3
52
0
52
4
31
+7 (one day out of stock)
38
5
55
0
55
6
49
0
49
7
63
0
63
8
38
0
38
The cleaned total is 400 units, so average demand is 50 units a week. The raw total was 403, almost the same, but the weekly pattern was distorted in two places. The size of the distortion depends on the product, and on a thinner SKU it can change the answer completely.
Trend and seasonality: the two things a plain average misses
A plain average assumes next week looks like the last few. Two patterns break that assumption.
Trend is a steady rise or fall over months. If a product has grown 5% a month for a quarter, an average of the last eight weeks will always lag behind.
Seasonality is a repeating pattern: winter coats, school supplies, a holiday peak, Ramadan or Eid shopping, a monsoon, a wedding season. The simplest way to handle it is a seasonal index: the average sales of a given month divided by the average of all months. An index of 1.4 for December means December sells 40% more than a typical month. Multiply your base forecast by the index.
You need at least two years of history to estimate seasonality reliably. With less, use last year's same period as a rough guide and a calendar of known events, and do not over-trust it.
Start with the simplest method that works
For a steady SKU, a moving average is hard to beat: forecast next week as the average of the last four weeks. It is easy to explain, easy to check by hand, and it reacts slowly enough not to chase noise. The free textbook Forecasting: Principles and Practice is a good next step if you want exponential smoothing and other methods that add trend and seasonality.
The fair way to test any method is a backtest: pretend it is the past, forecast weeks you already know, and compare. Using the cleaned data above, a four-week moving average forecasts weeks 5 to 8 like this:
Week
Forecast (average of previous 4)
Actual
Error (actual − forecast)
Absolute error
5
48.75
55
+6.25
6.25
6
51.50
49
−2.50
2.50
7
48.50
63
+14.50
14.50
8
51.25
38
−13.25
13.25
Total
200.00
205
+5.00
36.50
Measure the error: WAPE and bias
Two numbers tell you whether a forecast is useful.
WAPE (weighted absolute percentage error) is the total absolute error divided by total actual demand. From the table: 36.5 ÷ 205 = 17.8%. It weights big sellers more than tiny ones, and it behaves sensibly when some weeks are low, which a plain MAPE does not.
Bias is total forecast minus total actual, divided by total actual: (200 − 205) ÷ 205 = −2.4%. A negative bias means you are under-forecasting. A bias that stays on one side for many weeks is a signal to fix, because it means every order is consistently too small, or too big.
Track both per SKU or per category, not for the whole store. A good shop-wide number can hide a dozen products that are always wrong. There is no universal target: a steady staple may reach a WAPE under 10%, while a fashion item can sit at 40% and still be handled well with the right safety stock.
From forecast to reorder point
A forecast tells you how much you will sell. A reorder point tells you when to order. The rule is simple:
Reorder point = demand during lead time + safety stock
Lead-time demand is average weekly demand multiplied by the supplier's lead time. Our SKU sells 50 a week and the supplier needs 2 weeks, so lead-time demand is 50 × 2 = 100 units.
Safety stock is the buffer for the weeks that go above average. A common formula is:
Safety stock = z × σ × √L
z is set by the service level you want. 95% corresponds to z = 1.65 (precisely 1.645).
σ is the standard deviation of weekly demand: how much it normally swings around the average.
L is the lead time in weeks. The square root is there because the swings partly cancel out over longer periods.
For our cleaned history, the deviations from 50 are −6, +11, +2, −12, +5, −1, +13, −12. Their squares add up to 644, and 644 ÷ 7 = 92, so σ = √92 ≈ 9.6 units. At a 95% service level and L = 2 weeks:
1.65 × 9.6 × √2 = 1.65 × 9.6 × 1.414 ≈ 22 units
Reorder point = 100 + 22 = 122 units. When available stock (on hand, plus on order, minus reserved for customers) drops to 122, place the order.
The order goes out at 122 units. Lead-time demand of 100 is used up while you wait, and the last 22 units are the buffer for a busy week.
What a service level costs
The service level here is the chance of getting through a replenishment cycle without a stockout. Every extra point costs more than the last one.
Service level
z
Safety stock
Reorder point
90%
1.28
17
117
95%
1.65
22
122
99%
2.33
32
132
Going from 95% to 99% adds 10 units, a buffer 45% larger, to cut the expected stockouts from about one cycle in 20 to about one in 100. For a hero product that is cheap insurance. For a slow, bulky item it is not.
The formula assumes a reliable supplier. If lead time also varies, use the extended version, z × √(L × σ² + d² × σL²), where d is average demand per week and σL is the standard deviation of lead time in weeks. In practice this means: track actual delivery times, and give unreliable suppliers a larger buffer.
How much to order
The reorder point says when to order. The quantity comes from a target level: order enough to lift your stock position (on hand plus on order, minus reserved) back up to it. A practical target for a weekly review is demand over the lead time plus one review week, plus safety stock: 50 × 3 + 22 = 172 units. If the position is 118 when you check, the order is 172 − 118 = 54 units.
Then apply the supplier's terms. If the minimum order is 60 units, or the item ships in cartons of 12, 54 rounds up to 60 either way. The flowchart shows the whole weekly decision, including the data check that stops a stockout week from shrinking next week's order.
Most weeks end at the first diamond: stock is above the reorder point and nothing is ordered.
ABC/XYZ: how much effort each SKU deserves
You cannot give every SKU the same attention. Two quick classifications decide where effort goes.
ABC ranks products by value. By a common convention, A items are the top products making about 80% of revenue, B the next 15%, C the last 5%. XYZ ranks by predictability, using the coefficient of variation (σ ÷ average demand). Common cut-offs are X below 0.5, Y from 0.5 to 1.0, Z above 1.0. Adjust them to your business.
Our example SKU has 9.6 ÷ 50 = 0.19, so it is an X. If it is also a top seller, it is AX: the right candidate for an automated reorder point with weekly review.
High value and steady demand deserve automation. Low value and erratic demand deserve almost none.
The labels matter less than the habit: a CZ item should never take an hour of your week, and an AZ item should never be left to a formula alone.
Where machine learning earns its place
Machine-learning models pay off in a few situations:
Thousands of SKUs, where nobody can tune each one by hand.
Many useful signals: price changes, promotions, weather, holidays, competitor stock, web traffic.
New products with no history, where the model learns from similar items.
Related products, such as substitutes and bundles, that move together.
They are a poor fit for a shop with a few hundred SKUs and a thin history, where a moving average with good data cleaning is usually as accurate and far easier to trust. A model you cannot explain to the buyer is a model the buyer will override.
Whatever method you choose, apply the same test: run it against a simple baseline on your own backtest. If it does not beat the moving average by a clear margin on WAPE, keep the moving average. Before investing in anything complex, make sure the basics are in place: accurate stock counts, a record of every stock movement and a clean sales history. Software that keeps these in one place, such as the inventory module in StoreConsole, makes the cleaning step far less manual. This short tour shows per-SKU low-stock alerts and the movement history that feeds a forecast.
Inventory tour (0:54): warehouses, stock movements and low-stock alerts in one view.
A 30-minute weekly planning routine
Forecasting only pays off if it becomes a habit. This routine fits into half an hour once the setup is done.
Check data quality (5 minutes). Look for stockouts, bulk orders and promotions in last week's sales for your A items, and adjust them.
Refresh the forecast (5 minutes). Update the moving average for A and B items. Apply the seasonal index if one is due.
Review accuracy (5 minutes). Check WAPE and bias for A items. Investigate any SKU whose bias has stayed on one side for three weeks.
Check reorder points (5 minutes). List the items at or below their reorder point, and the ones that will be there before the next delivery.
Place orders (5 minutes). Order, and note the promised delivery date to compare with what actually arrives.
Handle the Z items (5 minutes). Decide which erratic products to order against real demand, and which to stop stocking.
Once a quarter, revisit the ABC/XYZ classes, update seasonal indexes, and recalculate safety stock from fresh σ and measured lead times.
Back to the kettle. With a reorder point of 122 and the weekly routine above, the order goes out when available stock touches 122, while the shelf still holds about two and a half weeks of sales. The candle holders, a CZ item, get a yes-or-no decision once a quarter instead of a corner of the back room. Fridays will still bring surprises, but not that one.
Key takeaways
Forecast demand, not sales: add back stockouts, strip out one-off bulk orders, and flag promotions.
A four-week moving average is a strong baseline for steady SKUs; add a seasonal index when you have two years of history.
Reorder point = lead-time demand + safety stock, with safety stock = z × σ × √L. In the example: 100 + 22 = 122 units at a 95% service level.
Track WAPE and bias per SKU. Bias that sits on one side is a defect you can fix.
Use ABC/XYZ to spend your attention where it pays: automate AX, review AZ by hand, and let CZ go.
Reach for machine learning only with many SKUs and many signals, and only if it beats the simple baseline on your own data.
Anichur Rahaman is a software architect and the creator of StoreConsole. He designs commerce and ERP systems for growing businesses, with a focus on event-driven architecture, data integrity and self-hosted operations.