# Inventory and stock movements reports

See what stock is worth, what is running low or not selling, and trace every stock movement down to the single receipt, sale or adjustment.

Source: https://getolet.com/resources/help/analytics/inventory-and-stock-movements-reports/
Updated: 2026-10-15

# Inventory and stock movements reports

Two reports cover stock. The **Inventory report** is a snapshot of what you hold right now. The **Stock movements report** shows how stock moved over a period. Both are under **Analytics**. For the date presets, **Apply** and CSV basics, see [Reports overview](/resources/help/analytics/reports-overview/). For the stock itself, see [Inventory overview](/resources/help/inventory/inventory-overview/).

## Inventory report

Open **Analytics**, then **Inventory report**.

The report is live, so it has no date range. The header says "As of" and the time. The filters are **Outlets**, **Categories** and **Brands**. Select **Apply** after changing them. They apply to all three tabs and to the cards.

### Cards

| Card | What it means |
| --- | --- |
| **Stock value** | "On-hand units at average cost, or supply price when there is no average cost. Stock below zero counts as 0." If some items have no cost, a line says how many, for example "3 items have no cost". |
| **Retail value** | "On-hand units at retail price, excluding tax." |
| **Out of stock** | "Active items at zero or below, counted once per outlet." |
| **Dead stock value** | "Cost value of stock with no sale in 90 or more days, including items never sold." This card always uses 90 days, whatever the **Dead stock** tab is set to. |

### Stock on hand

The default tab. Use the **Group by** list above the table: **Product** (the default), **Variant**, **Category**, **Brand** or **Outlet**.

| Column | What it means |
| --- | --- |
| **Product** (or the group name) | The name, with SKU and an **Inactive** tag where it applies. Select it to open the product in a new tab. |
| **Category** | Shown when you group by product or variant. |
| **On hand** | Units in stock now. A red **Below zero** tag marks stock that went negative. |
| **Cost value** | On-hand units at average cost, or supply price if there's no average cost. |
| **Retail value** | On-hand units at retail price, before tax. |
| **Margin** | The gap between retail and cost value, as a share of retail value. |
| **Share of stock value** | The row's cost value as a share of the total. |

The table opens with the highest **Cost value** first, and ends with a **Total** row. Stock below zero comes from overselling or from items you don't track. It counts as zero in the values, and a "Some stock is below zero" notice says how many records are affected.

### Running low

Lists products that are out of stock or low at one or more outlets. The **Status** column reads like "Out at 2 outlets", "Low at 1 outlet" or "Out at 1, low at 2". The table opens with the most outlets out first.

- **Out** means on hand is zero or below.
- **Low** means the product has a reorder point, and on hand plus stock already on order is at or below it.

Columns: **Product**, **Category**, **Status**, **On hand**, **On order** (open purchase orders) and **Reorder point**. Select the chevron to see each outlet on its own line, with an **Out of stock** or **Low stock** tag, its own on-hand (negative numbers show as they are), on order and reorder point. The reorder point shows a dash for an outlet with no rule.

If you can manage purchase orders and your plan includes reorder points, an **Open reorder list** button takes you to the reorder list. See [Reorder list](/resources/help/inventory/reorder-list/). When nothing qualifies, the tab says "Nothing is out of stock or below its reorder point."

### Dead stock

Lists stock that has sat unsold. Use the **No sales in** list: **30+ days**, **60+ days**, **90+ days** (the default) or **180+ days**.

Columns: **Product** (with an **Inactive** tag if it applies), **Category**, **On hand**, **Cost value**, **Retail value**, **Last sold** and **Days since sale**. Items that have never sold show "Never", and sort as the oldest. Only items with stock on hand are listed. When there are none, the tab says "No stock without sales in 90 or more days." (with the number you chose).

### Row limit and export

Each tab holds up to 20,000 rows. Beyond that, a "Showing partial results" notice says "Showing the first 20,000 of" the total items, and suggests narrowing the outlets, categories or brands.

**Export CSV** saves the tab you're on, in the same columns, with the "as of" time at the top and a **Total** row on **Stock on hand** and **Dead stock**. The **Running low** file has one line for each outlet and product, with **Outlet**, **Status**, **On hand**, **On order** and **Reorder point**.

## Stock movements report

Open **Analytics**, then **Stock movements report**. It answers "where did this stock go?" by listing every change to stock and letting you drill from a category down to one movement.

### Filters

- **Date range**: opens on yesterday.
- **Group by**: **Category** (the default), **Day**, **Week**, **Month** or **Movement type**.
- **Categories**, **Brands**, **Product** (type at least two letters, then pick one), **Outlets**, **Staff**, **Movement type** and **Reason**.

Select **Apply** after changing a filter.

### Reading the table

Each row is a group. Select its chevron to open what's inside it.

- Grouped by **Category**: category, then product, then SKU, then the single movements.
- Grouped by **Day**, **Week** or **Month**: the period, then the products, then SKUs and movements.
- Grouped by **Movement type**: the type, then products, then SKUs and movements. For adjustments and stock counts, the reasons come between the type and the products.

The first column is named for the level you're looking at, such as **Category**, **Product**, **Period**, **Movement type** or **Reason**. Rows load 100 at a time. A "Load 100 more" button shows how many are left.

The columns count units, and every figure shows what came in as +, over what went out as −:

| Column | Moves counted |
| --- | --- |
| **Received** | Stock received from purchase orders |
| **Sold** | Register sales |
| **Returns** | Customer returns (in) and supplier returns (out) |
| **Online sold** and **Online returned** | Sales and returns on your online store |
| **Transfers** | Transfers between outlets, in and out |
| **Adjusted** | Manual adjustments |
| **Counted** | Corrections from stock counts |
| **In / Out** | Everything in, over everything out |
| **Net** | In minus out |

A **Total** row sits at the bottom. A dash means nothing moved in that column.

At the SKU level, expand a row to see the individual movements: when, the movement type, the quantity, and under it the outlet, reason, staff member, source and note. These add up to the row above them.

Sorting works on the headings. Day, week and month views read in date order by default. The other views start with the most units moved.

When nothing matches, the report says "No stock moved for these filters."

### Export

The **Export** menu has two files:

- **Summary (CSV)**: one line for each SKU for your current filters, with **Category**, **Product**, **SKU**, a column for each kind of movement (**Received**, **Sold**, **Customer returns**, **Supplier returns**, **Online sold**, **Online returned**, **Transfers in**, **Transfers out**, **Adjusted in**, **Adjusted out**, **Counted in** and **Counted out**), then **Units in**, **Units out** and **Net**. Up to 20,000 SKUs. A line at the top says if there were more. The filters you used are listed at the top of the file.
- **Movements (CSV)**: every single movement of one product, all of its SKUs, newest first. It's off until you pick a **Product** and select **Apply**. Until then the menu item reads "Movements (CSV): pick a product". Up to 20,000 movements. Columns: **Date**, **Time**, **Outlet**, **Product**, **SKU**, **Movement type**, **Direction**, **Quantity**, **Reason**, **Staff**, **Source** and **Note**. Times are in your store's time zone.

If an export fails, a message says "Failed to export stock movements".

## If the numbers look wrong

- **Stock value looks low.** Items with no cost count as zero. The **Stock value** card tells you how many.
- **Stock on hand differs from a product page.** The Inventory report floors negative stock at zero in its values. The product page shows the real number.
- **An item is missing from Running low.** It needs a reorder rule to count as low. It can still be out of stock without one.
- **Net on the movements report isn't your on-hand.** It only covers the dates and filters you set.
- **A movement is on the wrong day.** Movements count on the day they happened.
