All docs

Inventory

Inventory, batches & FEFO

Batch-level stock tracking with first-expiry-first-out enforcement.

Every unit of stock in PharmaPOS is tied to a batch — a batch number, an expiry date, and an on-hand quantity. Products don't hold quantities; batches do. This is the single most important idea in the system.

Why batches, not products

Pharmacies are regulated. If a drug is recalled by the manufacturer, the recall is against a specific batch — not the product. Your system must be able to answer, in seconds, "how many strips of Batch BN102284 did we sell, and to whom." PharmaPOS can. Product-level stock software cannot.

Adding batches

  • Automatically — every purchase line creates or updates a batch. This is the normal path.
  • Manually — from a product page, click Add batch. Use this for opening stock, free samples, or physician samples.
  • By import — the bulk import supports batch columns (batch_no, expiry, opening_qty) and creates them in one shot.

FEFO auto-pick

When you bill a product, PharmaPOS picks the batch with the earliest expiry that still has stock. You can override at the counter with two keystrokes — every override is logged with the cashier's name and time. See the FEFO blog post for the full argument on why this beats manual picking.

Expiring & low-stock reports

Under Inventory → Reports you get:

  • Expiring soon — 30 / 60 / 90 day windows. Filter by category, supplier, or margin band.
  • Below reorder — everything under the reorder level you set on the product.
  • Dead stock — no sale in 90 days. Return-to-supplier candidates.
  • Movement history — every stock event for a batch, with the sale/purchase/return document it came from.

Adjustments (breakage, theft, sample-out)

From a batch, click Adjust, pick a reason (breakage, expired, given as sample, physical count correction), enter the quantity change, add a note. The adjustment shows on the movement log; a manager can review or reverse it.

Bulk import — what to know

  • Column names like brand, salt, qty, exp, hsn, mrp, gst auto-map.
  • The preview shows per-row validation — duplicate SKU, invalid GST rate, expired batch date, missing name/MRP all flag in red before commit.
  • Toggle Upsert mode to refresh MRP/stock on existing SKUs instead of failing on duplicates.
  • Re-uploading an archived SKU offers Restore — no duplicate rows, no data loss.

Still stuck?

Email us at support@pharmapos.org — we usually reply within a business day.