All posts
InventoryJuly 17, 2026·8 min read

Batch and Expiry Tracking in Pakistan: How to Stop Selling Stock That Is About to Expire

For a pharmacy, a food distributor or a cosmetics importer, a carton of stock is not one thing. It is a batch, with a date on it, and the day that date passes the stock is not worth less, it is worth nothing. Yet most software treats all of it as one big number. That is how expired goods end up on the shelf.

Walk into most warehouses in Pakistan and ask how much stock they have of a given product, and you will get a clean number. Ask a harder question, how much of that stock expires next month, and the confident answer usually disappears. For a lot of businesses that gap does not matter. For a pharmacy, a food distributor, a cosmetics importer or anyone selling agri inputs, it is the whole business. Their stock is not just a quantity, it is a quantity with a date attached, and the day that date passes the goods do not lose a little value. They become worthless, and sometimes illegal to sell.

The frustrating part is that most accounting and inventory software was never built for this. It happily tells you that you hold 5,000 units of something. It has no idea that 800 of those units are from an old batch that expires in three weeks, sitting at the back of the rack while your staff keep selling from the fresh cartons up front. So the old stock quietly ages out, gets written off at a loss, or worse, reaches a customer with the date already gone. The software was not lying. It just never knew a batch was a thing.

A batch is not the same as a quantity

The core idea is simple once you see it. When you buy or produce a perishable product, it arrives in identifiable batches, a manufacturing lot with its own production date and expiry. Two cartons of the same medicine can have completely different expiry dates depending on when they were made. To an ordinary inventory system they are identical, both just “one unit of Product X.” To a business that lives or dies on shelf life, they are two different things that must never be blended into a single anonymous pile.

Tracking expiry properly means keeping a sub-ledger underneath your stock: not just “5,000 units” but “batch A, 800 units, expires 30 August; batch B, 4,200 units, expires 15 December.” Every receipt adds a dated batch. Every sale draws down a specific batch. The total still ties to the same 5,000, but now the number has a memory of where it came from and when it dies. That memory is the entire point, and it is exactly what generic software throws away.

Key insight

The reason expired stock surprises people is that their software averages the problem away. “5,000 units in stock” feels healthy right up to the day 800 of them turn into a write-off. A batch-aware system never lets that number hide the dates inside it. You stop being surprised by expiry because you can see it coming weeks out.

FEFO: sell the one that dies first

Once you are tracking batches with dates, the right way to pick stock becomes obvious: first-expiry-first-out, or FEFO. It is a cousin of FIFO, but instead of selling the oldest purchase first, you sell the batch that expires soonest first. Those are not always the same thing, a batch you bought later might expire earlier, and it is precisely those cases where money leaks. FEFO says: whatever is closest to its expiry date, that is what goes out the door next, so nothing sits long enough to cross the line.

In practice, a good system does the thinking for you. When you make a sale, it should point your team at the batch that expires soonest and let them pick from that first, instead of grabbing whatever carton is nearest the door. Left to habit, staff pull from the front, which is usually the newest stock, and the old batch rots at the back. FEFO flips that instinct. It is the single most effective thing a perishable-goods business can do to cut write-offs, and it only becomes possible once the software knows the expiry of every batch.

Real scenario

A food distributor kept writing off a few cartons every month and treated it as a cost of doing business. When they finally put batch dates into the system, the pattern was embarrassing: it was almost always the same slow-moving lines, where a new delivery arrived before the old one sold, and the team kept opening the fresh pallet. Nobody was stealing, nobody was careless, the software simply never told anyone which batch was about to expire. Picking by expiry date instead of by convenience turned most of those write-offs into ordinary sales.

The line to walk: warn, do not block

There is a wrong way to build expiry tracking, and it is worth naming because plenty of software gets it wrong. The temptation is to make the system rigid, to physically stop a sale if the batch is close to expiry, or to force the user to pick a specific batch before they can save anything. In a real Pakistani business, at a busy counter, that turns the software into an obstacle. Staff start entering fake data or bypassing the system entirely just to get the sale done, and once that starts, your batch data is worthless.

