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

# Stock control

> Add a product to your catalogue, receive a delivery into a lot, and adjust or waste stock — the three things Inventory is used for every day.

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={['pharmacy']} plans="All plans, with quotas on Starter" roles="Any staff member with inventory access" />

**Inventory** is the ledger everything else draws from: the till, the dispensing form, purchase orders and branch transfers all move stock through this one screen. Its header reads **Inventory** — "Stock, lots, and expiry across your rooms and devices."

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

The same screen opens from **Pharmacy Station** › **Inventory**. One place, two doors.

<TaskHeader before="Nothing for the catalogue. Receiving needs at least one item and one location" time="2 minutes for a first item, under a minute per delivery" after="A product you can sell, with stock on hand in a dated lot" />

## The toolbar and the tabs

The toolbar carries **Receive**, **Dispense**, **Transfer**, **Reports**, **Import**, **Opening stock**, **Export** and **Add item**.

| Tab                | What lives there                                                                                                     |
| ------------------ | -------------------------------------------------------------------------------------------------------------------- |
| **Catalog**        | Every product you stock, whether or not you hold any                                                                 |
| **Stock**          | On-hand quantity per lot, per location                                                                               |
| **Ledger**         | Every movement in and out, with who and when                                                                         |
| **Counts**         | Cycle counts and physical counts — [Run a stock count](/pharmacy/inventory/stock-counts)                             |
| **Fill Rx**        | Scripts waiting to be drawn from stock — [The pharmacy station](/pharmacy/dispensing/station)                        |
| **Purchasing**     | Purchase orders and vendors — [Purchase orders and suppliers](/pharmacy/inventory/purchase-orders)                   |
| **Vouchers**       | Goods-received vouchers behind each delivery                                                                         |
| **Recalls**        | Quarantining affected lots                                                                                           |
| **Locations**      | Your rooms, shelves and fridges                                                                                      |
| **Alerts**         | Expiry, low stock, temperature and count alerts — [Batches, expiry and FEFO](/pharmacy/inventory/batches-and-expiry) |
| **Reconciliation** | Clearing sales made beyond recorded stock                                                                            |

<Note>
  Two labels on this screen still say "clinic" where they mean your pharmacy — the count scope **Whole clinic** is the one you meet most. They are bolded in these pages exactly as the product renders them.
</Note>

## Add an item

A catalog entry is the product, not the stock. As the sheet puts it: "A catalog entry — e.g. 'Botox 100U vial'. Stock is tracked per lot."

<Steps>
  <Step title="Open the sheet">
    Select **Add item**.
  </Step>

  <Step title="Look the product up, or name it yourself">
    **Look up drug (NDC or name)** fills the details for you. **Barcode / UPC (optional)** takes a scan through **Scan pack**, or **Generate…** if the pack carries no barcode you can use. Otherwise enter the **Name** by hand. **Product image (optional)** is what the till shows on the tile.
  </Step>

  <Step title="Set what kind of thing it is">
    **Type**, **Unit** and **Category** decide how it is counted and grouped. **NDC** and **DEA schedule** — **None (not controlled)** through **CII** to **CV** — decide whether it is treated as controlled.
  </Step>

  <Step title="Fill the drug details">
    **Generic name**, **Brand name**, **Strength**, **Dosage form**, **Manufacturer** and **NAFDAC/FDA No** are what a customer or an inspector asks for. **Storage instructions** is marked "Shown at the till", so write it for the person selling, not for a file.
  </Step>

  <Step title="Price it">
    **Unit cost** is what you paid; **Sale price** is what you charge, and **Markup %** derives one from the other. **Low-stock threshold** — "Alerts at/below this on-hand." — and **Reorder qty** are what make the reorder suggestions work.
  </Step>

  <Step title="Add opening stock, if you have some in the room now">
    **Opening stock (optional)** with **Into location** and **SKU** saves you a separate receive for a product already on the shelf.
  </Step>

  <Step title="Set the switches">
    **Refrigerated**, **Track by lot / expiry** and **Witness required (controlled)**. Leave **Track by lot / expiry** on for anything with an expiry date — it is what makes oldest-first picking possible.
  </Step>
