Free tool · no signup · no upload

How much revenue did you lose to stockouts?

Drop in your orders export. This finds the days each SKU went unusually quiet against its own weekday pattern, estimates what that likely cost, and tells you plainly which SKUs it cannot judge.

Your file never leaves this page — everything runs in your browser
On a phone, start here

Try the sample now, or open this page on a computer with your CSV export.

Drop your orders CSV here or click to choose a file — it is read in this tab and goes nowhere
In Shopify: Orders → Export → All orders → CSV
Works with any CSV that has a date, a SKU and a quantity — Amazon, WooCommerce, or your own.

Don't have a CSV to hand right now? See it run on sample data first →

Refuses

Three things it will not tell you, whatever your file says

A gap that is still open when your export ends is never priced into the headline. “Out of stock” and “you withdrew the line” are the same data, so those SKUs get their own section and the cost is written as a condition, not as a finding.

A SKU selling under about 0.3 a day is not judged at all, and between there and about 1 a day it is judged but could not have produced a two-week finding — so the row says how short an outage it could actually have seen, rather than reading as a clean bill of health.

Where the estimate wants to exceed what the SKU ever sold, the dollar figure is dropped and the SKU moves to a table of its own.

The four measured failures behind those rules →

Match your columns

Auto-detected from your header row. Change anything that looks wrong.

Estimated revenue lost to stockouts
—

Selling stopped recently — was that deliberate?

Silent forSKULast soldWas selling Daily patternIf it's a stockout

These are not in the total above, and the money column is a condition, not a finding: sales data cannot tell a product that ran out from one you took down on purpose. If you delisted it, paused its ads, or it is out of season, there is nothing here to act on — the row is only telling you the silence exists. Check the ones you did not intend.

Where the money went, by SKU

SKUDaily patternSoldAvg/day Shortest outage I'd catch Stockout daysLost unitsLost revenueStatus

This table scrolls sideways; the first column stays put. When you are back at a laptop with your own export, this page is where it goes — or use the link at the top to send it to yourself.

Blue bars are daily units across the period. An orange band is a flagged outage. Short grey ticks are zero-sale days that did not clear the bar.

Assessed, nothing found — and here is what would have been invisible

SKUDaily patternSoldAvg/day Shortest outage I'd catch

There is no money column here on purpose: nothing was found, so there is nothing to price. What this table gives you is the size of the blind spot — at these sales rates a shorter run of zero-sale days is an ordinary quiet week, so a real outage that long would look exactly like one and is not reported. Treat these as unchecked rather than confirmed in stock. The fix is not a longer file: the bar barely moves with more history. It is more sales per day, or your own inventory log.

Not counted — these don't fit the model

Each of these has long silent stretches, but the shape says seasonal, discontinued, newly launched or sold in bursts — not out of stock. Putting a dollar figure on them would tempt you into buying stock you don't need, so there isn't one. Look at the pattern and judge for yourself.

SKUDaily patternSoldSilentLooks like

The one that costs money

Now you know what it cost. What should you order?

This page looks backwards — what you already lost. Reorder Copilot looks forwards: give it your stock levels and supplier lead time and it tells you which SKUs to order this week and how many.

  • Order quantities sized with proper safety stock for your service level
  • A purchase order CSV you can send straight to your supplier
  • Refuses to size an order for discontinued or seasonal SKUs — the mistake that fills a warehouse with dead stock
  • Same rules as this page: one file, no server, works offline forever
See Reorder Copilot — $49 once One payment, no subscription · 30-day refund, no questions
Exactly how this is calculated (and where it can be wrong)

