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

# Inventory settings

> Set expiry alert horizons, receiving rules and what the till does when stock runs out — plus the reset that empties the whole module.

export const StillStuck = ({topic}) => <div className="ck-callout ck-callout--note" role="note">
    <p className="ck-callout__body">
      <strong>Still stuck{topic ? ` with ${topic}` : ''}?</strong>{' '}
      Check <a href="/platform/help/troubleshooting">Troubleshooting</a> first —
      it covers the failures we see most often. If that does not resolve it,{' '}
      <a href="/platform/help/contact-support">contact support</a> and include
      your workspace name and the time the problem happened, so we can find the
      matching entry in your audit log.
    </p>
  </div>;

export const TaskHeader = ({before, time, after}) => <div className="ck-task">
    {before ? <div className="ck-task__cell">
        <div className="ck-task__title">Before you start</div>
        <p className="ck-task__body">{before}</p>
      </div> : null}

    {time ? <div className="ck-task__cell">
        <div className="ck-task__title">Takes about</div>
        <p className="ck-task__body">{time}</p>
      </div> : null}

    {after ? <div className="ck-task__cell">
        <div className="ck-task__title">When you're done</div>
        <p className="ck-task__body">{after}</p>
      </div> : null}
  </div>;

export const Path = ({steps = []}) => <span className="ck-path">
    {steps.map((s, i) => <span key={i} className="ck-path__step">
        {i > 0 ? <span className="ck-path__sep" aria-hidden="true">
            ›
          </span> : null}
        {s}
      </span>)}
  </span>;

export const Availability = ({editions = ['all'], plans, roles, note}) => {
  const list = editions.includes('all') ? ['clinic', 'pharmacy', 'lims'] : editions;
  return <div className="ck-avail" role="note" aria-label="Feature availability">
      <span className="ck-avail__label">Available in</span>

      {list.map(e => <span key={e} className={`ck-pill ck-pill--${e}`}>
          {EDITION_LABELS[e] || e}
        </span>)}

      {plans ? <span className="ck-avail__label">Plan</span> : null}
      {plans ? <span className="ck-pill ck-pill--plan">{plans}</span> : null}

      {roles ? <span className="ck-avail__label">Who</span> : null}
      {roles ? <span className="ck-pill ck-pill--role">{roles}</span> : null}

      {note ? <span className="ck-avail__note">{note}</span> : null}
    </div>;
};

<Availability editions={['clinic']} plans="Solo and Team" roles="Owner, manager or accountant" note="The Danger Zone is owner-only; the tab appears only when the Inventory care area is on" />

Five small cards decide how your stock behaves: when you get warned about expiry, what you may receive, whether the till can sell something it has no stock for, and whether dispensing may run ahead of the ledger. A sixth, the **Danger Zone**, empties the module.

<Path steps={['Sidebar', 'Settings', 'Inventory', 'Inventory']} />

<TaskHeader before="The Inventory care area switched on for your practice" time="10 minutes" after="Expiry warnings that arrive when you can still act on them, and a till that behaves the way you want when stock runs out" />

## What this tab controls

The tab is headed **Inventory** — "Expiry alerts, dispensing enforcement and inventory data controls."

| Control                                                                    | What it does                                                                                                                                                            | Default                                                                          |
| -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| **Expiry alert horizons**                                                  | Up to four day-values, added as chips (1–365 days each). "Get alerted as stock approaches expiry."                                                                      | The edition default, shown on the card — 60/30 days here, 90/60/30 in a pharmacy |
| **Enforce inventory on dispense**                                          | "Require every dispensed medication to be linked to inventory with enough stock." Off, dispensing never blocks and off-ledger lines land on the **Reconciliation** tab. | Off — "Best-effort — never blocks (default)"                                     |
| **New-item defaults** — **Low-stock threshold**, **Reorder quantity**      | Applied to items created without their own values, in the item form and in catalog imports. Leave empty for no default.                                                 | Empty                                                                            |
| **Receiving quality** — **Require expiry date on new lots**                | Refuses to receive stock into a new lot with no expiry date.                                                                                                            | Off — "Undated lots are allowed (not recommended for pharmacies)"                |
| **Selling without stock** — **Allow selling items with no recorded stock** | Lets the till sell an item whose recorded stock is zero, recording each oversold quantity for reconciliation.                                                           | On                                                                               |
| **Danger Zone** → **Reset inventory…**                                     | Erases the whole inventory module for a clean re-import. Requires typing `RESET`.                                                                                       | —                                                                                |

The **Danger Zone** is **hidden entirely** from managers and accountants — not greyed out, simply not drawn. Only the practice owner sees it.

**Require expiry date on new lots** is the one that protects everything else. Picking works earliest-expiry-first, and an undated lot has no expiry to sort on — so it is invisible to the picking order *and* to every expiry alert. Turning it on closes the gap at the door: "Applies to direct receiving and purchase-order receipts; topping up an existing dated lot is unaffected."

