> ## 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.

# Replenishment and stock alerts

> Set a minimum for each supply at each warehouse, read what needs replenishing and follow low-stock and expiry alerts

muveya compares the usable stock of each supply at each warehouse with the **minimum** your team sets there. The **Replenishment** screen lists what is short and suggests how much to order; the **Stock alerts** screen lists the supplies below their minimum and the boxes about to expire or already expired.

Nothing is compared until a minimum exists: a supply with no minimum at a warehouse never appears in Replenishment and never raises a low-stock alert there.

## Who can do it

| Action | Permission (console label) |
| - | - |
| See **Replenishment** and **Stock alerts** | `inventory.read` (**View inventory**) |
| Set or edit a minimum; use the **Count** and **Edit minimum** actions | `inventory.adjust` (**Adjust and count stock**) |

Both screens only show the warehouses your team access reaches. A minimum is not an everyday permission because it also sets how large a correction may be before a second person must approve it. See [Roles and permissions](/docs/en/account/roles-and-permissions).

## What a minimum defines

A minimum (stock policy) belongs to **one supply at one warehouse**. All quantities are in the supply's base unit, which is sealed into the minimum when you save it.

| Field (console label) | Rules | Effect |
| - | - | - |
| **Minimum** followed by the unit, for example **Minimum (Unit)** | Required. Whole number from 0 to 1,000,000. | Below it, the supply needs replenishing and a low-stock alert opens. `0` means "never alert". |
| **Usual order** followed by the unit | Optional. Whole number from 1 to 1,000,000. "Suggested when the supply falls below the minimum." | Used as the suggested order when it is larger than what is missing. |
| **Warn before expiry (days)** | Optional. From 1 to 365. "Without a value, it warns 30 days before." Shown only for supplies with **Track expiration dates** turned on in the catalog. | How many days before its expiry date a box of this supply in this warehouse raises an expiry alert. |
| **Approval threshold** followed by the unit | Optional. From 0 to 100. "Corrections above this amount need another person to approve. At most 100." | The largest correction or count difference applied without a second person. Without a value, the threshold is 100. See [Stock corrections](/docs/en/inventory/corrections). |

For a supply marked **High-value supply** in the catalog, the threshold field is replaced by "This is a high-value supply: every correction needs another person to approve it."

<Note>
  There is no maximum level and no separate reorder point: the minimum is the only trigger, and the usual order is the only sizing hint.
</Note>

### Set or edit a minimum

<Steps>
  <Step title="Open the form">
    On **Replenishment**, select **Set a minimum**, or **Edit minimum** on a row. The page is `console.muveya.com/inventory/replenishment/policy`, titled **Minimum per warehouse**.
  </Step>

  <Step title="Choose the supply and the warehouse">
    Pick an active supply in **Supply** (**Choose a supply**) and an active warehouse you have access to in **Warehouse** (**Choose a warehouse**). **Edit minimum** fills both in for you.
  </Step>

  <Step title="Read what is there now">
    The form shows **Usable now:** with the current quantity and unit, and loads the values already saved for that location (empty fields when there is no minimum yet).
  </Step>

  <Step title="Fill in the values">
    Type the **Minimum** and, if you want, the other fields. Errors appear only after you try to save.
  </Step>

  <Step title="Save">
    Select **Save minimum**. The form says **Minimum saved.**
  </Step>
</Steps>

Rules to keep in mind:

* **The whole policy is saved at once.** An optional field you leave empty is cleared, even if it had a value before.
* **The supply must be active and its unit fixed.** Otherwise muveya refuses with "This supply has no confirmed unit yet, so a minimum cannot be compared. Confirm its unit in the catalog first." See [Catalog items](/docs/en/catalog/items).
* **Someone else may have saved first.** If another person changed the minimum after you opened it, the form reloads their values and says "Someone changed this minimum after you opened it. It now shows their values; review them and save again."
* Members without `inventory.adjust` see "Only a member who can correct stock can set minimums."

**What muveya records:** the minimum with its sealed unit and a version number, and the audit fact `inventory.policy.set` with the values saved and who saved them. Right after saving, muveya re-evaluates the alerts of that supply at that warehouse, so stock that was already short raises its alert without waiting for a movement.

### Field errors

| Message | Field |
| - | - |
| **Enter a whole number from 0.** | **Minimum** |
| **Enter a whole number from 1, or leave it empty.** | **Usual order** |
| **Enter from 1 to 365 days, or leave it empty.** | **Warn before expiry (days)** |
| **Enter from 0 to 100, or leave it empty.** | **Approval threshold** |

## The Replenishment screen