The method

  1. Each SKU's sales are laid out day by day from its first ever sale, so a product launched in month three isn't punished for months one and two.
  2. Every weekday gets its own baseline rate. A product that only sells on Saturdays is not out of stock Sunday to Friday — a flat average says it is, and would report several times more loss than the product has ever earned. Thin weekdays are pulled toward the SKU's own average so a single quiet Tuesday can't distort it.
  3. Days when the entire shop sold nothing are thrown away first. Those are closures, holidays, site outages or tracking gaps. Treating them as per-SKU stockouts is how one Thanksgiving weekend becomes five figures of imaginary loss spread across the whole catalogue.
  4. A run of zero-sale days is flagged only if the units it should have contained — adding up each day's own weekday rate — passes a bar set once for the whole report, from its total size. Checking every gap independently would manufacture findings, because a few hundred SKU-months contain thousands of chances for a quiet stretch to look like an outage.
  5. Runs shorter than 4 days are never flagged.
  6. The bar is set once for the whole report, from its size, so adding SKUs or months raises it slightly for everything in the file. A finding that sits close to the bar can drop out when you upload a longer export, and the same SKU can be judged in one file and not in another. That is the correction working, not the tool changing its mind: more SKU-days means more chances for an ordinary quiet stretch to look like an outage, and the bar has to rise to keep the number of false alarms across the whole report where you set it. It rises logarithmically, so it moves slowly: quadrupling the size of your file raises the bar by ln 4 — about 1.4 expected units — whatever size the file was to begin with.
  7. Every SKU is also given the shortest outage it could have produced a finding from. Invert the bar: a run has to reach the bar in expected units, and over a run spanning whole weeks that expectation is close to its length times the SKU's average daily rate — so the shortest detectable outage is the bar divided by that rate. (An average-rate approximation: a gap falling on a SKU's strong weekdays clears the bar a little sooner, one on its weak weekdays a little later.) Any SKU whose number exceeds 14 days is listed as a blind spot rather than as clean. Fourteen is not a statistical constant — it is the outage length this tool's floor was measured against, chosen because a fortnight out of stock is roughly where a merchant would want to have known.
  8. A run that is still going when the file ends is never priced into the total. A product that is silent right now might be out of stock, or might be one you delisted, paused or put away for the season — the sales data is identical in every case, so any figure would be a guess dressed as a finding. Those SKUs get their own section instead, with the cost written as a condition. A product with no sales at all in the recent half of its history is treated as discontinued and gets no figure of any kind.
  9. Lost revenue = lost units × that SKU's median unit price, and lost units can never exceed what the SKU actually sold. If the estimate wants to break that ceiling, the model doesn't fit and the SKU is moved out of the total.

What this does not know

  • Slow sellers are excluded, not estimated. Measured: a SKU is judged at all from about 0.3 units a day, and a two-week outage only becomes findable at about 1 unit a day. Below that a fortnight of silence is ordinary and the data physically cannot tell it apart from an outage. Those are reported as "not assessed" rather than given an invented number — so this total is an undercount by design.
  • "Nothing found" is not "nothing happened", and this page says which it means. Between those two rates sits a band where a SKU can be assessed, produce no finding, and still have been out of stock for two weeks without it registering. Reporting that as clean would be the same failure as an inflated total, aimed the other way — and the more expensive way, because it ends with a dead SKU that never gets reordered. Every assessed SKU therefore carries the shortest outage it could have shown, and the ones above 14 days get their own section instead of silence.
  • It can't see your inventory log. It infers stockouts from the shape of your sales. A gap could equally be a paused ad campaign, a supplier delay, or a listing you unpublished.
  • Promotions and seasonality aren't modelled beyond the weekday pattern. A product that sells only in December will look wrong here; that's why it gets moved to the "doesn't fit" table.
  • Substitution isn't modelled. If a customer bought the blue one because the red one was gone, the red one's "lost" revenue was partly recovered.
  • Refunds and cancellations usually stay in an orders export as positive line items, so they inflate the baseline slightly. Filter them out before exporting if you can. Where your export writes the return as a negative line instead, those lines are set aside and the count is printed with your result — the sale each one reverses still counts, because the demand was real even though the money came back.
  • Mixed currencies aren't converted. If your export has more than one presentment currency, the money column here is meaningless — use the units column.
  • It cannot tell a stockout from a decision. Everything still silent at the end of your file is listed under "Selling stopped recently" with its cost stated as a condition, and left out of the headline. Only you know which of those you meant to do — so the total on this page counts only outages you demonstrably recovered from, and is smaller than the truth if some of that silence was unintended.

Treat this as a shortlist to go investigate, not an audited figure, and never as the sole basis for a purchase order. Open your inventory history for the top three and confirm they were actually out before you act on any of it.

More on why it is calculated this way: most stockout-cost calculators overstate losses, and here is the arithmetic — the four failures behind the rules above, each with the measured numbers.

Next question

Not buying anything today: the reorder point formula is written out in full, with a free calculator and the three cases where it hands you a confidently wrong answer.

Reorder Point →