<Warning>
  **The reset cannot be undone.** It permanently deletes your catalog, lots, stock levels, ledger, stock counts, purchase orders, vendors, locations and device history. Your medication list, store history and all clinical records are kept. Opening the dialog shows a preview of exactly what would go and how many of each, and you must type `RESET` to confirm — the button then reads **Delete everything listed**.
</Warning>

## Set it up

<Steps>
  <Step title="Set your expiry horizons">
    On **Expiry alert horizons**, type a number of days and select **Add**. Up to four — 90, 60 and 30 is a common ladder. Remove one with the small x on its chip, then select **Save horizons**. An empty list falls back to the default shown on the card.
  </Step>

  <Step title="Decide your receiving rule">
    On **Receiving quality**, turn on **Require expiry date on new lots** if you hold anything that expires.
  </Step>

  <Step title="Decide what the till does when stock runs out">
    On **Selling without stock**, leave **Allow selling items with no recorded stock** on to keep selling and reconcile later, or turn it off to make the till refuse.
  </Step>

  <Step title="Set new-item defaults">
    Enter a **Low-stock threshold** and a **Reorder quantity** in whole units, then **Save defaults**. Leave either empty for no default. These matter most for imports, which arrive with no thresholds at all.
  </Step>

  <Step title="Choose your dispensing strictness">
    Turn **Enforce inventory on dispense** on only if every medication you dispense is linked to inventory. On, an unlinked medication or insufficient stock aborts the whole dispense, like the till.
  </Step>
</Steps>

## What changes once you save

| What you changed                       | What you'll notice                                                                                                                                                                                                             |
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Expiry alert horizons**              | Items appear on the inventory **Alerts** tab, and in the digest email, as they cross each horizon you set. A shorter ladder means fewer, later warnings.                                                                       |
| **Require expiry date on new lots** on | The **Receive** form starts refusing a new lot with no expiry date, from that moment. It does **not** retro-fix lots already received without one — those stay invisible to picking and alerts until you correct them by hand. |
| **Selling without stock** off          | The till refuses an item with no recorded stock, mid-sale. On, it sells and the shortfall is recorded and reconciled automatically when stock is received; anything still unreconciled shows in the inventory digest email.    |
| **New-item defaults**                  | Applied to items created from now on. Existing items keep the thresholds they already have.                                                                                                                                    |
| **Enforce inventory on dispense** on   | Dispensing hard-stops on an unlinked medication or a failed stock draw. Off, it proceeds and the drift is logged to the **Reconciliation** tab instead.                                                                        |
| **Reset inventory…**                   | Everything listed in the preview is gone, and the module starts empty.                                                                                                                                                         |

For how lots, expiry dates and earliest-expiry-first picking work day to day, see [Batches and expiry](/pharmacy/inventory/batches-and-expiry).

## Check it worked

Each card confirms itself — "Expiry alert horizons saved", "New-item defaults saved.", "Receiving now requires an expiry date on every new lot.", "Strict dispensing enabled". Reload the tab and the switches should hold. Then test the one that matters to you: open the **Receive** form and try to save a new lot with the expiry blank, or take an out-of-stock item to the till.

## Common issues

<AccordionGroup>
  <Accordion title="There is no Inventory tab in my settings">
    The Inventory care area is switched off for your practice. See [Care areas](/platform/team/care-areas).
  </Accordion>

  <Accordion title="I can see the cards but not the Danger Zone">
    You are a manager or accountant. The reset is owner-only and is hidden rather than disabled.
  </Accordion>

  <Accordion title="&#x22;Up to 4 horizons.&#x22; or &#x22;Enter a whole number of days between 1 and 365.&#x22;">
    You already have four chips, or the value you typed is not a whole number in range. Remove a chip before adding another.
  </Accordion>

  <Accordion title="&#x22;This inventory cannot be reset&#x22;">
    Clinical administration records reference your lots — vaccine administrations, ward medication administrations, VAERS reports or patient-linked ledger entries — and a reset would destroy that traceability. The dialog lists how many of each. Adjust quantities through a stock count instead; resetting is only for inventories with no clinical history.
  </Accordion>

  <Accordion title="Expiring stock never appears on the Alerts tab">
    Its lots have no expiry date, so nothing can compare them to a horizon. Turn on **Require expiry date on new lots** to stop it recurring, then correct the existing lots.
  </Accordion>

  <Accordion title="The till sold something we had no stock for">
    **Allow selling items with no recorded stock** is on. That is deliberate — each oversold quantity is recorded and reconciles itself when stock is received. Turn the switch off to restore the hard stock check.
  </Accordion>
</AccordionGroup>

<StillStuck />