Select **Replenishment** in the main navigation, or the **Replenishment** link on the **Stock** screen. The page is `console.muveya.com/inventory/replenishment`, described as "Supplies below the minimum you set for each warehouse, counted in their base unit."

### Filters

| Control | What it does |
| - | - |
| **Warehouse** | **All warehouses** (the default) or one active warehouse you have access to. |
| **Only what needs attention** | Ticked by default: shows only rows below their minimum or with a box whose unit needs review. Untick it to see every location with a minimum. |
| **Set a minimum** | Link to the minimum form. Shown only with `inventory.adjust`. |

### Columns

| Column | What it shows |
| - | - |
| **Supply** | The supply's name and SKU, for example `Nitrile gloves M · GLV-NIT-M`. |
| **Warehouse** | The warehouse. When it holds the stock of a room that counts its own stock, a second line says **Stock point of** and the room (see [Rooms and areas](/docs/en/locations/destinations)). |
| **Unit** | The unit of every quantity in the row. |
| **Usable now** | The usable total (see below). |
| **Minimum** | The minimum set. |
| **Missing** | Minimum minus usable, when positive; otherwise empty. |
| **Suggested order** | The suggested quantity, only when the row is below its minimum. |
| **Status** | **Below minimum**, **Enough** or **No minimum**. A second line "A box of this supply is in another unit and is not counted. Check its unit." appears when needed. |
| **Actions** | Shown only with `inventory.adjust`: **Count** (opens the [quick count](/docs/en/inventory/counts)) and **Edit minimum**. |

Rows are ordered with **Below minimum** first, then rows with a unit to review, then by what is missing, largest first.

### How the numbers are computed

* **Usable now** adds up, for every box of the supply in that warehouse that is **Active** and not past its expiry date, the box's on-hand quantity minus what it holds for orders. Each box counts at least 0, so a box with a deficit (more reserved than on hand) never subtracts from the others. Quarantined, expired, disposed, used-up and in-transit boxes do not count.
* Only boxes in the unit sealed into the minimum count. A box in another unit, or whose unit is not verified, is left out and flagged; it is never converted.
* **Missing** is the minimum minus usable now, when that is more than zero.
* **Suggested order** is the larger of **Missing** and **Usual order**.
* **Status** is **Below minimum** when something is missing and **Enough** otherwise. **No minimum** describes a location without a minimum; those locations are not listed on this screen.
* A box counts as usable through the whole day of its expiry date.

| Minimum | Usual order | Usable now | Missing | Suggested order | Status |
| - | - | - | - | - | - |
| 20 | 50 | 12 | 8 | 50 | **Below minimum** |
| 20 | 5 | 12 | 8 | 8 | **Below minimum** |
| 20 | (none) | 12 | 8 | 8 | **Below minimum** |
| 20 | 50 | 25 | (empty) | (empty) | **Enough** |
| 0 | (none) | 0 | (empty) | (empty) | **Enough** |

### Empty and partial lists

| Message | Meaning |
| - | - |
| **Loading what needs replenishing…** | The list is loading. |
| **Nothing is below its minimum.** | With **Only what needs attention** ticked, nothing is short. |
| **No warehouse has a minimum for these supplies yet. Set one so stock is compared with what the clinic needs.** | With the filter unticked, no location has a minimum. |
| **You have no warehouses assigned. Ask an administrator for access.** | Your team access lists no warehouse. |
| **This list stopped at its limit and may be incomplete. Choose a warehouse to see all of it.** | The screen shows at most 200 rows and reads a bounded number of minimums and boxes. Filter by warehouse. |

If the list fails to load, the error is shown with a **Try again** button.

### From a suggestion to an order

The Replenishment screen does not create orders: there is no button that turns a suggestion into an order. To request the stock from another warehouse of your dental clinic, create an order with the suggested quantity (see [Create and track orders](/docs/en/orders/create-and-track)). Purchases from suppliers happen outside muveya; when the delivery arrives, record it with [Receive stock](/docs/en/inventory/receive).

## Stock alerts

Select **Stock alerts** on the **Stock** screen, or go to `console.muveya.com/inventory/alerts`. On **Home**, the card **Open stock alerts** shows how many alerts are open (counted up to 200; at 200 it shows **200+**) and opens this screen.

### Views and columns

Use **Show** to choose **Open alerts** (the default), **Resolved** or **All**. Alerts are listed newest first, up to 200.

