Going Stellar

Home/Methods

E-commerce · Inventory planning

How to calculate reorder quantity and stock-out date per SKU from daily inventory snapshots

Reorder quantity per SKU is daily sales velocity times the days until the next delivery plus a safety buffer, minus what is on hand and what is already on the way. Velocity can be read from daily inventory snapshots, but only after correcting for restocks, stock-outs and duplicated stock rows, and the incoming figure must come from what was actually loaded, not from what was ordered.

Updated

What a reorder plan per SKU answers

A reorder plan per SKU answers two questions: how many units to order now, and on what date the current stock runs out. The formula we use is reorder_qty = ceil(velocity × (lead_time + safety_days) − on_hand − incoming), minimum 0. Days of cover is on_hand ÷ velocity, and the stock-out date is today plus days of cover.

Velocity is the number of units a SKU (stock keeping unit, one sellable variant) sells per day. Lead time is the number of days from placing a purchase order until the goods can be sold. Safety days are a buffer for late shipments and demand spikes. Incoming is stock already ordered and on its way.

A low-stock alert and a reorder plan are different tools. A low-stock alert says which SKUs are running out. A reorder plan says how many units to buy and when, which matters most when goods travel by container and the lead time is long.

Reading sales velocity from daily inventory snapshots

A daily inventory snapshot is one row per SKU per day with the quantity on hand. Snapshots are a convenient source for velocity because they exist for every SKU, every day, in one table, even where order data is split across several systems.

1. Sum the daily decreases. Velocity per day = the sum of max(on_hand_yesterday − on_hand_today, 0) over the window, divided by the number of days. Increases are restocks and are ignored. Our default window is 28 days.

2. Do not use the net change over the window. A simpler formula, stock 28 days ago minus stock today, is wrong whenever a restock lands inside the window: the delivery cancels out the sales and the SKU looks slow. Summing only the decreases avoids that.

3. Treat the result as a proxy. A recount or a manual stock correction also shows up as a decrease, so snapshot velocity can count a correction as sales. Cross-check fast movers against delivered orders before a large purchase order.

4. Rank by what a stock-out costs. Velocity times price gives the sales lost per day without stock. We sort SKUs that need ordering first, then by days of cover ascending, then by that daily figure.

A worked example with hypothetical numbers

The numbers below are round and hypothetical, chosen to keep the arithmetic easy. They do not come from any store we run.

Inputs: velocity 10 units per day, lead time 30 days, safety buffer 14 days, 200 units on hand, 100 units incoming.

Step 1. Units needed until the next delivery plus buffer: 10 × (30 + 14) = 10 × 44 = 440.

Step 2. Reorder quantity: 440 − 200 − 100 = 140 units.

Step 3. Days of cover: 200 ÷ 10 = 20 days. The stock-out date is 20 days from today, which is before the 30-day lead time, so this SKU is ordered today and flagged red: it will run out before the goods arrive.

A SKU with zero sales in the window has infinite days of cover. The plan does not order it, which is correct for a dead product and wrong for a product that sold nothing only because it had no stock. The next section handles that case.

Correcting demand that a stock-out hid

A stock-out censors demand: a product with no stock sells nothing, so its recent velocity is zero and the reorder plan skips it. The fix is to measure velocity only over the days the product was actually on sale.

For each SKU, velocity = units sold ÷ active selling days (first sale to last sale) × 30, which gives units per month while the product was available. A product that sold 240 units in 267 days sells about 27 a month and beats one that sold 300 in 400 days, about 22.5 a month. We trust the figure only above roughly 20 units and 21 active days.

Annual demand for sizing is max(sales in the last 12 months, in-stock monthly rate × 12). The final quantity is max(0, annual demand × months of cover ÷ 12 − stock), rounded to 50, with about 20% extra on the top 3 sellers so they do not break during the peak.

Seasonality and the arrival date

A purchase order should be judged at the date the goods arrive, not the date it is placed. A spring or summer product that lands at the start of autumn sits as dead stock for six to eight months until its season returns.

The reverse also holds. A line whose peak month sells three to four times its summer volume needs to be sized on annual demand, which includes the peak, not on the average month. Read sales month by month before sizing, never one average number.

Before a purchase order goes out we check three things: seasonal products whose arrival falls off-season, SKUs the restock plan recommended that are missing from the order, and best-sellers on zero stock in sales channels the restock report cannot see.

The traps we hit and how we catch them now

Stock repeated on every listing. When several stores sell from one shared pool, the same stock figure appears identically on every listing of a SKU. Summing those rows multiplies the stock. Take the stock once per SKU and add the sales of every channel.

