Inventory

Inventory Optimization for Shopify: Prevent Stockouts Without Overstocking

Inventory optimization: the answer in one sentence

Inventory optimization is the practice of holding enough units of each SKU to cover demand through supplier lead time, while refusing to restock products that will not sell before they age. For a Shopify merchant, that means ranking reorder, hold, and markdown decisions by revenue at risk, not by unit count.

Accurate on-hand counts are necessary. They are not the same as an optimized inventory. A store can have perfect counts and still stock out of a bestseller or freeze cash in SKUs that have not moved in 90 days.

Why inventory optimization matters more than having accurate stock counts

Stockouts and overstock are two sides of the same cash problem. IHL Group's 2023 inventory distortion research, covered by Chain Store Age, estimated out-of-stocks at $1.2 trillion in lost retail sales worldwide, with overstocks at $562 billion. Those figures describe the whole retail sector, not Shopify specifically, but they show why unit accuracy alone does not protect revenue.

Cash trapped in slow stock cannot fund the next purchase order for a product that is actually converting. Shopify merchants feel this faster than big-box retailers because working capital is tighter and supplier minimums still apply.

Shopify's native inventory tools can show available units, incoming purchase orders, and low-stock states. They do not, by themselves, rank which SKU will cost you the most if it sells out this week. That ranking is the job of inventory optimization.

The 4 inventory decisions Shopify merchants need to make

Every SKU falls into one of four actions. If you skip the classification, you either reorder everything that looks low or freeze everything that looks high.

  1. Reorder now: demand velocity will eat remaining stock before the next shipment arrives.
  2. Hold: units on hand cover lead time plus a modest safety buffer, so a new PO would only add idle cash.
  3. Promote or markdown: the product converts poorly or is aging, and more units will not fix it.
  4. Investigate: traffic, conversion, or lead-time data is incomplete, so a reorder would be a guess.

The rest of this article walks through how to assign those four labels using sales velocity, supplier lead time, aging, and revenue at risk. You can run the same loop weekly in a spreadsheet, or let a stock monitor surface the same list automatically.

Step 1: find products at risk of stocking out

Days of cover is the first filter. Divide on-hand units by average daily units sold. If days of cover is shorter than supplier lead time plus your receiving buffer, the SKU is at stockout risk even if the count still looks healthy.

A simple example: 80 units on hand, 8 units sold per day, 14-day lead time. Days of cover is 10. The next shipment cannot arrive before you run out. The alert should fire while you still have time to place the order, not when the product hits zero.

Shopify can flag low inventory when you set a threshold per variant. That threshold is usually a static number. Static numbers miss velocity. A SKU selling 20 units a day needs a much higher trigger than a SKU selling 2 units a day, even if both currently show 40 units.

For a practical alert setup, including how Shopify's own low-stock signals work, see Shopify inventory alerts. Pair those alerts with a days-of-cover check so bestsellers do not hide behind a one-size threshold.

Step 2: separate slow stock from healthy safety stock

Safety stock is a buffer you chose. Slow stock is inventory that demand is not consuming. Mixing the two makes every overstock conversation vague.

Use aging as the separator. Pull units that have not sold in 30, 60, and 90 days. A 14-day buffer on a product that sells daily is safety stock. The same 14 units on a product with no orders in 60 days is idle cash.

Shopify does not ship a native inventory-aging report that buckets on-hand value by how long units have sat. Export inventory with last-sold date (from order history or a product export) and bucket SKUs in a spreadsheet yourself. The inventory aging report walkthrough covers how to read those buckets without treating every leftover unit as a crisis.

Once you have aging buckets, freeze reorders on SKUs in the 60- and 90-day groups unless a confirmed demand change exists (a restock campaign, a wholesale order, a seasonal spike with history). Promoting a dead SKU is cheaper than buying more of it.

Step 3: set reorder timing using sales velocity and supplier lead time

Reorder point is not a feeling. It is (average daily sales × lead time in days) + safety stock. Place the purchase order when inventory position falls to that number, not when the raw on-hand count does.

Inventory position is the stock you can actually use to cover demand during the next lead-time window: on-hand units, plus incoming units with a confirmed arrival inside that window, minus committed or reserved units (unfulfilled orders, holds, transfers), minus open backorders. Incoming stock dated after the window ends does not count. Unconfirmed or slipped POs do not count either.

If you add every open PO and ignore units already promised to customers, you will place the next order too late (or skip it) and still stock out. If you ignore incoming stock that will land before you run out, you will double-buy.

