Pharmacy Expiry Management: Batches, FEFO and Cutting Expired-Stock Losses

Pharmacy Expiry Management: Batches, FEFO and Cutting Expired-Stock Losses

Every pharmacy owner knows the moment: a carton found at the back of the shelf, three months past its date, worth more than a good day's profit. Good pharmacy expiry management is what prevents that moment from repeating. It is rarely about staff carelessness. Expired stock usually comes from data the system never captured, a picking rule that ignores dates, a bonus deal that was too generous, or a branch that sells an item far more slowly than the one next to it.

This guide sets out a practical method: record every batch at receipt, dispense First-Expired-First-Out (FEFO) automatically, block what must not be sold, move near-expiry stock while it still has value, and stop buying quantities you cannot sell in time. At each step we show how Sellify, the ERP S-Plus built for pharmacies, pharmacy chains and pharmaceutical wholesalers, puts the rule into the software so it does not depend on memory.

Where expired-stock losses really come from

  • No batch at receipt. If the purchase invoice records only the quantity, the system cannot know which units expire first.
  • Picking by habit. Staff take the box at the front of the shelf, which is often the newest delivery.
  • Bonus offers that overstock. “Buy 10, get 2” looks like margin until the extra units expire.
  • Slow branches. In a chain, an item that sells weekly in one branch may sit for months in another.
  • Returns put back without checking. A returned box goes back to the shelf without anyone confirming its condition or batch.
  • Nobody sees it coming. Without a near-expiry view, the problem is found at the stocktake, when it is too late to act.

FIFO or FEFO: why the date beats the arrival order

Many retail systems use First-In-First-Out (FIFO): sell what arrived first. In a pharmacy, arrival order and expiry order often differ, because a later delivery from a different supplier can carry an earlier expiry date.

FIFOFEFO
RuleOldest receipt leaves firstNearest expiry leaves first
NeedsReceipt dates onlyBatch number and expiry date per unit of stock
Risk in pharmacyA later delivery with a shorter date expires on the shelfLow, as long as batches are recorded correctly
Fit for medicinesPoorThe standard for pharmaceutical stock

Step 1: Capture the batch and expiry date at receipt

FEFO is only as good as the data under it. In Sellify, batch tracking is switched on per item, and controlled medicines are batch-tracked automatically. For these items, the purchase invoice will not save without a batch number and an expiry date, and the batch is created automatically from the invoice line.

  • Opening balances for batch-tracked items come from a stocktake (adding a batch) or a purchase invoice, so every unit in stock has a date from day one. The plain stock field on the product screen is ignored for these items, which prevents undated stock from creeping in.
  • Serialised packs carry the expiry date inside their GS1 DataMatrix code, and receiving them by scan links each box to its batch. See our RSD track and trace guide for the full receiving flow.

Step 2: Dispense by FEFO automatically

Once batches exist, the rule must be enforced by the system, not by a sign in the stockroom.

  • Both the sales invoice and the POS dispense from the batch with the nearest expiry date.
  • Expired batches, and batches marked as quarantined or blocked, cannot be sold.
  • At the POS, the pharmacist can see the batches of an item and choose a specific one when needed, for example to match the box physically in hand.
  • Free bonus lines are dispensed from batches like paid lines, so bonus stock does not escape the rule.
  • Editing or deleting a sales invoice returns the quantities to the same batches they came from, so corrections never scramble the dates.
  • A purchase invoice cannot be deleted or edited once part of its batch has been sold, which protects the batch history.

Step 3: Use batch status for recalls and doubtful stock

Every batch has a status: active, quarantine or blocked. Quarantine suits stock under investigation, such as a temperature excursion during delivery. Blocked suits a manufacturer or regulator recall. Changing the status from the batches and expiry screen stops that batch from being sold in every branch immediately, while the rest of the item's stock keeps selling.

A recall scenario

A pharmacy chain in Dammam receives a recall notice for one batch of an antibiotic. The stock controller filters the batch list, sets the batch to blocked, and opens its batch card. Every movement is recorded, so the card shows each receipt, transfer, sale and return of that batch and where the remaining units sit. The batch is returned to the supplier through a purchase return, which allows returning that specific batch. Total time: minutes, not a weekend of phone calls.

Step 4: Move near-expiry stock while it still has value

In a chain or a multi-warehouse wholesaler, the same item can be close to expiry in one location and selling fast in another. Transfers in Sellify keep the batch identity: when a transfer is sent, stock is deducted from the source by FEFO and the batches are fixed; when it is received, the destination gets the same batches with the same expiry dates. Cancelling a transfer in transit returns the quantities to the original batches.

That makes a simple practice possible: every week, review items expiring in the coming months at slower branches and transfer them to the branch that sells them fastest. At the counter, the POS item details show stock in other branches, so a pharmacist can also direct a patient to a nearby branch instead of reordering.

Step 5: Stop buying what will expire

The cheapest expired box is the one you never bought. Sellify's reorder suggestions calculate a reorder point from daily demand multiplied by lead time plus safety days, and a maximum level that adds coverage days. The suggested order is the maximum minus effective stock, and effective stock excludes batches that will expire before the new delivery arrives. In other words, a shelf full of short-dated stock does not hide a real shortage, and the suggestion does not count units you will have to write off.