Today's stock compared with old orders. We once flagged 166 orders as waiting for goods that did not exist, by comparing today's zero stock with orders placed days earlier. The goods had been there when those orders were placed. The right question was whether anything with that SKU shipped after the order was placed. With that test the list fell to 26 orders, each the last in line for its SKU.

Incoming that nobody counted. In one system a container marked as arrived pushed its expected quantities straight into sellable stock, without a count. One container was marked arrived before its estimated date. The stores sold units that were not on the shelf. Incoming and received stock must come from a count, not from a packing list.

The order system is not the packing list. Purchase-order lines can be cancelled in the ordering system and still be produced and loaded. What is in a container is read from the supplier's packing list, and both sources are checked before saying that something is not coming.

Zero that hides a negative. Clipping negative stock to zero makes oversold SKUs look merely empty. Keep the sign, and keep zero-stock products visible in reports, otherwise the products most in need of a reorder disappear from the list.

Where we were wrong

Our first sizing passes ordered mostly the SKUs on zero stock. The larger need was elsewhere: fast best-sellers with thin stock that would break during the peak. A best-seller with plenty of cover needs nothing, however well it sells; a fast seller with little cover needs the biggest order of all. Days of cover, not stock level, is the trigger.

We also trusted a restock report built on one fulfilment system. Stores that shipped through a different system had no rows in it, so their best-sellers on zero stock were invisible and missing from the purchase order. Check every sales channel directly.

Limits

The plan is only as good as its lead time. A default of 30 days is a placeholder; local suppliers and sea containers need their real figure. Snapshot velocity is a proxy that corrections and recounts can distort. Where snapshot history is short, velocity rests on fewer days and is noisier. The cost of a purchase order computed from unit costs is underestimated wherever a unit cost is missing.

The method also does not forecast a launch, a promotion or a new channel. Those need an explicit multiplier chosen by a person, written down next to the plan.

Checklist

1. Velocity. From the sum of daily decreases, not the net change.

2. Stocked-out SKUs. Velocity over in-stock days only.

3. Shared stock. Counted once per SKU, with sales summed across channels.

4. Lead time. The real figure for each supplier.

5. Incoming. From counted or loaded quantities, after checking for new containers.

6. Trigger. Order everything whose days of cover fall below the lead time.

7. Season. Compare the arrival date with the product's season.

8. Visibility. Keep negative and zero stock in every report.

Questions and answers

How do I calculate reorder quantity for a SKU?

Reorder quantity = daily velocity × (lead time + safety days) − units on hand − units already incoming, rounded up and never below zero. Velocity is units sold per day, lead time is the number of days until ordered goods can be sold, and safety days are a buffer for delays and spikes. For example, 10 units a day with a 30-day lead time and 14 safety days needs 440 units; with 200 on hand and 100 incoming, order 140.

How do I calculate the stock-out date of a product?

Divide units on hand by daily sales velocity to get days of cover, then add that number of days to today. If days of cover are fewer than the supplier lead time, the product will run out before a new order can arrive, so the purchase order should be placed now. A product with no sales in the window has unlimited cover and is not reordered by the formula.

Can I get sales velocity from inventory snapshots instead of orders?

Yes, as a proxy. Take one snapshot of stock on hand per SKU per day, sum the daily decreases over a window such as 28 days, ignore the increases because they are restocks, and divide by the number of days. Manual corrections and recounts also appear as decreases, so cross-check fast-moving SKUs against delivered orders before placing a large order.

Why does a product that is out of stock show zero demand?

A product with no stock cannot sell, so its recent sales are zero even if customers want it. Measure velocity only over the days the product was on sale, for example units sold divided by active selling days, times 30 for a monthly rate. For sizing, use the larger of the last 12 months of sales and that in-stock rate times 12.

Should I size a purchase order on average monthly sales?

Not for seasonal lines. A line whose peak month sells three to four times its summer volume will run short if sized on the average month. Look at sales month by month, size on annual demand that includes the peak, and check the arrival date: a summer product that lands in autumn waits six to eight months for its season.

How to cite this

Going Stellar (2026). How to calculate reorder quantity and stock-out date per SKU from daily inventory snapshots. GOING STELLAR S.R.L..
https://goingstellar.ro/methods/reorder-planning-daily-inventory-snapshots/

Read as Markdown

All methods

Contact

Tell us what is not working

Write in English or Romanian. A person reads it — usually the same person who would do the work — and answers within one business day.