| Column | What it shows |
| - | - |
| **Alert** | The alert type (see below). Open alerts are highlighted. |
| **Supply** | The supply's name and SKU. |
| **Warehouse** | Where the risk is. |
| **Detail** | For low stock, for example "12 usable of a minimum of 20", with the figures from when it was detected. For expiry, "Expires" or "Expired" and the date. |
| **Detected** | When the alert was detected; for a resolved alert, a second line **Resolved** and the date. |
| **Box** | **Open the box** when the alert concerns a box (see [Boxes and labels](/docs/en/inventory/boxes)). |

When the view is empty: **No alerts in this view.**

### Alert types

| Label | Type | Opens when | Resolves when |
| - | - | - | - |
| **Below minimum** | `low_stock` | A supply's usable total at a warehouse is below a minimum greater than 0. | The usable total reaches the minimum again, or the minimum is set to 0. |
| **Expiring soon** | `expiry_approaching` | An active box's expiry date is within the warning window of its warehouse (the policy's days, or 30). | The box is no longer active (used up, quarantined, expired or disposed) or is no longer inside the window. |
| **Expired** | `expiry_approaching` | The same alert once the box's last day is over, or a box found already past its date. | The box is taken out of use, for example marked as expired from its box page. |

There is no separate "out of stock" alert. A supply with nothing usable at a warehouse that has a minimum shows **Below minimum** with a detail such as "0 usable of a minimum of 20". A warehouse without a minimum raises no low-stock alert at all.

At most one alert is open for each supply at each warehouse (low stock) and for each box (expiry). An expiry alert follows its box when the box moves to another warehouse. A low-stock alert names a box (and shows **Open the box**) only when a movement of that box detected it.

### When alerts are computed

muveya evaluates alerts at three moments, all with the same rules:

1. **Shortly after every stock movement**, for each warehouse the movement touched (for a move, both the origin and the destination). A quarantine or a box that is used up also lowers usable stock, so it triggers the check too.
2. **Right after a minimum is saved**, for that supply at that warehouse.
3. **In a periodic check about every 15 minutes**, which catches what changes with time alone: boxes entering their warning window, boxes whose date passes and stop counting as usable, and alerts left open by a failed check.

An alert is therefore not instant: allow a short delay after a movement, and up to the next periodic check for changes that depend only on the date.

### Who sees alerts

Members with `inventory.read`, for the warehouses their team access reaches. Alerts are shown in the console only: muveya does not send them by email or WhatsApp. Managers can also read the number of open alerts as the operational metrics `LOW_STOCK` and `EXPIRING_STOCK` (see [Management analytics](/docs/en/reports/management-analytics)).

## What can go wrong

| Message | Code | What to do |
| - | - | - |
| **Someone changed this minimum after you opened it. It now shows their values; review them and save again.** | `inventory.stock_policy_conflict` | Review the values shown and save again. |
| **This supply has no confirmed unit yet, so a minimum cannot be compared. Confirm its unit in the catalog first.** | `inventory.measurement_unverified` | Activate the supply in the [catalog](/docs/en/catalog/items), then save the minimum. |
| **Only a member who can correct stock can set minimums.** | None | Ask an administrator for **Adjust and count stock**. |
| **A box of this supply is in another unit and is not counted. Check its unit.** | None | Open the supply's boxes and have their unit reviewed; until then they are left out of the total. |
| **This record is not available in the active dental clinic account.** | `inventory.warehouse_not_found`, `inventory.item_not_found` | The warehouse is inactive or outside your access, or the supply does not exist. |
| **Review the entered values before trying again.** | `inventory.stock_policy_invalid` | A value is outside its range. |
| **Your account does not have permission for this action.** | `common.forbidden` | You lack `inventory.read` or `inventory.adjust`. |
| **Could not complete the request. Please try again.** | Any other failure | Try again. If it persists, write to `team@muveya.com`. |

## Related pages

<CardGroup cols={2}>
  <Card title="Inventory overview" icon="boxes-stacked" href="/docs/en/inventory/overview">
    Balances, reserved and available quantities.
  </Card>

  <Card title="Physical counts" icon="clipboard-list" href="/docs/en/inventory/counts">
    Check a short supply before ordering.
  </Card>

  <Card title="Stock corrections" icon="scale-balanced" href="/docs/en/inventory/corrections">
    What the approval threshold controls.
  </Card>

  <Card title="Create and track orders" icon="cart-shopping" href="/docs/en/orders/create-and-track">
    Request the missing stock.
  </Card>

  <Card title="Management analytics" icon="chart-line" href="/docs/en/reports/management-analytics">
    Open alerts as operational metrics.
  </Card>

  <Card title="Roles and permissions" icon="user-shield" href="/docs/en/account/roles-and-permissions">
    Who can set minimums.
  </Card>
</CardGroup>


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