The standard safety stock formula is comforting because it looks rigorous. Plug in a service level, multiply by a standard deviation, get a number. The trouble is that the number rests on an assumption almost nobody checks: that demand over the lead time is normally distributed. For a large share of real SKUs, it is not, and when it is not, the formula under-stocks you in exactly the way that produces surprise stockouts.
What the formula assumes
The textbook reorder point is:
reorder_point = mean_demand_over_lead_time + z * sigma_LT
safety_stock = z * sigma_LT
The z term is a quantile of the normal distribution. Using it presumes demand over lead time
is symmetric and bell-shaped. That assumption is doing enormous quiet work.
Where it breaks
- Slow and intermittent movers. Items that sell zero most days and a burst occasionally are
not remotely normal. Their demand is lumpy and right-skewed, so the normal
zunderestimates the buffer needed to cover the spikes. - Right-skewed demand. Many products have a long right tail: usually quiet, occasionally a large order. The normal distribution has thin tails, so it under-provisions for exactly the events that cause stockouts.
- Lead-time variability. When the lead time itself varies,
sigma_LThas to combine demand variance and lead-time variance. Teams often plug in demand variability alone and understate the real spread.
A quick audit you can run
Before trusting z * sigma, check the demand distribution per SKU class:
# illustrative: compare the normal-implied buffer to the empirical quantile
import numpy as np
lt_demand = np.array(history_of_demand_over_lead_time) # one sample per lead-time window
z = 2.05 # ~98% normal quantile
normal_ss = z * lt_demand.std(ddof=1)
# empirical buffer to hit the same 98% coverage, no normality assumption
empirical_rp = np.quantile(lt_demand, 0.98)
empirical_ss = empirical_rp - lt_demand.mean()
print(normal_ss, empirical_ss)
If empirical_ss is much larger than normal_ss for your skewed or intermittent items, the
formula has been lying to you, and you have been running thinner than your stated service level.
What to use instead
- Empirical / bootstrapped quantiles. For skewed demand, take the buffer straight from the
empirical distribution of lead-time demand rather than a normal
z. - Distribution-specific models. Poisson or negative-binomial for count-like slow movers; gamma for right-skewed continuous demand.
- Croston’s method (and variants) for genuinely intermittent demand, which separates the demand size from the interval between demands.
The honest takeaway
The normal safety stock formula is fine for fast, steady movers whose demand really is roughly bell-shaped. For everything else, validate the assumption before you trust the output. A buffer sized by the right distribution is the difference between a service level you actually hit and one you only claim. Treat the classic formula as a default to be checked, not a law, and let your demand forecast tell you which SKUs need the more careful treatment.
Implementing this at your scale?
The walkthrough above comes from production work. AvanSaber’s inventory practice has implemented variations of this pattern across multiple customer engagements.
If you are building this and want expert review of your design, or would rather have the team that built this build yours, book a discovery conversation or describe your situation at [email protected].