The better philosophy is advisory. The system should always know the batches and their dates, should recommend FEFO, and should flag stock that is expiring or expired, loudly, in reports and on screen. But it should never stand between a business and a sale it has decided to make. This is exactly how we built expiry tracking in NavoBook: it is a feature we switch on for the businesses that need it, and when it is on it acts as a first-expiry-first-out sub-ledger and an early-warning system, not a gate. It guides picking and surfaces what is about to expire, without ever blocking a transaction. The business stays in control; the software just makes sure nothing ages out in the dark.

Watch out

Be suspicious of any inventory system that forces batch selection so hard it slows down the counter. In the real world, staff will route around it, and then your expiry data is fiction. Tracking that people quietly bypass is worse than no tracking, because it looks reliable while being wrong. The right design informs and warns; it does not fight your team for control of the sale.
BusinessWhat a “unit” really isWhy expiry has to be tracked
Pharmacy / pharma distributorBatch number + expiry on every strip and bottleExpired medicine is a legal and safety problem, not just a loss
Food & beverage distributorBatch + best-before, often short shelf lifeA slow-moving batch quietly crosses its date on the shelf
Cosmetics & personal care importerBatch + expiry, long chains from import to retailStock ages in the warehouse while newer stock is sold first
Agri inputs (seed, pesticide)Lot + expiry tied to a seasonProduct past date is worthless and cannot be sold on
Packaged / processed goodsProduction lot + expiry from the pack lineReturns and complaints when expired stock reaches a customer

Where expiry meets your accounts

Expiry is not only an operations problem, it is a costing problem, and this is where it connects to the rest of your books. When a batch expires and is written off, that is a real cost that has to hit your accounts at the right value, the actual cost of those specific units, not some averaged guess. A batch-aware system knows what that expired lot cost you, so the write-off is accurate and your remaining stock is still valued correctly. Handle it loosely and your inventory value drifts away from reality, and every report built on it inherits the error.

This is the same discipline we apply everywhere: the number has to trace back to something real. It is why batch tracking sits naturally alongside proper inventory costing, the subject of our piece on FIFO versus weighted average costing, and why both matter more for perishable goods than almost anywhere else. A batch has a cost and a date, and a serious system respects both, so that when the month closes your stock value, your cost of goods sold and your write-offs all tell the same, true story.

Do you actually need it?

Not every business does, and it is fair to say so plainly. If you sell hardware, machinery, furniture or anything that does not go off, batch and expiry tracking is overhead you do not need, and forcing it on would just slow you down. That is exactly why we keep it as an optional feature, switched on only for the businesses whose stock has a clock ticking on it, and left off for everyone else. The goal is never to make software more complicated than the business requires.

But if you are in pharma, food, cosmetics, agri inputs or any packaged-goods trade where a date decides whether stock is an asset or a liability, this is not a nice-to-have. It is the difference between managing your shelf life and being managed by it. The businesses that track batches sell the old stock before it expires, on purpose, every time. The ones that do not keep discovering their losses at the back of the warehouse, one write-off at a time.

Key insight

Expiry tracking does not really cost you money, it reveals money you were already losing. The write-offs were always happening; batches simply make them visible early enough to prevent. A business that can see every batch and its date turns most of its would-be losses back into ordinary sales, just by selling things in the right order.

If your stock has dates on it and your software does not, you are almost certainly losing more to expiry than you realise, quietly, at the back of the rack. Talk to us about what you sell and how fast it moves, and we will show you how batch and expiry tracking with first-expiry-first-out picking works inside NavoBook, warning you before stock ages out without ever getting in the way of a sale. NavoBook is one plan, PKR 30,000 a month, all 18 modules included, with an implementation team that sets it up around how your business actually runs. The details are on our pricing page.

Ready to see NavoBook in action?

All 18 modules. PKR 30,000/month. No hidden per-module fees. Start today.