Inventory Aging Report for Shopify: Find Slow-Moving Stock Before Dead Stock
An inventory aging report groups every SKU by how long the current units have been held, counted from the receipt or lot date of those units. You then rank the next move: promote, bundle, markdown, or stop reordering.
Shopify’s default inventory reports give you on-hand quantity, inventory value, sell-through, and days of cover. They do not bucket remaining units by receipt date. You assemble that aging view from inventory exports, cost per item, and receipt activity.
What an inventory aging report actually shows
Inventory age is the hold time of the units still in stock. The clock starts when those units were received (a purchase receipt, a transfer marked received, or another inbound lot). If several lots remain, age each remaining unit from its own receipt date. A conservative SKU-level age is the oldest remaining lot.
Keep three nearby numbers on the same row, and do not treat them as age. Days since last sale is demand staleness. Sell-through rate is the share of stock that sold in a period. Days of inventory remaining is cover: how long available units last at recent daily sales.
A SKU can sell this week and still hold 90-day-old units. Another SKU can have a last sale 40 days ago and still hold fresh inbound stock. Age tells you how long cash has been sitting. Velocity tells you whether that cash is clearing.
Bucket remaining units into 0-30, 31-60, 61-90, and 90+ days. Attach available units, cost per item, inventory value, sell-through, and days remaining. The report then answers three operator questions: which SKUs are aging, how much money sits in each band, and what to do next.
Age without cost and velocity is just a list. Age plus those two fields is a work queue.
Fields and formulas to put on the sheet
Use Available quantity for aging and value. Shopify defines Available as inventory you can sell (not committed to open orders and not set aside as Unavailable). Incoming transfer units have not been received, so they have no age yet. Committed units are already spoken for.
- Inventory value = Available units × cost per item. This matches the idea behind Shopify’s Month-end inventory value report, which multiplies ending Available quantity by cost per item.
- Age (days) = report date − receipt date of the remaining units. Split mixed lots by receipt. If you only have one inbound date, label that row as an approximation.
- Age band = 0-30, 31-60, 61-90, or 90+.
- Sell-through rate = units sold ÷ (units sold + units still in inventory). Shopify documents this formula on the Products by sell-through rate report.
- Days of inventory remaining = ending quantity ÷ average units sold per day over the last 28 days, from Inventory remaining per product. Shopify sets this to N/A when the variant had no sales in the window.
Fill cost per item on every tracked variant before you trust the value column. A blank cost makes a high-age SKU look cheap.
How to build the report in Shopify
Build one spreadsheet. Pull quantity and cost from exports, pull velocity from inventory reports, then date the remaining units from receipt activity.
1. Export current units
In Shopify admin, go to Products > Inventory and click Export. Shopify’s inventory CSV guide recommends the All states format. That file includes Handle, Title, Location, SKU, Available, and On hand. Export all variants, or the variants that match a search if you are reviewing one vendor or collection.
2. Export cost per item
Go to Products and click Export. Choose all products (or the same filtered set) and a spreadsheet CSV. Shopify’s product CSV includes SKU and Cost per item. Join this file to the inventory export on Handle plus option values, or on SKU if every variant has a unique SKU.
3. Pull sell-through and days remaining
Go to Analytics > Reports, open the Category filter, and choose Inventory. Open Products by sell-through rate and note the date range printed at the top of the report. Shopify states the most recent window this report can return is about two days before the current date. Open Inventory remaining per product in the same list and copy days of inventory remaining onto the sheet.
A variant appears on Products by sell-through rate only if it sold at least once before or during the selected period. Quantity sold in that report does not include returns, manual adjustments, or transfer receipts. Historical inventory metrics in these reports start on October 1, 2023.
4. Date the remaining units from receipts
Shopify does not store a native lot-age column on standard inventory. Reconstruct receipts from adjustment activity.
On a product (or variant) page, confirm Inventory tracked is on, then click View adjustment history. Shopify’s adjustment history shows the last 180 days. Look for inbound activities such as Inventory received (the Received reason) and Transfer created (units added when an incoming transfer is marked received). For older activity, open the Inventory adjustment changes report and filter by SKU, location, and adjustment reason.
Assume FIFO unless you actually pick newest units first. Walk receipts from newest to oldest until they cover Available units. Those receipts are the lots still on the shelf. Age each remaining quantity from its receipt date. If history is missing, mark Age unknown and rank that SKU by inventory value and sell-through instead of inventing a date.
5. Bucket, value, and sort
Add Age (days) and Age band. Calculate inventory value. Sort 90+ first by inventory value, then 61-90. That list is the week’s work queue.
A worked FIFO example
These figures are a worksheet layout, not a benchmark. Variant Canvas Tote / Black has 80 Available units at $6 cost ($480 of inventory value). Receipts, newest first: 50 units 20 days ago, 100 units 75 days ago, 40 units 140 days ago.
Under FIFO, the 80 remaining units are 50 from the 20-day receipt and 30 from the 75-day receipt. Split the row: $300 in the 0-30 band and $180 in the 61-90 band. The oldest remaining lot is 75 days. If you only stored “last received = 20 days ago,” you would understate the leftover lot.
| SKU | Oldest remaining lot | Age band | Available | Inventory value | Sell-through | Days remaining | Next move |
|---|---|---|---|---|---|---|---|
| Canvas Tote / Black | 75 days | 61-90 (plus a 0-30 lot) | 80 | $480 | 38% | 140 | Promote, then pause the next inbound |
| Canvas Tote / Sand | 18 days | 0-30 | 40 | $240 | 82% | 16 | Protect cover; check lead time |
| Canvas Tote / Olive | 142 days | 90+ | 90 | $540 | 11% | N/A | Markdown this week; do not reorder |
Sand is young stock that is clearing. Olive has been held past 90 days with almost no sell-through. Black is the mixed-lot case: some units are fresh, some are already in the 61-90 band, and 140 days of cover means another purchase order would add age on purpose.
How to choose promote, bundle, markdown, or stop reordering
Read age, value, sell-through, and cover together. Then assign one action per SKU. Do not run a store-wide sale to fix one leftover colorway.
- Promote when age is rising, sell-through is weak, and traffic or collection position is the likely cause. Move the variant higher in its collection or feature it on the home page before you cut price.
- Bundle when the listing already gets traffic, the leftover is a size or color, and a hero SKU can carry it. Pair the aged variant with a faster seller using a Buy X get Y or amount-off discount from Discounts in Shopify admin.
- Markdown when the SKU is in the 90+ band, days remaining are long or N/A, and promotion already failed or was never realistic. Create a dated, SKU-specific percentage or amount-off discount. Recalculate sell-through after the window closes.
- Stop reordering when aged value is high and sell-through has stayed low across two review periods. Cancel or delay the next supplier order. Leave Available units to clear; do not refill a 90+ band.
Leave A-grade cover alone when age is low and days remaining are shorter than lead time. That SKU is a reorder problem, not a dead-stock problem. Young stock with high days remaining is an overbuy. Freeze the next PO now, before those units roll into 61-90.
Aged units still cost money after you stop buying. Storage, insurance, and markdown risk sit in inventory carrying cost. Rank clearance by inventory value so the first markdown hits the most expensive shelf space.
A weekly pass that turns the report into actions
Rebuild the sheet weekly for SKUs that hold real cash. Monthly is enough for the long tail.
- Confirm cost per item is filled on anything received this week.
- Refresh Available units and re-age lots from new receipts.
- Open the 90+ band, sorted by inventory value.
- Write one action on each of the top five rows: promote, bundle, markdown, or stop the PO.
- Check incoming purchase orders and transfers. Delay any inbound that would push a slow SKU further into 90+.
- Recheck sell-through after a promo ends, not while the discount is live.
Between those passes, watch cover and inbound timing so a leftover SKU is not refilled by habit. Stock intelligence that monitors on-hand units and flags reorder risk can surface a refill before it lands. The aging report still decides whether that refill should happen.
Export inventory and cost today. Age the five SKUs with the highest Available value. Put one action on each row before the next shipment is confirmed.