The Reports page gives you ready-to-use reports for buying, stock, and accounting decisions. Each has its own filters and a CSV export, and any of them can be scheduled to arrive by email or Slack. Pick a report from the menu at the top.
Report types
Sales - units and revenue sold and refunded from your sales history, with margin estimated at each item's current cost. Group it by product, variant, vendor, or location: By product shows one row per product with a Variants count - click the count to see that product's variants without leaving the report - and By variant is the flat one-row-per-variant view. Numbers come from up to 2 years of orders, refreshed nightly. Use Columns to add Available and Incoming, so one row shows what sold, what is left on the shelf, and what is already on order - the three numbers you need to avoid re-ordering something that is on its way. Both are always in the CSV. They are as of today rather than the date range, and they match the Stock on hand report for the same row. Sales also takes an All locations filter, and it scopes both sides of the row - the units sold at that location beside the stock actually sitting there. To reorder straight from the report, use the By product view: tick the products you want and click Create purchase order. Stockroom creates one draft per supplier with those products on it (one unit each, costs prefilled) and opens it for you to set quantities - the same action as on the Inventory page, so filtering by vendor first gives you a supplier's sales for the period and a draft to them in two clicks. Products with no vendor set in Shopify are listed as skipped rather than dropped silently.
Margin - what you actually made: net revenue against cost of goods, ranked by gross profit, with margin bands, a below-threshold flag list, GMROI, and sell-through. Uses your real receipt costs where costing history covers the sale, or each item's current cost. See The Margin report for the full guide.
ABC analysis - every item graded A, B or C by its share of revenue: A is the items making up the top 80%, B the next 15%, C the rest. Items with no sales in the window stay ungraded rather than being called C. Grades refresh nightly and show as badges on products, purchase orders, and reorder suggestions, so buying attention goes where the revenue is. Marked Early access.
Stock on hand - your current stock position and its value at cost, grouped by product (one row per product, with the same clickable Variants count as Sales), by variant, vendor, or location. A live read of today's inventory, handy for month-end. Group it By vendor for the units and value behind each brand - the tiles on the Inventory page count products rather than quantity, so this is the report to use when you want a brand's real number on hand. Negative stock counts here: an item sitting at -1 comes off the Available total. It never reduces the value columns, though - oversold stock is a counting mistake, not negative worth. Use Columns to show On hand beside Available: Available is what you can sell, On hand is what is physically on the shelf, and the two differ by whatever Shopify has committed to orders that have not shipped yet.
Variants - every variant in your catalog as its own row, in catalog order so a product's sizes sit together: cost, price, available, incoming, and net units sold in the window. Zero-stock rows are included on purpose - the sizes you cannot sell are the ones worth seeing. Search by title, SKU, or barcode, and use Columns to add Vendor, Barcode, Value at cost, Value at retail or ABC grade; the CSV always carries all of them. With barcode and grade in one file, this export can feed a scanner or a label tool straight from a grade filter in your spreadsheet - the ABC analysis report carries a barcode column too, so either report works.
Stock on hand by date - your stock position and its value at cost on any past date, rebuilt from receipts, sales, adjustments, and counts under FIFO or weighted average - the year-end bookkeeping number. History reaches back to your costing start date, and figures are per item across all locations.
Dead stock - stocked products that barely sold in the window, sorted by the value tied up. Your clearance-planning list. Set the window and a "sold at most" threshold; the default window is 90 days. Products added to Shopify during the window are left out - a new product with no sales yet is new, not dead.
Out of stock - active tracked variants with nothing available at any location. Cannot be bought is the default view and answers the real question: what can nobody buy right now. Still selling (oversell on) lists the ones Shopify is letting shoppers order anyway, and All out of stock shows both. Variants whose oversell setting has not synced yet are marked Unknown and counted separately rather than guessed at.
Projected shortfall - items on track to run short within your horizon at current sales rates, after counting incoming purchase orders by their expected dates. "Short" means incoming stock does not recover it in time - items a dated PO catches are shown as covered, not short.
Vendor purchase history - purchase orders per supplier: order counts, units ordered and received, and spend, with Returns, Credit and Net beside it so stock sent back never quietly shrinks what you spent. Totals are kept separate per currency, and imported Stocky history counts.
Supplier performance - how each supplier delivers on the window's orders: on-time %, average lead time and how much it varies, fill rate, rejected units, and the drift between agreed and invoiced costs. Each row links to the supplier's page.
Receipts - every receipt line in the period: what arrived, when, from which supplier and purchase order, at the costs booked when receiving. A Direction column separates deliveries from stock shipped back to a supplier, and returned units and value are split out of the totals. Set the dates to a month for a month-end receiving log. Use Columns to add Vendor, Product type, Variant or PO status to the table; the CSV always includes all of them whatever the table is showing. For a summary you can hand to accounting, switch the Group selector to One row per delivery: each delivery on one line with its received date, purchase order, supplier, invoice number, units and landed total. The CSV export and scheduled email follow whichever view is selected.
Landed cost - what received stock actually cost, including each receipt's share of shipping, duties, and fees, grouped by supplier, product, PO, vendor, or product type. Grouping by vendor or product type answers "what did we spend on this brand or category" without a spreadsheet.
COGS - cost of goods sold and ending inventory value from your real receipt costs, under FIFO or weighted average. See The COGS report for the full guide.
Inventory roll-forward - the accountant's tie-out, read left to right: opening + received + restocked + adjusted - returned - COGS = ending, valued from your real receipt costs under FIFO or weighted average. Month-end reconciliation against your books starts here.
Inventory movements - every stock movement in the window as its own row: receipts, sales, restocks, adjustments, stocktake corrections, transfers, and returns to suppliers, each valued at what the costing method booked - so a window's rows sum to the roll-forward's columns. Filter it to one movement type.
Adjustments - what was written off or corrected, grouped by reason and location and valued at what the costing method booked - the shrinkage number a bookkeeper needs for the write-off entry, biggest write-off first. Stocktake corrections get their own row; for line-by-line detail, use Inventory movements or the export on the Adjustments list.
Last counted - when each stocked item was last physically counted at each location, stalest first - never-counted items lead. Your cycle-counting worklist: you can start a stocktake scoped to the least recently counted items straight from it.
Filters and export
Depending on the report, you will have a From/To date range, a Group selector, a Sold at most threshold (dead stock), a Horizon (projected shortfall), an As of date (stock on hand by date), a Cost basis and a "Flag at or below %" margin threshold (Margin), or a Method (Margin, COGS, Stock on hand by date, Inventory roll-forward, Inventory movements, and Adjustments). Inventory movements also filters by movement type. When a report has rows, click Export CSV to download it - each report brings its own columns.
Nearly every report also takes an All vendors, an All product types and an All tags filter. Pick any of them to narrow the report to those products, and the rows, the totals and the CSV all narrow with them - so a filtered export still agrees with what is on screen. The tag filter matches whole tags only, so “aa” never matches a product tagged “aa-extra” - handy when a tag defines an agreed set of products, like the items one supplier replenishes for you. Combine them with Group to answer a specific question: on Landed cost, filter to one vendor and group By product type to see what you spent per category with that supplier over the date range. Supplier performance is the one report without these filters, because on-time delivery and lead time are facts about a purchase order rather than about a product.
Vendor and product type are read from your Shopify catalog as it stands today, not as it was at the time of the receipt or the sale. If you recategorise a product, past receipts follow it to its new vendor and type - which is what you want when reviewing what you buy by category, but worth knowing if you are matching a report against an old invoice.
On a big catalog, the table and the export are deliberately not the same thing. A report lists its top 500 rows so the page stays readable, and tells you underneath when there are more than that. The totals above the table always cover the whole report, and Export CSV gives you every row behind them - so if you are reconciling to your accounts, work from the export and the figures will agree.
Schedule a report
Click Schedule to have the current report delivered on a cadence - as a CSV attachment by email, a Slack message, or both. Choose Daily, Weekly, or Monthly and a send hour; weekly sends Monday, monthly on the 1st, in your store's timezone. The schedule remembers the filters you had set, and date windows roll forward automatically - a monthly Receipts schedule always covers the month just ended.
A report with nothing to say sends nothing - the schedule stays quiet until there are rows. Slack delivery uses the same connection as stock alerts (see Stock alerts by Slack and email).
If your stock totals do not match Shopify
The Stock on hand report and Shopify's own inventory figures are both right, and they usually differ for one of two reasons. Both are worth checking before you go hunting for a sync problem.
Available is not the same as on hand. The report leads with Available, which is what you can still sell. Shopify's inventory reporting quotes what is on hand. The gap between them is stock committed to orders that have not shipped yet - it is on your shelf, but it is already sold. Use Columns to show the On hand column and you can read both figures side by side.
Active products are counted by default. Stock sitting on draft or archived products is left out unless you ask for it, because the question the report answers out of the box is what you can sell and what that is worth. Shopify counts those units. If you have a rack of samples or a season's products still in draft, that alone can be a few hundred units. Use the Status filter above the table to switch between Active, Draft, Archived and All statuses - the rows, the totals and the CSV export all follow it.
One thing to know when you do switch it: the Stock value on the Inventory page always counts active products only. So on any setting other than Active, the value on this report is deliberately a different number, and the report says so underneath the table.
One more thing worth ruling out: locations you have hidden in Stockroom are excluded from stock reports entirely, and the All locations filter narrows the report to one location while Shopify's figure covers them all.
Good to know
The Sales report needs your sales history, which builds automatically after install. If it is still importing, the report tells you and fills in within a few minutes.
Revenue tracking began July 10, 2026 - on stores installed before then, earlier dates may show units without revenue.
Spend and value figures are kept separate per currency and never blended.
A schedule remembers the vendor, product type or tag filter that was set when you created it, and the email and Slack message name that filter - so a recurring report is never mistaken for your whole catalog.
Reports are also in the Stockroom web app at go.stockroom.app - the same reports, filters, CSV exports and schedules as in the Shopify admin, so your team can read them without a Shopify login.
More reports are on the way - tell us what you want to see.
For an overview of alerts and reporting, see Alerts & reports on stockroom.app.