</Steps>

## Receive a delivery

<Steps>
  <Step title="Open Receive">
    Select **Receive** in the toolbar.
  </Step>

  <Step title="Scan the pack, if it carries a GS1 code">
    **Scan package (GS1)** — "Scan or paste GS1 DataMatrix…" — fills in the item, the lot number and the expiry from the pack itself. This is faster and it does not mistype an expiry date.
  </Step>

  <Step title="Or enter the delivery by hand">
    **Item**, **Location**, **Quantity**, **Funding source**, **Lot number** and **Expiry**. Every delivery of the same product with a different expiry is a different lot — do not merge them.
  </Step>
</Steps>

Receiving against a purchase order is done per line from the **Purchasing** tab instead; see [Purchase orders and suppliers](/pharmacy/inventory/purchase-orders).

## Adjust or waste stock

**Dispense** in the toolbar is how stock leaves for any reason that is not a sale or a script: breakage, spillage, expiry.

It asks for a **Reason** — "Broken vial, spill, expired…" — and, on a controlled item, a **Witness (controlled item)**. Both land in the **Ledger** tab against your name.

<Note>
  The toolbar's **Transfer** moves stock between rooms **inside this branch**. Moving stock to another pharmacy branch is a different screen with the same word on it — see [Transfer stock between branches](/pharmacy/inventory/transfers).
</Note>

## Locations

The **Locations** tab is your physical geography: **Add location** creates a room, shelf or fridge; **Par levels** sets what should be held there; **Log temp** and **Sensors** cover cold-chain records. Locations carry badges for controlled, hazardous-rated and temperature zone.

A row action, **Print barcode label**, prints shelf labels — set **Copies** before printing.

## Check it worked

Each empty state tells you exactly what is still missing:

* **"No items yet. Add your first product (e.g. Botox 100U vial)."** — the catalogue is empty.
* **"No stock on hand. Receive a lot to get started."** — you have products but nothing physically held.
* **"No counts yet. Start a cycle count to reconcile physical stock against the system."**
* **"No open alerts. You're all stocked up."**

After adding an item it appears on **Catalog**; after receiving, it appears on **Stock** with its lot and expiry, and the movement appears on **Ledger**.

## What your plan and your permissions change

On the Starter plan a **Free plan** strip shows your usage against the limit for each countable kind — items, locations and purchase orders — with **Upgrade for unlimited**. At the limit, creation is refused rather than silently dropped. See [Change your plan](/platform/plans/change-plan).

These are all granted separately, so two people on the same screen can see different things: receiving, adjusting, transferring between branches, managing suppliers and purchase orders, witnessing a controlled dispense, and viewing cost and margin. Without cost visibility the valuation column reads **"Hidden — needs authorisation from your clinic owner."** rather than a zero. See [Staff permissions](/platform/team/permissions).

## Inventory settings

**Settings** › **Inventory** holds the defaults for new items, **Selling without stock** (whether the till may sell past recorded stock), **Receiving quality** (including **Require expiry date on new lots**), and a **Danger Zone**.

<Warning>
  The **Danger Zone** reset deletes your entire inventory — catalogue, lots, stock and history. It asks you to type `RESET` because there is no undo and no export that puts it back. Take an [export](/pharmacy/inventory/import-export) first if you are resetting a workspace you might want to look at again.
</Warning>

## Everything else in stock control

