Free AuditEnterprise AIShelfSense
Back to Blog
PharmacyJan 202617 min read

Why your POS system is letting expired medicines through

Most pharmacy billing software tracks stock quantity, not batch expiry. Here's why that distinction costs you lakhs.

Your POS knows you have 50 strips of Crocin. It does not know 12 of them expire next month.

This is the fundamental gap in almost every pharmacy billing system deployed in India, and it explains why pharmacies that consider themselves well-managed still end up with expired stock on their shelves.

The typical pharmacy POS works like this: product comes in, quantity gets added to inventory. Product gets sold, quantity gets subtracted. At any point, the system tells you that you have 50 strips of Paracetamol 500mg. Maybe it shows you that 20 were from the last purchase and 30 from the one before. If you are lucky, it recorded batch numbers during goods receipt.

What it does not do — what almost no pharmacy POS in the ₹5,000-15,000/year price range does — is track those 50 strips as belonging to specific batches with specific expiry dates, and use that information to determine which strips get billed first.

The POS sees inventory as a pool. Crocin: 50 strips. Sell 10, now 40. It does not see Crocin batch CR2405A (38 strips, expiry March 2027) and Crocin batch CR2312B (12 strips, expiry April 2025) as distinct entities requiring different handling.

Free Tool

Not sure how much you're losing to expiry?

Run a free inventory waste audit — find your bleeding SKUs in 60 seconds. No sign-up required.

Run free audit

The FIFO assumption that is built into the software

Most POS systems implicitly assume FIFO — that the first stock received is the first stock sold. This assumption is embedded in the software's inventory valuation and stock depletion logic. When you sell 10 strips of Crocin, the system deducts 10 from the oldest purchase batch in its records.

The problem is that FIFO is a financial accounting convention, not a physical reality. FIFO tells the POS how to account for the sale. It does not tell the pharmacist which physical box to pick from the shelf. And what happens on the shelf is where expiry lives.

On the shelf, newer stock almost always goes in front. The delivery arrives, the helper stocks the shelf, and the natural human behavior is to place new stock in the accessible position. Old stock gets pushed to the back. When the pharmacist picks Crocin for billing, they take from the front — the newest stock with the longest shelf life.

Meanwhile, the POS says FIFO was followed (it deducted from the oldest purchase record), but the physical reality is LIFO — last in, first out. Batch CR2312B, with 12 strips expiring in April, sits in the back of the shelf while CR2405A gets dispensed strip by strip from the front.

This is the blind spot. The POS reports a clean inventory. The shelf has a time bomb.

How this costs you money — the specific math

Take a pharmacy carrying 3,200 SKUs with average inventory of ₹12 lakhs. At any time, approximately 8-12% of SKU positions have multiple batches with different expiry dates. That is 250-380 positions where the FIFO/FEFO distinction matters.

Of those, in a pharmacy running standard POS without batch-level enforcement, approximately 15-25% will experience reverse rotation at some point — newer stock dispensed while older stock remains. That is 40-95 SKU positions per month where the wrong batch is being sold.

Not all of these result in expiry. Many correct themselves — the older stock eventually comes to the front when the newer stock depletes. But in a pharmacy with steady replenishment (new stock arriving regularly), the back-of-shelf batches can be perpetually pushed back.

Industry estimates put POS-invisible expiry at 0.3-0.8% of total inventory value per month for pharmacies in the ₹8-15 lakh monthly revenue range. On ₹12 lakhs inventory, that is ₹3,600-9,600 per month, or ₹43,200-1,15,200 annually. This is stock that expires without the POS ever flagging it because the POS does not know batch-level expiry dates, or knows them but does not use them to drive dispensing decisions.

The batch number field that does nothing

Many POS systems do have a batch number and expiry date field in the goods receipt screen. Pharmacy owners see this field, fill it in, and assume they have batch tracking. They do not.

Having a batch number stored in the database is not the same as having the system use that batch number to control dispensing. The test is simple: when you bill a product, does the system automatically select the earliest-expiring batch? Does it prevent you from billing a newer batch while an older batch has remaining stock? Does it alert you when a batch approaches its expiry date?

In the vast majority of pharmacy POS systems I have seen in Tamil Nadu, the answer to all three is no. The batch field is a data capture point for regulatory documentation, not a decision-driving field. It records information. It does not act on it.