Lead time must include more than the supplier's quoted production window. Add transit, receiving, quality holds, and the days until you actually open the PO. A 10-day factory quote that becomes 18 days door-to-shelf will still stock you out if you plan against 10.

Velocity should be recent and SKU-specific. A 90-day average hides a last-14-day spike. A 7-day average overreacts to one viral day. Many Shopify operators use a 14- or 28-day window, then sanity-check against last year's same period for seasonal SKUs.

The full formula, including how to handle incoming POs and variant-level lead times, is in the Shopify reorder formula guide. Pair it with ecommerce demand forecasting when promotions or seasonality will change the daily rate before the next shipment lands.

Step 4: prioritize SKUs by revenue at risk, not unit count

A 200-unit gap on a $12 accessory is not the same problem as a 20-unit gap on a $180 hero product. Rank the action list by expected lost revenue if the SKU hits zero before replenishment, not by how many units are missing.

A workable ranking: daily units sold × selling price × days of uncovered demand (lead time minus days of cover, floored at zero). Sort descending. That is the order in which you should email suppliers, not the order of your SKU spreadsheet.

This is also where ad spend belongs in the conversation. If paid traffic is still pointed at a variant that will stock out in five days, you are buying clicks you cannot convert. Pause or retarget that spend until the PO is confirmed, and do not scale ads on SKUs you have already classified as hold or markdown.

Skymetrics' Stock Intelligence is built for this ranking: continuous stock monitoring, stockout alerts, and reorder forecasting that surfaces what to buy before a bestseller runs out, instead of a flat low-stock list.

The inventory optimization metrics worth monitoring

You do not need a 20-metric dashboard. These six numbers catch most stockout and overbuy errors for a product-driven Shopify store.

  • Days of cover: on-hand units ÷ average daily units sold, compared against lead time.
  • Reorder point: (daily sales × lead time) + safety stock.
  • Sell-through rate: units sold ÷ (units sold + units remaining) over a set window.
  • Inventory aging: on-hand value in 30 / 60 / 90+ day buckets.
  • Stockout rate: SKUs that hit zero during the period, ideally weighted by revenue not SKU count.
  • Gross margin return on inventory (GMROI): gross margin ÷ average inventory cost, to see which SKUs earn their shelf.

Track stockout rate in revenue terms. Ten zeroed SKUs that barely sell is a different failure than one hero product offline for four days. If you only watch unit fill rate, you will celebrate the wrong week.

Common inventory optimization mistakes that create stockouts or overstock

These patterns show up in Shopify stores that already "watch inventory" every week.

  • One static low-stock number for every variant, so fast sellers never alert early enough and slow sellers alert constantly.
  • Reordering from last year's purchase order instead of current velocity.
  • Ignoring incoming POs, which double-buys stock that is already on the water.
  • Counting incoming stock that will not arrive inside the lead-time window, or ignoring units already reserved for open orders.
  • Treating safety stock as a permanent pile instead of a buffer sized to lead-time variability.
  • Optimizing units instead of cash: filling the warehouse on a supplier's MOQ because the unit cost looked cheap.
  • Leaving ads live on SKUs inside the stockout window.
  • Never writing down real lead time, so every reorder is late by the same number of days.

Fix one of these per week. Changing the alert logic and recording true lead times usually removes more stockouts than buying a more complex forecast.

Turn inventory data into a weekly action list

Run this loop on the same day each week so the list stays short enough to execute.

  1. Export or review on-hand units, incoming POs with expected arrival dates, committed or reserved units, open backorders, last 14 and 28 days of units sold, and selling price for active SKUs.
  2. Compute inventory position, then flag SKUs where that position is at or below reorder point (or days of cover is less than lead time). Rank them by revenue at risk.
  3. Place or confirm POs for the top of that list. Record the real clock-start date.
  4. Flag 60- and 90-day aging SKUs. Pause reorders. Decide promote, bundle, or markdown.
  5. Turn off or recast ads on anything inside the stockout window.
  6. Write down three actions only: who you emailed, which SKU you froze, which ad you paused.

Three executed decisions beat a 40-row spreadsheet you do not touch until Friday. If the weekly list is still too long, raise the revenue-at-risk cutoff until it fits the hours you actually have.

Inventory optimization is a ranking problem. Count stock so the ranking is honest, then act on the SKUs that will cost you the most if you wait.