Apply the same discipline to bonus offers. Before accepting “buy 10, get 2”, compare the total quantity with what the branch sells before the expiry date on the supplier's batch. Our guide to pharmacy inventory management and forecasting covers reorder settings and branch transfers in more detail.

Step 6: Handle returns without polluting stock

  • Sales returns: each returned line gets a condition and a reason. A sound item goes back to its original batch; a doubtful one goes to quarantine; a damaged one does not re-enter stock at all.
  • Purchase returns: the user selects the specific batch to return, and expired batches can be returned to the supplier, which matters when your supply agreement allows returns of expired goods.
  • Credit: for credit customers, the value of a sales return is first deducted from that invoice's outstanding balance as a credit note, and any remainder is refunded.

Step 7: Count by batch, not just by item

A stocktake that counts only item totals cannot correct batch errors. Sellify's stocktake takes a snapshot of balances by batch, records the counted quantity per batch, and posts the adjustment to batches and stock on approval. With the warehouse mobile app, staff count by scanning a GS1 code or barcode; when an item has several batches, the app asks which one is being counted. Our article on warehouse and sales rep mobile apps shows the scanning flow.

Reports and alerts that make expiry visible

ViewWhat it answers
Dashboard alertsWhat is expired, near expiry or out of stock today, for each branch.
Batches and expiry listSorted by expiry date, filtered to near-expiry or expired, with quarantined and blocked stock shown for disposal or return.
Batch movement cardEvery receipt, sale, transfer and return for one batch.
Stock valuation by batchThe value tied up in each batch, so near-expiry exposure has a riyal figure.
Slow-moving reportItems that are not selling and are candidates for transfer, return or no reorder.

A weekly routine for pharmacy expiry management

  1. Monday: open the near-expiry list for your branch and agree actions for each line: transfer, supplier return, or a promotion where pricing rules allow it.
  2. Tuesday: send the transfers to faster branches and confirm the destination receives them.
  3. Wednesday: review the slow-moving report and remove those items from the next order.
  4. Thursday: check quarantined batches and decide: release, return or dispose.
  5. Monthly: run a scanning stocktake for high-value and short-dated items, and compare written-off value with the previous month.

Promotions in Sellify can target an item or a category for a set period with a minimum quantity, which suits a clearance of stock that is still well within date. Any discount beyond a role's limit still needs a manager's approval.

Who owns expiry: a simple split of responsibilities

Software enforces the rules, but people decide what to do with near-expiry stock. A clear split prevents the classic situation where everyone sees the alert and nobody acts on it.

RoleExpiry responsibility
Receiving clerk or storekeeperEnters the batch and expiry date exactly as printed, refuses short-dated deliveries that break the supply agreement, and scans serialised packs at receipt.
Pharmacist at the counterSells from the batch the system proposes, records returns with the right condition, and flags damaged stock instead of shelving it.
Branch managerOwns the weekly near-expiry list for the branch and approves transfers, returns and clearance discounts.
PurchasingUses reorder suggestions instead of gut feeling, and checks bonus offers against real sales before accepting them.
Head office or financeTracks written-off value per branch each month and asks why when it rises.

Role permissions in Sellify support this split: a storekeeper can manage batches and transfers without approving discounts, and a branch manager can approve within the branch they are assigned to.

Frequently asked questions

What is FEFO in a pharmacy?

First-Expired-First-Out: the unit with the nearest expiry date is dispensed first, regardless of when it arrived. It requires every unit of stock to be linked to a batch and an expiry date.

Can the system stop staff from selling expired medicine?

Yes. In Sellify, expired, quarantined and blocked batches cannot be sold from the POS or the sales invoice screen.

How do I enter opening stock with expiry dates?

For batch-tracked items, opening balances are entered through a stocktake (adding batches) or a purchase invoice, so every unit has a batch and an expiry date from the start.

Does FEFO work across warehouses and branches?

Yes. Each location holds its own batches, transfers move stock by FEFO while keeping batch numbers and dates, and the receiving location continues to apply FEFO.

Can I return expired stock to the supplier in the system?

Yes. A purchase return lets you pick the specific batch, and expired batches can be returned to the supplier.

Turn expiry from a surprise into a weekly task

Expired stock shrinks when the system knows every batch, enforces FEFO at every counter and shows what is coming in time to act. Expiry control is one layer of a complete pharmacy ERP. Request a Sellify demo and we will walk through your own near-expiry list, a recall and a batch-level stocktake.

Related Posts

Welcome Back

Sign in to access your account

Create Account

Join and enjoy the full experience

+965 expand_more
🇰🇼 Kuwait +965
🇸🇦 Saudi Arabia +966
🇦🇪 United Arab Emirates +971
🇶🇦 Qatar +974
🇧🇭 Bahrain +973
🇴🇲 Oman +968
🇪🇬 Egypt +20
🇯🇴 Jordan +962

lock_reset

Reset Password

Enter your email to receive a recovery link