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.
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.
- Pick products from the picker on the left — click each product to add it to the queue.
- Open Review when the queue has everything you need — a table opens with one row per product.
- 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.
- 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
- Record a sale — FEFO in action.
- Read the bin card — every batch movement per product.