> ## Documentation Index
> Fetch the complete documentation index at: https://muveya.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Physical counts

> Count what is really on the shelf, follow what is due and in progress, run warehouse count campaigns and turn differences into corrections

A **count** compares what a box physically holds with what muveya says it holds. When they differ, saving the count writes a correction to the stock ledger, or sends it for approval when the difference is large. muveya gives you three tools:

* The **quick count** (`/inventory/count`): count every box of one supply in one warehouse.
* The **Counts** screen (`/inventory/counts`): what is due to be counted, counts in progress and how far counts differ from the records.
* **Count campaigns** (`/inventory/count-campaigns/` followed by the campaign): count a whole warehouse and follow its coverage.

## Who can do it

| Action | Permission (console label) |
| - | - |
| See the **Counts** screen, a campaign and the differences | `inventory.read` (**View inventory**) |
| Start, save and cancel counts; start and close campaigns | `inventory.adjust` (**Adjust and count stock**), plus `inventory.read` to load the boxes |
| Approve a difference above the threshold | Another member with `inventory.adjust` (see [Stock corrections](/docs/en/inventory/corrections)) |

Everything is limited to the warehouses your team access reaches. Permissions are explained in [Roles and permissions](/docs/en/account/roles-and-permissions).

## How a count works: the measurement window

A count has two moments. **Starting** it records, for each box, the quantity muveya expects (the **Expected** column): the box's on-hand quantity at that instant. **Saving** it states what you measured and confirms that nothing went in or out of the boxes while you counted.

Between those two moments muveya watches each box. If the box has any physical movement (a receipt, a use, a move, a separation, a pick, a dispatch, a return, a correction, a quarantine, an expiry or a disposal), the count no longer describes the shelf and cannot be saved: you must start again and measure again. Reserving or releasing units for an order is not a physical movement and does not affect the count.

```mermaid theme={null}
flowchart LR
  A[Start counting] --> B[Expected quantity recorded]
  B --> C[Measure the boxes]
  C --> D[Confirm nothing moved and save]
  D --> E{Did the box move meanwhile?}
  E -- Yes --> A
  E -- No --> F{Difference}
  F -- None --> G[No difference]
  F -- Within threshold --> H[Correction written]
  F -- Above threshold --> I[Waiting in Stock corrections]
```

Only one count per box is in progress at a time. If someone already started counting a box and it has not moved, starting again reuses that same count, so two people counting the same shelf share one window. If the box moved since, starting again replaces the old count with a new one (the old one is recorded as cancelled).

## The quick count

The quick count lists the active boxes of **one supply in one warehouse**. You open it from:

* the **Count** action of a row in [Replenishment](/docs/en/inventory/replenishment-and-alerts);
* the **Count this supply here** link on a box page (see [Boxes and labels](/docs/en/inventory/boxes));
* the **Count** link of a supply inside a count campaign (the count then belongs to that campaign).

Opening `console.muveya.com/inventory/count` directly, without a supply and a warehouse, only shows **Choose a supply and a warehouse from replenishment to count them.** and a link **Back to replenishment**.

The screen is titled **Count a supply**, with the supply and the warehouse underneath, for example "Nitrile gloves M · GLV-NIT-M at Central warehouse". On a phone each box is shown as a card.

| Column | What it shows |
| - | - |
| **Box** | The printed box code, for example `BX-000123`. |
| **Expected** | Empty until you start counting; then the on-hand quantity recorded at that moment. |
| **Lot** | The box's lot, when it has one. |
| **Expiry** | The box's expiry date, when it has one. |
| **Counted** | The field where you type what you found (labeled, for example, **Counted in BX-000123**). |
| **Result** | What happened to that box when you saved. |

### Count step by step