<Columns cols={2}>
  <Card title="Batches, expiry and FEFO" icon="https://mintcdn.com/clinikehr/gjlpJWWKqjyYNRzM/images/icons/hourglass-half.svg?fit=max&auto=format&n=gjlpJWWKqjyYNRzM&q=85&s=424a451b59e8e22c2152f472cb04d09f" href="/pharmacy/inventory/batches-and-expiry" width="24" height="24" data-path="images/icons/hourglass-half.svg">
    How oldest-first picking works, expiry alerts, expiry risk and recalls.
  </Card>

  <Card title="Purchase orders and suppliers" icon="https://mintcdn.com/clinikehr/gjlpJWWKqjyYNRzM/images/icons/file-invoice.svg?fit=max&auto=format&n=gjlpJWWKqjyYNRzM&q=85&s=0070d7e058a80a623b840c3ee8f1c1d4" href="/pharmacy/inventory/purchase-orders" width="24" height="24" data-path="images/icons/file-invoice.svg">
    Raise a PO, email the vendor, receive it line by line.
  </Card>

  <Card title="Run a stock count" icon="https://mintcdn.com/clinikehr/gjlpJWWKqjyYNRzM/images/icons/clipboard-list.svg?fit=max&auto=format&n=gjlpJWWKqjyYNRzM&q=85&s=c498c3e6d5ae45c376add8864f63a6e5" href="/pharmacy/inventory/stock-counts" width="24" height="24" data-path="images/icons/clipboard-list.svg">
    Cycle counts, physical counts and controlled-drug counts.
  </Card>

  <Card title="Count with a CipherLab scanner" icon="https://mintcdn.com/clinikehr/gjlpJWWKqjyYNRzM/images/icons/barcode.svg?fit=max&auto=format&n=gjlpJWWKqjyYNRzM&q=85&s=f03965970dda1715e963f76357ce684d" href="/pharmacy/inventory/cipherlab" width="24" height="24" data-path="images/icons/barcode.svg">
    Walk the shelves with a terminal and upload the scans.
  </Card>

  <Card title="Import and export your catalogue" icon="https://mintcdn.com/clinikehr/gjlpJWWKqjyYNRzM/images/icons/file-csv.svg?fit=max&auto=format&n=gjlpJWWKqjyYNRzM&q=85&s=67504843ee1e694e56ae6f5517879d93" href="/pharmacy/inventory/import-export" width="24" height="24" data-path="images/icons/file-csv.svg">
    Bulk-load products from a spreadsheet, and get your catalogue back out.
  </Card>

  <Card title="Transfer stock between branches" icon="https://mintcdn.com/clinikehr/nLyvBRumcl1Yk8z3/images/icons/truck-ramp-box.svg?fit=max&auto=format&n=nLyvBRumcl1Yk8z3&q=85&s=0e6be9bb1c73bb178ebdceae509cc379" href="/pharmacy/inventory/transfers" width="24" height="24" data-path="images/icons/truck-ramp-box.svg">
    Move stock to another branch, and receive what arrives.
  </Card>
</Columns>

## If something goes wrong

<AccordionGroup>
  <Accordion title="The item saved but the till cannot find it">
    A catalogue entry with no stock is not sellable unless **Selling without stock** is on. Receive a lot, or add **Opening stock** on the item.
  </Accordion>

  <Accordion title="Receive will not accept the delivery without an expiry">
    **Require expiry date on new lots** is on under **Settings** › **Inventory** › **Receiving quality**. That is deliberate — see [Batches, expiry and FEFO](/pharmacy/inventory/batches-and-expiry).
  </Accordion>

  <Accordion title="Add item is refused">
    You are at your plan's item limit. The **Free plan** strip shows the count; **Upgrade for unlimited** removes it.
  </Accordion>

  <Accordion title="The valuation column says it is hidden">
    Viewing cost and margin is a separate permission from viewing stock. An owner or manager grants it.
  </Accordion>

  <Accordion title="I moved stock and it went to the wrong place">
    Check whether you used the toolbar's **Transfer** (room to room, this branch) or the **Transfers** screen (branch to branch). They are different moves with the same name.
  </Accordion>
</AccordionGroup>

<StillStuck topic="stock" />
