inventory turnover analysis: a real example
most ecommerce solopreneurs talk about inventory like it is a static thing. they know they have $20,000 in stock, they know it sits in a fulfillment center somewhere, and they know cash is tight. they cannot tell you which SKU is selling weekly versus sitting for 9 months, which means they reorder the wrong things, run out of bestsellers, and tie up cash in product that will never move.
a real inventory turnover analysis takes one afternoon. you list every SKU, calculate how often each turns over (sells through and gets replaced), flag dead stock, and prioritize reorders. that gives you three lists: SKUs to reorder immediately, SKUs to discount, and SKUs to discontinue. running this monthly turns inventory from a vibes-based guess into a cash flow lever.
this tutorial walks the entire process with a realistic 14-row sample dataset of SKUs from a small ecommerce business. by the end, you will have a working turnover calculation, a dead stock list, and a clear answer about what to reorder. no NetSuite, no expensive ERP, just spreadsheets and 30 minutes.
the sample dataset
below is the dataset we will use. paste into Google Sheets, save as inventory-turnover-2026, and follow along.
| sku | product | unit_cost | retail_price | beg_inventory_units | end_inventory_units | units_sold_90d | revenue_90d |
|---|---|---|---|---|---|---|---|
| S001 | classic_tee_navy | 8 | 32 | 120 | 35 | 220 | 7040 |
| S002 | classic_tee_white | 8 | 32 | 100 | 28 | 195 | 6240 |
| S003 | classic_tee_red | 8 | 32 | 80 | 70 | 12 | 384 |
| S004 | hoodie_navy | 22 | 78 | 60 | 18 | 75 | 5850 |
| S005 | hoodie_grey | 22 | 78 | 50 | 12 | 70 | 5460 |
| S006 | hoodie_pink | 22 | 78 | 45 | 38 | 9 | 702 |
| S007 | cap_navy | 6 | 28 | 200 | 90 | 165 | 4620 |
| S008 | cap_white | 6 | 28 | 180 | 95 | 130 | 3640 |
| S009 | tote_canvas | 4 | 22 | 150 | 145 | 8 | 176 |
| S010 | scarf_winter | 12 | 48 | 80 | 78 | 4 | 192 |
| S011 | sticker_pack | 1 | 8 | 500 | 380 | 180 | 1440 |
| S012 | mug_logo | 5 | 24 | 120 | 92 | 42 | 1008 |
| S013 | jacket_premium | 38 | 145 | 30 | 9 | 32 | 4640 |
| S014 | belt_leather | 14 | 58 | 40 | 35 | 8 | 464 |
inventory turnover is the number of times stock cycles through your business in a given period. the standard formula is
units_sold / average_inventory, calculated as a multiple per year. healthy ecommerce ranges from 4-8 turns per year for fashion, 6-12 for accessories, 12+ for fast-moving consumables. the analysis takes 30 minutes in Sheets, classifies SKUs into reorder/discount/kill buckets, and consistently surfaces 20-40% of inventory tied up in dead stock that should be liquidated.
step 1: structure and add helper columns
paste data into A1:H15. add the following derived columns.
column I: avg_inventory
formula in I2:
=(E2+F2)/2
expected output for S001: (120+35)/2 = 77.5.
drag down.
column J: turnover_90d
formula in J2:
=G2/I2
expected output for S001: 220/77.5 = 2.84.
this is how many times the average inventory turned over in 90 days.
column K: annualized_turnover
formula in K2:
=J2*4
expected output for S001: 2.84 × 4 = 11.36 turns/year.
annualized turnover is the standard metric for cross-business comparison.
column L: days_of_inventory
formula in L2:
=(F2/G2)*90
expected output for S001: (35/220)*90 = 14.3 days.
at the current sales pace, you have 14 days of inventory left. for fast movers, 30-45 days is healthy. below 14 days is reorder territory.
common mistake: most solopreneurs use ending inventory instead of average inventory in the formula. that causes turnover to spike falsely whenever they happen to be near a stockout. always use the average.
step 2: classify SKUs by velocity
build a velocity tier column.
formula in M2:
=IF(K2>=12, "fast", IF(K2>=6, "medium", IF(K2>=2, "slow", "dead")))
expected outputs by SKU:
| sku | annualized_turnover | tier |
|---|---|---|
| S001 | 11.36 | medium |
| S002 | 12.19 | fast |
| S003 | 0.32 | dead |
| S004 | 7.69 | medium |
| S005 | 9.03 | medium |
| S006 | 0.43 | dead |
| S007 | 4.55 | slow |
| S008 | 3.78 | slow |
| S009 | 0.22 | dead |
| S010 | 0.20 | dead |
| S011 | 1.64 | dead |
| S012 | 1.58 | dead |
| S013 | 6.56 | medium |
| S014 | 0.85 | dead |
7 of 14 SKUs (50%) are dead stock by the standard definition (under 2 turns per year).
step 3: calculate dead stock cash impact
build a summary block.
| tier | sku_count | inventory_value | annual_revenue | turn_rate |
|---|---|---|---|---|
| fast | 1 | $224 | $24,960 | 12.2 |
| medium | 4 | $2,706 | $87,560 | 8.7 |
| slow | 2 | $1,110 | $33,040 | 4.2 |
| dead | 7 | $4,628 | $4,406 | 0.7 |
inventory_value formula:
=SUMIF(M:M, "dead", F:F) * AVG_unit_cost
dead stock represents $4,628 in tied-up cash returning $4,406 per year in revenue. that is $0.95 of revenue per dollar of inventory invested. if you sell at 60% gross margin, dead stock returns $0.57 in profit per dollar of cash tied up, and that is over a full year.
compare to fast-moving SKUs returning $111 in revenue per dollar of inventory cost.
dead stock cash recovered would buy 6x more fast-moving inventory.
step 4: build the reorder list
filter to SKUs with days_of_inventory < 21 and tier in (fast, medium).
| sku | tier | days_of_inventory | reorder_qty (60-day target) |
|---|---|---|---|
| S001 | medium | 14.3 | 147 units |
| S002 | fast | 12.9 | 130 units |
| S004 | medium | 21.6 | 50 units |
| S005 | medium | 15.4 | 47 units |
| S013 | medium | 25.3 | 21 units |
reorder_qty formula:
=ROUND((G2/90)*60 - F2, 0)
this is “60 days of expected demand minus current inventory.”
total reorder cost:
| sku | reorder_qty | unit_cost | reorder_cost |
|---|---|---|---|
| S001 | 147 | 8 | $1,176 |
| S002 | 130 | 8 | $1,040 |
| S004 | 50 | 22 | $1,100 |
| S005 | 47 | 22 | $1,034 |
| S013 | 21 | 38 | $798 |
| total | $5,148 |
if you liquidate the dead stock for 50 cents on the dollar, you recover $2,314, which covers nearly half the reorder cost.
step 5: build the discount list
dead stock that has any positive sales velocity (more than 0 sales in 90 days) is candidate for discount. dead stock with zero sales is candidate for liquidation or write-off.
| sku | tier | units_in_stock | inventory_value | suggested_action |
|---|---|---|---|---|
| S003 | dead | 70 | $560 | 30% off, 60-day clearance |
| S006 | dead | 38 | $836 | 40% off, 90-day clearance |
| S009 | dead | 145 | $580 | 50% off, bundle with bestsellers |
| S010 | dead | 78 | $936 | 60% off (off-season) or hold for season |
| S011 | dead | 380 | $380 | bundle as freebie |
| S012 | dead | 92 | $460 | 30% off |
| S014 | dead | 35 | $490 | 50% off or write off |
discount level should reflect inventory cost basis. a sticker pack at $1 cost can be given away in bundles. a leather belt at $14 cost needs deeper discount because the gross margin allows it.
step 6: calculate the inventory turnover trend
if you have multiple months of inventory snapshots, plot total turnover over time. healthy growth shows turnover stable or rising as the catalog matures. declining turnover means you are buying more than you sell.
| month | total_inventory_value | revenue | turnover_proxy |
|---|---|---|---|
| 2026-01 | $9,800 | $11,200 | 1.14 |
| 2026-02 | $10,400 | $12,100 | 1.16 |
| 2026-03 | $11,200 | $13,400 | 1.20 |
| 2026-04 | $12,800 | $13,200 | 1.03 |
april dropped. that is the first signal of inventory bloat. dig in before may.
step 7: dashboard the priorities
create a final summary block.
| action | sku_count | cash_impact |
|---|---|---|
| reorder this week | 5 | -$5,148 |
| discount/liquidate | 7 | +$2,314 (recovered) |
| net cash needed | -$2,834 |
the actionable output is one number: $2,834 in additional cash needed to keep fast-movers in stock through the next 60 days, after liquidating dead stock.
if cash is tight, the discount list is your bridge.
comparing inventory turnover benchmarks
| business type | healthy annualized turnover | red flag below |
|---|---|---|
| fashion (apparel, accessories) | 4-6 turns/year | 2 |
| home goods | 3-5 turns/year | 1.5 |
| beauty/cosmetics | 6-10 turns/year | 3 |
| food/beverage | 12-25 turns/year | 8 |
| electronics | 6-12 turns/year | 4 |
| fast-moving consumables | 12-20 turns/year | 8 |
| jewelry | 1-3 turns/year | 0.5 |
your benchmark depends on the SKU type, not just business type. a t-shirt should turn faster than a wedding dress.
our Shopify analytics complete guide for solo sellers covers the broader ecommerce metrics this turnover plugs into, and our ecommerce data analysis 2026 playbook provides the analytics framework around inventory.
frequently asked questions
what time window should I use?
90 days is standard for solopreneurs. shorter (30 days) is too noisy. longer (180+ days) hides recent demand shifts.
how do I handle seasonal SKUs?
calculate turnover only over the in-season period. a swimsuit sold in June through August should have its turnover measured June-August, not annualized.
what counts as dead stock?
industry rule of thumb: under 2 annualized turns. some businesses use under 1. others use “no sales in 60 days.” pick a definition and stick to it.
should I include in-transit inventory?
yes if it is paid for. no if you are operating drop-ship or pre-order. always be consistent with the definition.
how often should I run this?
monthly for active inventory management. quarterly minimum.
conclusion: build the list this weekend
inventory analysis is one of those tasks solopreneurs procrastinate on because it feels accounting-heavy. it is not. it takes 30 minutes and surfaces $2-5K in tied-up cash that you can recover within 30 days.
start this weekend. export your SKU list with units sold over 90 days, beginning and ending inventory, and unit cost. paste into the schema above. flag dead stock, build the reorder list, build the discount list. you will find one or two SKUs you forgot you bought and one bestseller you are about to run out of. fixing both pays for the analysis 10x over.
for next steps, our pricing analysis tutorial covers the price-discount math that drives liquidation decisions, and our ROAS analysis tutorial connects ad spend to inventory velocity. measure, sell through, reorder.