Finding dead stock in Shopify starts with the full inventory catalog, a clearly documented sales window, and reliable unit costs. Use Shopify's inventory reports as supporting evidence, then reconcile the exports by variant before deciding which items need action. A short reporting window or a missing row is not proof that an item cannot sell.
What Shopify's Reports Can and Cannot Tell You
Shopify offers several native inventory reports, including Month-end inventory value, ABC product analysis, and Products by sell-through rate. Confirm the reports and export options available to your store and account permissions.
Month-end inventory value multiplies cost per item by ending available quantity. ABC product analysis also includes total value at cost and at price. Neither figure is a guaranteed resale value or cash-recovery estimate.
Each report has a different purpose and observation window. ABC uses a fixed, rolling 28-day revenue window that cannot be changed. The sell-through report has its own displayed dates and processing delay; Shopify documents its calculation using the most recent available 30-day period. Do not treat either report as a twelve-month sales ledger.
The important gap
Shopify's sell-through and percentage-sold reports include variants that sold at least once before or during the reporting period. Never-sold items can be absent. Start from the complete catalog so missing sales rows remain visible for investigation.
Step 1: Choose a Sales Window and Record Its Limits
Choose a window that reflects your buying cycle. Twelve months can help evaluate seasonal apparel or gift inventory, while a faster-turning category may use a shorter period. This is a review policy, not a universal definition of dead stock.
Record the start date, end date, store locations, channels, and extraction time. Confirm whether your export covers that whole period. If your store or source does not provide the required history, mark the item as data-incomplete rather than treating the missing time as zero sales.
A September review of winter merchandise should account for the previous winter and the next selling season. An item can have no summer sales and still be useful inventory.
Step 2: Export the Complete Catalog and the Sales Evidence
Export the product and variant catalog together with current inventory quantities for the locations in scope. Preserve a stable variant identifier where the export provides one. Keep SKU, product name, variant options, inventory location, and unit cost alongside that identifier.
Separately export item-level sales or order-line data covering your chosen window using the reports and export options available in your store. Preserve the period and filtering rules. Reconcile returns, canceled orders, test orders, and quantities according to a documented method instead of combining incompatible totals.
Join the sales evidence onto the full catalog, keeping every catalog row. A sales-only export can omit items with no sales. Use variant identifiers rather than product names; blank or reused SKUs need a separate check before they can safely serve as a join key.
Record three different outcomes: a verified sales quantity, verified zero sales within the covered window, and missing or unmatched evidence. Only the first two are observations. The third requires follow-up.
Step 3: Use ABC and Sell-Through as Cross-Checks
Open ABC product analysis to understand recent revenue concentration. Shopify assigns A, B, and C grades: the groups collectively contribute the first 80%, next 15%, and final 5% of revenue. There is no D grade in this report.
A C grade does not establish dead stock. The fixed 28-day window is too short for many seasonal decisions, and revenue contribution is different from profit, inventory age, or future demand. Compare archived exports if you have them; the native ABC report cannot be switched to a matching period last year.
Use Products by sell-through rate for a separate recent-performance check. Shopify defines the rate as units sold divided by units sold plus ending inventory for the relevant period. Read the report's actual dates, allow for processing delay, and note that never-sold variants may be absent.
When these reports disagree with your catalog-and-sales join, investigate the dates, locations, returns, and variant matching. Do not force them to agree by deleting unmatched items.
Step 4: Separate Recovery Candidates From Uncertainty
For this review, a dead-stock candidate has stock on hand, evidence that it was available to sell, and no recent sales across a sufficiently observed window. Prior sales help establish the item's trading history. Zero observed sales alone does not establish physical stock age or prove that liquidation is the right decision.
Slow movers still sell, but at a pace that deserves review relative to stock, margin, seasonality, and shelf space. Newly introduced items, items with missing history, and stock that was unavailable for much of the window belong in separate review groups.
A worked example
Suppose a boutique has 312 stocked variants with no matched sales rows. That is a reconciliation queue, not 312 proven dead-stock items. The owner first resolves missing identifiers and confirms the sales window. Next, the owner separates new arrivals, stockouts, seasonal items, and sales recorded outside Shopify. Only the remaining well-supported candidates move to recovery planning.
This example illustrates the method; it is not a measured customer result or a forecast of what your store will recover.
Step 5: Put a Cost Figure Beside Each Supported Candidate
Use verified unit cost and the relevant on-hand quantity to calculate inventory cost basis. Month-end inventory value can support a historical month-end comparison, but its available quantity excludes incoming and committed units. Do not combine a historical quantity with a current cost without identifying the difference.
Join value evidence by variant and location where possible. Check missing costs, duplicate identifiers, and negative quantities before totaling the column. A missing cost is unknown, not zero; a negative balance needs reconciliation.
For example, 12 verified units at a cost of $18 each represent $216 of inventory at cost. They do not establish that a buyer will pay $216. Expected sale proceeds must be evaluated separately after discounts, fees, freight, and other costs.
Step 6: Rule Out False Positives
New products and recent receipts
A variant creation date tells you when the catalog record was created, not when every unit arrived. Check purchase orders, receipts, and inventory history before judging how long the physical stock has had to sell.
Stockouts and untracked inventory
An item unavailable for much of the period has not had a fair sales opportunity. Review inventory adjustments and available historical snapshots. Shopify's inventory-based history has limits, including deleted-location coverage; a missing interval should remain unknown.
Sales outside the connected channel
Wholesale invoices, pop-up sales, consignment, and other systems may be outside your Shopify export. Reconcile those channels before treating the Shopify quantity as the store's complete demand history.
Seasonal demand and condition
Review the next relevant selling season, damaged goods, returns, and any assortment changes. A product's recent sales pattern does not replace an owner inspection or a category-specific decision.
Step 7: Rank the Reviewed List and Choose Actions
Rank supported candidates by inventory cost basis, then consider expected margin, sale likelihood, shelf space, and effort. Large balances deserve attention, but the largest cost figure does not automatically justify the deepest discount.
For each candidate, document an owner-approved action: a measured markdown, a suitable bundle, a supplier-return discussion, or a liquidation review. Include a minimum acceptable net return and a date to reassess. Healthy, new, and data-incomplete items should not receive automatic recovery actions.
Compare actual results with the baseline: units sold, net proceeds after costs, and quantity remaining. An unsuccessful markdown is useful evidence, but it does not prove that a larger discount or liquidation will work.
Where CMP Helps
Cash Margin Partners offers read-only Shopify, Square, and Lightspeed Retail X-Series connections where production launch status and workspace eligibility permit. Lightspeed is a capacity-managed X-Series custom application, excluding R-Series, eCom, and Restaurant. Compatible item-level uploads remain available after column review; Clover uses that export path, not a native connection. Shopify supplies unit cost when available; Square and Lightspeed analyses add costs through CMP's prefilled template.
After a successful import, CMP uses the available inventory, sales, and cost evidence to identify eligible recovery candidates and show data gaps. Directional inventory-risk estimates require sufficient usable history and a recent successful supported live connection. They support owner decisions and do not guarantee sales or recovery prices.
The free five-step calculator provides a directional trapped-cash estimate from questionnaire answers. A separate free workspace supports SKU-level analysis after a supported connection or compatible item-level upload.
Make the Review Repeatable
Keep dated exports, the scope of each sales window, and your matching rules in secure business storage. Re-run the review before important buying decisions and after a meaningful change in inventory or sales. Compare like-for-like periods and explain changes in source coverage.
Track cost coverage and unresolved items alongside any recovery total. A smaller well-supported number is more useful than a larger number created by assuming every missing sale, cost, or date is known.
Frequently Asked Questions
Does Shopify have a dead stock report?
Shopify provides inventory value, ABC, sell-through, and other reports. Identifying dead-stock candidates requires reconciling the full catalog with sales, availability, costs, and a suitable observation window. A single recent-performance report is not enough.
What counts as dead stock in Shopify?
A dead-stock candidate has inventory on hand and no recent sales across a sufficiently observed window, with evidence that it was available to sell. Seasonal items, new receipts, missing history, and external sales need separate review before an owner chooses a recovery action.
Which Shopify plan do I need for inventory reports?
Check the reports and export options available to your Shopify plan and account permissions. The method requires a complete catalog and sufficiently detailed sales, inventory, and cost evidence; do not assume every report provides the same history or fields.
How long should the measurement window be?
Choose a window appropriate to the category and buying cycle, and confirm that the source actually covers it. A seasonal review may need twelve months of sales evidence. Shopify's fixed 28-day ABC report and recent sell-through calculation cannot substitute for that longer history.
Can I use ABC product analysis to find dead stock?
Use it as supporting evidence. Shopify's A, B, and C grades describe revenue contribution over a fixed rolling 28-day window. A C grade is not proof of dead stock, and the native report's timeframe cannot be changed to a prior-year comparison.
Why are some never-sold items missing from sell-through reports?
Shopify documents that sell-through and percentage-sold reports display variants that have sold at least once before or during the reporting period. Reconcile these reports against the complete catalog so absent items remain visible for investigation.
Is inventory at cost the amount I can recover?
No. Inventory cost basis describes the amount invested in the stock. Actual net recovery depends on sale prices, discounts, fees, freight, condition, and buyer demand. Evaluate those separately and retain uncertainty when evidence is missing.