This is the difference between cosmetic batch tracking and operational batch tracking. Cosmetic tracking stores batch data. Operational tracking uses batch data to enforce FEFO, generate expiry alerts, calculate return windows, and produce reconciliation reports.

What operational batch tracking looks like at the billing counter

When a pharmacist scans or selects Amoxicillin 500mg, the system shows:

  • Batch AM2312A: 30 strips remaining, expiry September 2025 (PICK THIS)
  • Batch AM2405B: 80 strips remaining, expiry March 2026

The system defaults to AM2312A. The pharmacist picks from the corresponding shelf position (which should be the front position if shelving followed FEFO). The bill records AM2312A as the dispensed batch.

If the pharmacist overrides to pick AM2405B instead, the system logs the override. This is useful for two reasons: it creates an audit trail for regulatory inspections, and it identifies shelving failures (if pharmacists frequently override FEFO, it means the shelf arrangement does not match the system's expected sequence, indicating a stocking process problem).

When AM2312A reaches 90 days before expiry, the system generates an alert: "30 strips of Amoxicillin 500mg batch AM2312A expiring September 2025 — within distributor return window. Action required." This alert appears regardless of whether anyone physically checks the shelf. The data drives the alert, not the human inspection.

The economics of switching

A pharmacy POS that includes genuine batch-level FEFO enforcement typically costs ₹2,000-4,000 more per year than one that only does cosmetic batch tracking. Some newer systems include it in their base price. The question is whether the incremental cost is justified.

The math: if your POS-invisible expiry is at the conservative end — ₹43,000 per year — and a system with operational batch tracking prevents even half of it, the system pays for itself in the first year. At the higher end (₹1,15,000), it pays for itself in the first quarter.

Add the avoided regulatory penalties (₹50,000+ per CDSCO violation), the recovered distributor returns (which require knowing batch-level expiry to act on return windows), and the freed-up pharmacist time (no more monthly manual shelf checks), and the return is even clearer.

Why this matters beyond just money

There is a patient safety dimension that pharmacy owners rarely discuss in business terms but think about privately. When expired medicines are dispensed — even if their potency loss is marginal — the pharmacy is exposing patients to reduced therapeutic effect. An antibiotic that has lost efficacy due to expiry may not clear an infection, leading to treatment failure and potential antibiotic resistance.

No pharmacy owner intentionally dispenses expired medicines. But a POS system that does not enforce FEFO creates conditions where expired dispensing can happen without anyone knowing. The pharmacist picks from the front (newest stock), the POS records a FIFO deduction (oldest purchase record), and the expired stock in the back sits undiscovered until a shelf check or an inspector finds it.

Operational batch tracking closes this loop. The system knows what is where, what expires when, and which batch should be dispensed next. The pharmacist follows the system's guidance. The expired-dispensing scenario becomes structurally impossible rather than probabilistically unlikely.

POS audit checklist: does your system have real or cosmetic batch tracking?

Before you invest in a new system, test your current POS. These eight checks take 15 minutes and reveal whether your batch tracking is operational or decorative.

Test 1: Bill a product and check which batch was deducted. If the system deducted from the earliest-expiry batch automatically, you have operational FEFO. If it deducted from the oldest-received batch or did not specify a batch at all, you have FIFO or no batch logic.

Test 2: Try to bill from a newer batch when an older batch has stock. Does the system warn you, allow it silently, or not even present the choice? Operational systems warn. Cosmetic systems do not know.

Test 3: Run an expiry report for the next 90 days. Does the report show specific batch numbers and quantities, or just product names? Batch-specific reports indicate the system is tracking at the batch level. Product-level reports indicate SKU-level tracking dressed up as batch tracking.

Test 4: Check if the system generates alerts before expiry. Look for automatic notifications — not reports you have to pull, but proactive alerts that appear without you asking. Systems that alert at 90, 60, and 30 days before expiry are operationally useful. Systems that only show expiry data when you specifically run a report are reactive.

Test 5: Look for a batch-level stock register. Can you see, for any given product, how many units are in each batch and when each batch expires? If you can only see total quantity, the batch data is stored but not used.

Test 6: Check goods receipt for mandatory expiry date fields. During a new purchase entry, is the expiry date field mandatory or optional? If optional, your staff has been skipping it. If mandatory, at least the data is being captured.

Test 7: Verify batch-level sales history. Can you see which batch was sold in a specific bill? Operational systems record the dispensed batch. Cosmetic systems record the sale at the product level and deduct from batches using an internal algorithm you cannot verify.

Test 8: Check for override logging. If a pharmacist overrides FEFO and dispenses a newer batch instead of an older one, does the system log the override with a reason? Override logs are the hallmark of a compliance-ready system.

If your POS fails 4 or more of these tests, you have cosmetic batch tracking. The batch number field exists in the database, but it does not drive any operational decision.

Migration playbook: switching from SKU-level to batch-level POS

Switching POS systems — or upgrading your current one to enforce batch-level tracking — is disruptive. The stores that do it successfully follow a structured approach.

Week 1-2: Parallel run. Run both the old system and the new batch-level system simultaneously. All transactions go through both. This is painful but necessary — it validates that the new system's data matches reality and gives staff time to learn without the pressure of being the only system in use.

Week 3: Cutover for new purchases only. Stop entering new purchases in the old system. All new goods receipts go into the batch-level system with full batch and expiry data. Existing inventory remains in the old system and gets sold out naturally. This avoids the impossible task of retroactively assigning batch numbers and expiry dates to existing shelf stock.

Week 4-6: Full transition. As existing stock from the old system depletes (most fast-moving items clear within 2-4 weeks), the batch-level system becomes the primary record. By week 6, only slow-moving items remain in the old system. For those, do a one-time physical stock take, record the batch and expiry data, and enter them into the new system.

Training sequence: Start with the receiving staff — they need to capture batch numbers and expiry dates accurately during goods receipt. Then train billing staff on the FEFO prompts — how to read the system's batch recommendation, how to override when necessary, and why overrides should be rare. Finally, train the store owner or manager on the reporting — expiry alerts, batch-level stock reports, and override logs.

The productivity dip is real. During weeks 1-3, data entry takes 20-30% longer because staff is learning and because batch-level entry genuinely requires more fields per transaction. By week 4-5, the speed returns to normal as the process becomes automatic. By week 8, most stores report that the batch-level workflow is actually faster for billing because the system pre-selects the correct batch, eliminating the pharmacist's decision time.

Regulatory documentation benefits

For pharmacies specifically, batch-level tracking produces documentation that regulators explicitly look for during inspections.

CDSCO and State Drug Controller inspections evaluate whether your dispensing records can trace a specific unit back to its batch, its supplier, its receipt date, and its expiry date. A POS that records batch-level sales gives you this traceability automatically. A POS that records SKU-level sales forces you to reconstruct this chain manually — which, during an inspection, means flipping through paper invoices while the inspector waits.

Schedule H and H1 register maintenance requires batch-level recording of controlled substance transactions. If your POS already tracks batches for all products, the Schedule H1 register is a filtered view of existing data. If your POS tracks at the SKU level, you are maintaining the register manually as a separate process — doubling the work and doubling the error potential.

Batch-level recall response: When a drug recall targets a specific batch, a batch-tracking POS tells you immediately: how many units of that batch you received, how many you dispensed (and to which bills), and how many remain in stock. Without batch tracking, you know you carry the product but cannot determine which customers received the recalled batch.

POS comparison by price tier

Capability₹5,000-8,000/year POS₹8,000-12,000/year POS₹12,000-18,000/year POS
Batch number field in receiptYes (optional)Yes (often mandatory)Yes (mandatory)
Expiry date field in receiptSometimesYesYes
FEFO auto-selection at billingNoSometimesYes
Expiry alerts (automatic)No30-day only90/60/30 day tiered
Override loggingNoNoYes
Batch-level sales historyNoPartialFull
Distributor return window trackingNoNoSome
CDSCO-ready batch reportsNoBasicComprehensive

The ₹5,000-8,000 tier is adequate for pure billing. It records transactions, generates invoices, and files GST returns. It is not adequate for batch-level inventory management. The ₹12,000-18,000 tier provides operational batch tracking — but only if you configure and use the features. An expensive POS with batch tracking turned off is the same as a cheap POS without it.


At [ShelfLifePro](/get-started/), batch-level FEFO tracking is the core of what we build. Our production deployment is with Dharmik Supermarket in Coimbatore — grocery, not pharmacy. But the architecture is identical: every unit tagged to a batch and expiry, every transaction recorded against a specific batch, every approaching expiry flagged before it becomes a problem. The gap your POS has is the gap we built the product to fill.

See what batch-level tracking actually looks like

ShelfLifePro tracks expiry by batch, automates FEFO rotation, and sends markdown alerts before stock expires. 14-day free trial, no credit card required.