WooCommerce knows how many units of each product you have. It can warn you when a product falls below a low-stock threshold. What it cannot tell you is how many to order, or whether the threshold you set two years ago still fits how the product sells today. This guide sets out a simple method you can run in a spreadsheet, the places where it goes wrong, and the adjustments that keep it sensible.
The five numbers
Every reorder method, however elaborate, comes down to the same few quantities.
- Sales velocity. How many units a product sells per day, on average, over a recent window.
- Lead time. How many days pass between placing an order with the supplier and the stock being on the shelf, ready to sell. Include the time it takes you to place the order and to book the delivery in, not only the transit time.
- Cover. How many days you want a delivery to last once it arrives. Short cover means frequent small orders; long cover means fewer, larger ones and more money tied up in stock.
- Reorder point. The stock level at which you need to order now, because what is left will run out before a new delivery lands. At its simplest, velocity × lead time.
- Order quantity. Enough to get through the lead time and then the cover period, less what you already have.
Put together:
- Target stock = daily sales × (lead time + cover)
- Order quantity = target stock − stock on hand
Working out sales velocity
Take the units sold over a window and divide by the number of days in it. Three details matter more than the choice of formula.
Pick a window that fits the product. Ninety days is a reasonable default: long enough to smooth out a quiet week, short enough to notice change. A shorter window reacts faster and is noisier. A seasonal shop needs a window that covers at least a full season, or it will under-order at the start of every one.
Net out returns. A unit that was sold and then returned is back on the shelf. Count it as sold and you will order it twice.
Watch for stock-outs. If a product was out of stock for half the window, it sold for only half of it, and the average understates real demand by about half. No simple formula sees this. Look at any product that ran out recently before trusting its velocity.
Safety stock, without the statistics
Textbook methods add a safety stock calculated from how much demand and lead time vary. That is worth doing if you have a long, stable sales history per product and suppliers who publish reliable lead times. Most small shops have neither, and the formula then produces a precise-looking number from imprecise inputs.
A practical substitute is to hold extra days of cover, and to hold more of them for the products that matter most. Ranking products by revenue does this well: sort them by revenue over the window, then call the products making up the first 80% of revenue class A, the next 15% class B and the rest class C. This is ABC analysis. Holding class A for longer and class C for shorter puts the buffer where running out costs the most.
Apply that adjustment to the cover only, never to the lead time. A supplier takes as long as it takes, however important the product is.
A worked example
The numbers here are invented for illustration. A product sold 135 units over the last 90 days, net of returns: 1.5 units a day. Your supplier delivers 7 days after you order, and you want each delivery to last 30 days. You have 12 units on hand.
- Reorder point: 1.5 × 7 = 10.5 units. At 12, you are just above it.
- Days of stock left: 12 ÷ 1.5 = 8 days. That is more than the 7-day lead time, so you can order this week rather than today.
- Target: 1.5 × (7 + 30) = 55.5, rounded up to 56.
- Order: 56 − 12 = 44 units.
Now suppose the last 30 days were busier: 60 units, or 2 a day against the 90-day average of 1.5. Trusting the recent rate fully would push the target to 74. Trusting half of it gives an effective rate of 1.75 a day:
- Days of stock left: 12 ÷ 1.75 ≈ 6.9 days. That is less than the lead time: order now.
- Target: 1.75 × 37 = 64.75, rounded up to 65.
- Order: 65 − 12 = 53 units.
Blending the recent and long-run rates, rather than replacing one with the other, is a deliberate compromise. A busy month may be the start of a trend or a one-off, and you cannot yet tell which.
Why slow movers need a cap
The formula above breaks down for products that rarely sell. Suppose a product sold 3 units in 90 days. Its velocity is 0.033 a day, the target is 1.2, and rounding up asks for 2. That looks harmless, but a single extra sale moves the average by a third, and any trend adjustment on top of three data points is guesswork.
It gets worse with ABC classes. An expensive product can be class A on revenue while selling a handful of units a quarter. Give it class A cover and you are stocking deeply the very product that turns over least, which is how stock ends up written off.
So treat slow movers with a separate, flat rule: if a product sold at or below a small number of units in the window, hold a fixed small quantity, regardless of class or trend. Products that did not sell at all in the window get no reorder; whether to keep stocking them is a buying decision, not a calculation.
Seasonality, promotions and other caveats
- Seasons. A rolling average lags. Going into a peak, the method under-orders; coming out, it over-orders. Use a window covering a full season and adjust by hand at the turn of the season, or compare with the same period last year.
- Promotions. A sale weekend inflates the recent rate. Exclude it mentally, or cap how far a recent rate can move the order.
- Case packs and minimum order quantities. Round the order up to what the supplier actually sells.
- Different suppliers, different lead times. Group products by supplier if their lead times differ much.
- Overstock. The same arithmetic run in reverse finds products holding far more than they need. Those are worth a discount or a pause in ordering.
Doing it in a spreadsheet
Export sales by product for the window, net of refunds; export current stock from WooCommerce; then add columns for daily rate, class, target and order quantity. It works. The effort is in keeping the export current and handling variations that share one stock count, which have to be combined into a single row with the stock counted once.
Where Caltru Ledger Pro automates it
Caltru Ledger Pro, the paid add-on to the free Caltru Ledger plugin, runs this method on the sales the free plugin has already recorded and the stock WooCommerce already knows. Its replenishment screen sorts every product with tracked stock into three groups: Order now (out of stock, or will run out before a delivery lands), Plan soon (worth ordering, but stock still covers the delivery time) and Nothing to order.
The rules are the ones described above, applied in order:
- Never sold in the window: order nothing.
- A slow mover, at or below a set number of sales: hold a token quantity, ignoring class and trend. By default that is 3 sales or fewer in the window, held at no more than 2 units.
- Otherwise: daily rate × (lead time + cover), with the cover scaled by ABC class, 125% for class A and 75% for class C by default.
The trend is a weighted blend of the recent rate with the long-run rate, clamped between 0.75× and 1.5× so a busy fortnight cannot triple an order, and only applied once a product has enough sales for the average to mean anything. Demand is net of refunds, variations sharing a parent’s stock are folded into one row, and each row shows the sum that produced its quantity, along with a rough order value at today’s costs. The list exports to CSV for your supplier.
It does not place or track purchase orders, it uses one lead time for all products rather than one per supplier, it does not round to case packs, and it does not correct demand for periods when a product was out of stock. Pro is €89 a year for one shop or €179 for five, excluding VAT, and you can try it for 14 days without a card.