Stock in a batch

Record a new batch — cost, selling price, batch number, expiry, supplier — as a single restock or in bulk.

3 min readUpdated 10 September 2026

Stocking in tells RxShelf a new physical batch of a product has arrived. Every batch carries its own cost, selling price, batch number, expiry, and supplier — because a pharmacy buys the same product at different prices from different vendors over time, and FEFO needs the expiry date to know which batch to dispense first.

Two paths, same underlying engine — pick the one that matches your delivery size:

  • Single-product restock — one product, one shipment. Fast, opened as a dialog.
  • Bulk stock in — many products at once. A whole page, saveable draft.

Path 1 — Single-product restock

Open any product from Inventory → Products (or its detail page) and click Restock. A dialog appears.

Single-product restock via the dialog.
Demo coming soon
Single-product restock via the dialog.

Fill in:

  • Quantity received.
  • Cost price — per unit, this delivery.
  • Markup % — pre-filled from the product's default markup. Editable.
  • Selling price — auto-calculated from cost × markup, but editable.
  • Wholesale markup % and Wholesale price — same pair, for wholesale. Only shown if you have the wholesale permission.
  • Supplier — pick from the supplier list, or create one inline.
  • Batch number (optional) — the manufacturer's lot number from the pack or invoice. Leave blank if you don't have it.
  • Expiry date — required for drugs, optional for consumables.

Click Restock.

Path 2 — Bulk stock in

Sidebar: Inventory → Stock In. For a delivery that includes multiple products.

Bulk stock in — queue, review, and commit.
Demo coming soon
Bulk stock in — queue, review, and commit.
  1. Pick products from the picker on the left — click each product to add it to the queue.
  2. Open Review when the queue has everything you need — a table opens with one row per product.
  3. Fill each row — quantity, cost, markup, selling price, batch number (optional), expiry (required for drugs), and supplier. Markup pre-fills from the product's default markup. As you type on any row, RxShelf keeps cost, markup, and selling in sync — type cost or markup and the selling price recomputes; type a selling price and the markup recomputes. All auto-calc rounds to the nearest kobo.
  4. Submit — drugs missing an expiry date are flagged before submit. Every row becomes a new batch; stock aggregates update automatically.

Why every field matters

  • Cost + selling price + markup are locked onto the batch at save time and cannot be changed later. Historical sales always reflect the price at which stock was dispensed.
  • Expiry drives FEFO — RxShelf always dispenses from the batch with the earliest expiry first.
  • Supplier is stored per batch. If you switch vendors later, historical batches still show the vendor who supplied them.
  • Batch number is a pharmaceutical traceability field — used in procurement reports, NAFDAC recall workflows, and the bin card.

FEFO — First Expiry, First Out

You never pick which batch to sell from. When a sale is recorded, RxShelf deducts from the batch with the earliest expiry first, rolling into the next batch if the quantity spans one. Consumables with no expiry sort last (they act as last-resort FIFO).

Expired batches

Expired batches don't magically disappear from FEFO. Manage them from Inventory → Expiry: filter by expired / expiring in 30 / 60 / 90 days, and quarantine expired stock so it stops appearing in sales.

Next steps