<Steps>
  <Step title="Start counting before you measure">
    The screen reminds you: "Start counting before you measure, so anything that moves meanwhile is noticed." Select **Start counting**. The **Expected** column fills in and the **Counted** fields become editable.
  </Step>

  <Step title="Measure and type what you found">
    Count each box and type the quantity in **Counted**. Leave a field empty to skip that box for now: only boxes with a value are saved.
  </Step>

  <Step title="Choose the reason for a difference">
    In **Reason for a difference**, choose **Count correction**, **Damaged**, **Use not recorded** or **Other** (the reason codes are listed in [Stock corrections](/docs/en/inventory/corrections)). The reason applies to every difference saved in this step.
  </Step>

  <Step title="Confirm the window">
    Tick **Nothing went in or out of these boxes while I counted**. The box is required.
  </Step>

  <Step title="Save">
    Select **Save count**. Each box gets its own result. If any box waits for approval, the link **See stock corrections** appears.
  </Step>
</Steps>

**Save count** stays disabled until the confirmation is ticked, at least one box has a counted value, and every value typed is a whole number of 0 or more. A value above 1,000,000 is refused when you save (**Not saved**, with **Review the entered values before trying again.**). After saving, the confirmation clears: tick it again before saving more boxes.

### Results per box

| Result | What it means |
| - | - |
| **No difference** | The count matched. The count is saved; no stock movement is written. |
| **Corrected by +3** (or a negative number) | The difference was within the approval threshold and a correction was written. |
| **Waiting for another person to approve** | The difference was above the threshold. It waits in **Stock corrections**; the count stays in progress until someone decides. |
| **It changed while you counted. Count again.** | The box moved after you started. Select **Start counting** again and measure again. |
| **Already recorded** | This same result had already been saved. Nothing new was written. |
| **Another correction of this box is waiting for approval. Approve, reject or withdraw it in Stock corrections, then count again.** | A correction of the box already waits for a second person. |
| **Not saved** | The count could not be saved; the message under the button says why. |

### Limits

* The quick count shows up to 50 active boxes of the supply in that warehouse.
* Only **Active** boxes are listed. When there are none, the screen says **There are no active boxes of this supply in this warehouse.**
* Counted quantities are in the supply's base unit, the same unit as **On hand**.
* Members without `inventory.adjust` see **Only a member who can correct stock can count it.**

## What a saved count records

| Outcome | Ledger | Count status |
| - | - | - |
| No difference | Nothing | `submitted` |
| Difference within the threshold | One correction movement, `adjust_gain` or `adjust_loss`, with the chosen reason and linked to the count | `submitted` |
| Difference above the threshold | Nothing yet; a request appears in **Stock corrections** with the origin **Count: counted 88, expected 100** | `open` |
| That request approved | One correction movement naming both people | `submitted` |
| That request rejected or withdrawn | Nothing | Stays `open` until you count again or cancel it |

The difference is always **counted minus expected**. The threshold rules (100 by default, stricter per supply and warehouse, 0 for a high-value supply) are the same as for corrections: see [Stock corrections](/docs/en/inventory/corrections). A reconciled count leaves the audit fact `inventory.cycle_count.reconciled`, and its correction leaves `inventory.adjust`.

<Warning>
  Counting **0** in a box writes a loss that leaves it with nothing on hand, and the box becomes **Used up**. A used-up box takes no more movements. Make sure the box is really empty before saving a zero.
</Warning>

## The Counts screen

Select **Counts** on the **Stock** screen, or go to `console.muveya.com/inventory/counts`. The screen has three sections. **Due to count** and **Difference between counts and records** follow one selector, **Not counted since**: **7 days ago** (the default), **30 days ago** or **90 days ago**. **Counts in progress** always lists the open counts.

### Due to count

A box is **due** when it is active and has no saved count since the chosen date while in its current warehouse. The table lists each warehouse with something due:

| Column | What it shows |
| - | - |
| **Warehouse** | The warehouse name. |
| **Boxes due** | How many active boxes are due there. |
| **Campaign** | Shown only to members with `inventory.adjust`: the button **Start a count of Central warehouse** (with the warehouse's name). |

When nothing is due, the section says **Every box in your warehouses was counted in this period.** On **Home**, the card **Boxes due for a count** shows the same figure for the last 30 days.

### Counts in progress

Every count someone started and nobody has saved or cancelled yet (the 100 most recent).

| Column | What it shows |
| - | - |
| **Supply** | The supply's name and SKU. |
| **Box** | The link **Open the box**. |
| **Expected** | The quantity recorded when the count started. |
| **Started by** | Who started it. |
| **Started** | When. |
| **Change** | Shown only to members with `inventory.adjust`: the **Cancel** button. |

When there are none: **No counts are in progress.**

### Difference between counts and records

This section measures how accurate the records were, using the saved counts that were started since the chosen date.

* A summary sentence, for example: "2 of 14 supplies off target: their count differed from the records by 2% or more."
* The table **Difference by supply** lists, per supply and unit, worst first:

| Column | What it shows |
| - | - |
| **Supply** | The supply's name and SKU. |
| **Unit** | The unit the boxes were counted in. Different units are never added together. |
| **Counts** | How many saved counts. |
| **Expected** | Total expected quantity. |
| **Counted** | Total counted quantity. |
| **Difference** | Total absolute difference (a gain and a loss both add up). |
| **Difference %** | Difference divided by expected, or **Stock found where none was expected** when the expected total was 0 and something was counted. |
| **Target** | **Within target** below 2%; **Off target** at 2% or more, or when there is no percentage. |

* Counts of boxes whose unit is not verified are not added to any supply; a note says how many there are.
* The table **Count campaigns in this period** lists each campaign with saved counts: **Warehouse**, **Counts**, **Supplies**, **Off target** and the link **Open the campaign of Central warehouse**.
* Coverage notes say which warehouses were counted in the period, which were not ("Their stock is not reconciled by these figures."), and which rooms do not count their own stock, whose deliveries are an estimated consumption, never an exact stock (see [Rooms and areas](/docs/en/locations/destinations)).

When nothing was saved in the period: **No count has been submitted yet.**

## Count campaigns

A campaign counts one whole warehouse. It moves no stock by itself: it is a plan plus a coverage tracker.

### Start a campaign

<Steps>
  <Step title="Find the warehouse">
    On the **Counts** screen, in **Due to count**, find the warehouse.
  </Step>

  <Step title="Start it">
    Select **Start a count of** and the warehouse's name. muveya takes every box that is active in that warehouse at that moment (not only the due ones) as the plan, and opens the campaign page.
  </Step>
</Steps>

Only one campaign per warehouse can be in progress. Trying to start a second one shows **A count of this warehouse is already in progress.**

<Note>
  The **Counts** screen lists a campaign only once it has at least one saved count in the chosen period. Keep the campaign page's address (or bookmark it) so you can come back to a campaign that has no saved counts yet.
</Note>

### The campaign page

The page is titled **Count of Central warehouse** (with the warehouse's name), with its status underneath: **In progress** or **Closed**.

| Element | What it shows |
| - | - |
| **Boxes to count** | How many boxes the plan has. |
| **Counted** | Planned boxes with a saved count in this campaign. |
| **Still to count** | Planned boxes not counted yet. |
| Breakdown | "Submitted 12 · in progress 3 · cancelled 1": the campaign's counts by status. |
| Started and closed | Who started or closed it, and when. |
| **Supplies still to count** | Each supply with **Boxes pending** and, while the campaign is in progress and you hold `inventory.adjust`, the link **Count** followed by the supply's name. |

The link opens the quick count for that supply in that warehouse, and every count you start from it belongs to the campaign.

A few things to know about coverage:

* A count waiting for approval is still in progress, so its box is not **Counted** until the difference is approved.
* Boxes received after the campaign started are not part of the plan. Starting a count from the campaign stops at such a box; count that supply from [Replenishment](/docs/en/inventory/replenishment-and-alerts) or from the box page instead.
* The row **Boxes no longer in stock** groups planned boxes the page cannot place in this warehouse any more (for example, boxes moved elsewhere). In a warehouse with a long box history (more than 200 boxes), boxes still on the shelf can also end up in this row.

When every planned box is counted: **Every planned box was counted.**

### Close a campaign

While the campaign is in progress, members with `inventory.adjust` see "Close it when the planned boxes are counted. Boxes still pending stay uncounted." and the button **Close the count**. After closing, the page says **The count was closed.**

Closing moves no stock. Boxes still pending stay uncounted, the **Count** links disappear and no new count can join the campaign. A count of the campaign that was already in progress can still be finished: open the quick count from [Replenishment](/docs/en/inventory/replenishment-and-alerts) or from the box page, and it picks up that count.

## Cancel a count

<Steps>
  <Step title="Find the count">
    On the **Counts** screen, in **Counts in progress**, find the row.
  </Step>

  <Step title="Cancel it">
    Select **Cancel**. The dialog **Cancel this count?** explains: "Nothing changes in the stock. Start again whenever someone can count the box."
  </Step>

  <Step title="Confirm">
    Select **Yes, cancel the count**, or **Keep counting** to go back.
  </Step>
</Steps>

A cancelled count writes nothing to the ledger and can no longer be saved. A saved count cannot be cancelled. If the count had a difference waiting in **Stock corrections**, that request can no longer be approved: reject or withdraw it.

## Older counts that need review

A count started before the current counting method, or whose records are inconsistent, cannot be saved. muveya refuses it with the code `inventory.count_recovery_required` (titled "Count review required"), and the quick count shows **Not saved** with **The record changed or already exists. Review it before trying again.** Do not enter the same measurement again: select **Start counting** to open a new count (it replaces the old one) and measure again. If the refusal repeats, write to `team@muveya.com`.

## What can go wrong

| Message | Code | What to do |
| - | - | - |
| **It changed while you counted. Count again.** | `inventory.count_stale`, `inventory.adjustment_request_stale`, `inventory.cycle_count_not_open` | Select **Start counting** and measure again. |
| **Another correction of this box is waiting for approval. Approve, reject or withdraw it in Stock corrections, then count again.** | `inventory.adjustment_already_pending` | Resolve the waiting correction in [Stock corrections](/docs/en/inventory/corrections), then count again. |
| **Not saved** with **The record changed or already exists. Review it before trying again.** | `inventory.count_submission_conflict` | A different result was already saved, or is waiting, for this count. If one is waiting, approve, reject or withdraw it in **Stock corrections** first; otherwise start counting again to take a new measurement. |
| **Not saved** with the same message | `inventory.count_recovery_required` | See the section **Older counts that need review**, above. |
| **A count of this warehouse is already in progress.** | `inventory.count_campaign_already_open` | Open the existing campaign and continue it. |
| **The record changed or already exists. Review it before trying again.** after **Start counting** | `inventory.box_not_in_campaign`, `inventory.count_campaign_not_open` | The box is not in the campaign's plan, or the campaign is closed. Count from Replenishment or the box page. |
| **There are no active boxes of this supply in this warehouse.** | None | Nothing to count here. |
| **Only a member who can correct stock can count it.** | None | Ask an administrator for **Adjust and count stock**. |
| **Choose a supply and a warehouse from replenishment to count them.** | None | Open the count from Replenishment, a box page or a campaign. |
| **Your account does not have permission for this action.** | `common.forbidden` | You lack `inventory.read` or `inventory.adjust`. |
| **This record is not available in the active dental clinic account.** | `inventory.cycle_count_not_found`, `inventory.count_campaign_not_found`, `inventory.box_not_found` | The count, campaign or box is not in your warehouses. |
| **Could not complete the request. Please try again.** | Any other failure | Try again. If it persists, write to `team@muveya.com`. |

<Note>
  Saving a count is marked as a sensitive action. In the current version two-step verification is optional and does not block it (see [Account security](/docs/en/account/security)).
</Note>

## Related pages

<CardGroup cols={2}>
  <Card title="Stock corrections" icon="scale-balanced" href="/docs/en/inventory/corrections">
    Reasons, thresholds and approving differences.
  </Card>

  <Card title="Replenishment and alerts" icon="bell" href="/docs/en/inventory/replenishment-and-alerts">
    Where most quick counts start.
  </Card>

  <Card title="Inventory overview" icon="boxes-stacked" href="/docs/en/inventory/overview">
    Balances, statuses and the stock ledger.
  </Card>

  <Card title="Boxes and labels" icon="box" href="/docs/en/inventory/boxes">
    Find a box and read its movements.
  </Card>

  <Card title="Roles and permissions" icon="user-shield" href="/docs/en/account/roles-and-permissions">
    Who can count and who can only look.
  </Card>

  <Card title="Rooms and areas" icon="door-open" href="/docs/en/locations/destinations">
    Rooms that count their own stock and rooms that do not.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.