Safety Stock & Reorder Point Batch Calculator
Every SKU in one table. We compute the demand deviation from your history — you never look up a Z-score.
Straight from an ERP or WMS export: one row per transaction. We derive d̄ and σd for you.
Drop your CSV here
Nothing is uploaded — the file is read inside this tab. UTF-8 and EUC-KR (CP949) exports both work.
Column mapping
We guessed from your header and the data below. Confirm before you trust the numbers.
Service level and lead time
Used for every SKU without its own lead time in the table below.
An ERP export has no row for a day with no sale. Skip those zeros and d̄ comes out too high while σd comes out too low — safety stock quietly drifts.
Lead time, σLT and on-hand stock per SKU (optional)
A second small table keyed by SKU. Give us an on-hand column and we flag what to order right now; give us a lead-time deviation column and it enters the formula.
Limit to a specific period (optional)
By default each SKU is measured from its own first to its own last transaction. Set a period and every SKU shares it — rows outside are reported as excluded.
Periodic review (optional)
If you only place orders on a cycle — month-end close, weekly run — the protection window is LT + R, not LT. Enter the review cycle R in calendar days (a monthly cycle is 30).
Economic order quantity (optional)
EOQ = √(2 × D × S / H) with D = d̄ × 365. Both costs are required — without them the column stays hidden rather than showing a meaningless 0.
Frequently asked questions
Do I need to know the demand standard deviation (σd) already?
No — that is the whole point of this safety stock calculator. Every other free reorder point calculator asks you to type in a σd you do not have. Here you paste the sales history your ERP or WMS already exports (date, SKU, quantity) and the tool rebuilds a daily demand series per SKU, then computes the average daily demand d̄ and the sample standard deviation σd (n−1, the same result as Excel's STDEV.S) using Welford's method, which stays accurate over hundreds of thousands of rows. You only supply the lead time and the service level.
How are days with no sales handled, and why does that change safety stock?
An ERP export contains no row for a day on which nothing sold, so the raw file silently omits every zero. If you average only the selling days, d̄ comes out too high and σd too low — the safety stock formula then returns a number that looks precise and is wrong. By default we rebuild the full calendar between each SKU's first and last transaction and fill the missing days with 0, then report how many days were filled. You can switch to selling days only, and the result carries a badge saying so. Multiple rows for the same SKU on the same day are summed into one day of demand.
Which service level should I pick, and what is the Z-score?
The service level is the share of replenishment cycles in which you do not want to run out; Z is the one-sided normal value that goes with it — 90% → 1.2816, 95% → 1.6449, 97.5% → 1.9600, 99% → 2.3263. They are built into the dropdown so you never look one up. Safety stock rises non-linearly: going from 95% to 99% costs roughly 40% more stock for four points of coverage. 95% is the common default; use 99% for A-class or safety-critical items and 90% for cheap, easily re-ordered C-class parts. The Z-score and the formula are the same in every country, so this tool has no country setting for them.
What if I have no lead-time deviation (σLT)? How wrong is the answer?
The full formula is SS = Z × √(LT × σd² + d̄² × σLT²). With no σLT column we set σLT = 0 and the reduced form SS = Z × √(LT) × σd is what you get, with a permanent badge on the result saying demand variability only — we never let that assumption go unstated. It understates safety stock whenever the supplier is unreliable, and the second term grows with d̄, so it bites hardest on your fastest movers: a fast item with a lead time that swings by a couple of days can need substantially more stock than the reduced form suggests. Add a lead-time deviation column in the optional per-SKU table and the full formula is used.
Is my sales and inventory data sent to a server?
No. There is no upload, no account, no email gate. The CSV is read with the browser's File API, parsed and aggregated in this tab (large files in a Web Worker), and the result table is rendered from memory — refresh the page and it is gone. Only your settings (service level, default lead time, column mapping) are kept, in this browser's localStorage. You do not have to take our word for it: press F12, open DevTools → Network, then drop your file and hit calculate. The request count stays at zero. That is what makes the file safe to run on an export you would never be allowed to upload.