Pharmacy inventory management
A pharmacy does not get to run out of a chronic med on a Tuesday, and it does not get to dispense a bottle that expired last month. Inventory is patient care, cash on the shelf, and a record you may have to defend. Independent pharmacies, clinic pharmacies, compounding labs and veterinary pharmacies all feel the same squeeze: thousands of SKUs, dated stock, thin margins, and a team that cannot stop the counter to wrestle a spreadsheet.
This is not a pitch to replace your pharmacy management system. Dispensing, claims and e-prescribing belong in the software built for that. Simple Inventory Management is the stock layer next to it: live counts, lots, expiry, par levels, receiving and a search you can actually use when a recall lands.
What a pharmacy actually needs from inventory software
Pharmacy inventory is stricter than most retail stock. Every product has an expiry. Many have a lot or batch number you will need the day a manufacturer issues a recall. Fast movers need a par level so the wholesaler order is not a guessing game. High-value and tightly controlled items need a trail of who changed the count and when. Short-dated stock quietly turns into write-offs if nobody is rotating first-expiry-first.
The practical list looks like this:
- Perpetual counts that update when stock is received, dispensed, transferred or written off.
- Lot and batch tracking so a recall is a lookup, not a shelf-by-shelf hunt.
- Expiry dates on each stock line, with FEFO rotation instead of “whatever is in front.”
- Par levels and reorder points based on how fast you actually use the item.
- Receiving that captures the details while the tote is still open.
- Cycle counts and frozen snapshots so the record and the shelf stay honest.
- Locations for the fridge, the vault, the front end, the back room and a second store.
- Scanning from a phone or a barcode scanner, because typing NDC codes is how errors start.
Clinics and dental offices hit a similar set of problems with consumables. If that is closer to your setup, see inventory for dental and medical practices.
Put lot and expiry on the stock line, not in a notebook
A lot number ties a group of bottles back to a production run. When a supplier recalls lot “L-22841,” the only question that matters is: do we have any, and where? Store the lot as a unit-level custom field on the stock line. Hold three lots of the same SKU as three lines, each with its own lot and expiry, instead of inventing three items. NDC, manufacturer, storage condition (room temp, refrigerate, light-protected) and bin location belong in the same place: fields you can search and show as columns.
| Item | Stock | Lot # | Expiry | Bin |
|---|---|---|---|---|
| Amoxicillin 500mg | 48 | L-22841 | 2027-03-14 | A-04 |
| Amoxicillin 500mg | 36 | L-33012 | 2026-11-02 | A-04 |
| Insulin glargine | 12 | L-90115 | 2026-10-18 | FRIDGE |
| Saline 0.9% 500ml | 96 | L-44008 | 2027-01-09 | A-07 |
Rotate first-expiry-first, every time
Pharmacies live on FEFO: the pack that expires soonest gets dispensed first, even if a later delivery arrived yesterday. FIFO (oldest receipt first) is a decent default for undated goods. Dated meds need the expiry date to win. Capture expiry at receiving in a sortable format like YYYY-MM-DD, show it as a column, and put the short-dated stock where techs actually pick. More on the methods in FIFO vs. LIFO vs. FEFO.
Short-dated stock is also working capital walking out the door. A weekly look at what expires in the next 30, 60 and 90 days is cheaper than a surprise write-off, and it is the kind of question you can ask the built-in AI instead of building another spreadsheet.
Set par levels so low stock flags itself
A par level is the amount you want on hand before the next wholesaler drop. You do not need to know you have exactly 14 bottles of lisinopril 10 mg. You need to know you are under the 20 that gets you through lead time plus a buffer. In Simple Inventory that is a reorder point plus warning and critical levels, so items below par land on the order list instead of living in someone’s head.
Right-size those numbers from how the item actually moves, then revisit them when a shortage, a new prescriber or a seasonal spike (flu, allergy, back-to-school ADHD fills) changes the picture. Pair par with a modest safety stock on the few drugs that hurt patients when they stock out. Do not pad every SKU: shelf space and cash are both finite.
When something crosses the line, the alert should show up where the team already looks. Post low-stock alerts into Microsoft Teams so the pharmacist does not have to open a dashboard to learn that amoxicillin just went critical.
Receive the tote like the count depends on it (it does)
Most inventory errors start at receiving: a short shipment gets signed for, a lot never gets recorded, a refrigerated item sits on the counter. Check the delivery against the purchase order, count what is actually in the tote, capture lot and expiry on the stock line, then mark the order complete so on-order quantity becomes in-stock. The five-minute version is in receiving stock the right way.
If the box already has a UPC or EAN, store it and scan it. If you want a label that opens the item on a phone with no app to install, print a QR code for the bin or the SKU. Pharmacies can use both: barcodes for manufacturer codes already on the pack, QR for the shelf tag the tech actually hits between fills. A comparison is in barcodes vs QR codes.
Treat the fridge, the vault and the second store as locations
“We have 40” is not a useful number if 12 are in the fridge, 8 are in the controlled-substance cabinet, 15 are on the fast-mover wall and 5 are at the other store. Give each physical place its own location so transfers are a recorded move, not a text message. Multi-site habits are covered in multi-location tracking and keeping counts honest across locations.
Put a QR on the bin, not just the item. Scan the insulin fridge, see what should be there, adjust on the spot. Labelling the room is the afternoon project in label your inventory with QR codes.
Count on a schedule, freeze the record
Perpetual records drift. A miscount, a return processed wrong, a wasted reconstitution that never got logged: the system and the shelf disagree, and you only find out at the worst time. Cycle count the A-items (high value, high risk, fast movers) often, and the long tail less often. ABC ranking is the filter: focus on the 20% of stock that matters.
When you count, freeze it. Snapshots capture exactly what was on hand at a moment in time, which makes a monthly reconciliation, a biennial inventory, or a discrepancy investigation a comparison instead of a memory test. The process is in stock reconciliation and cycle counting vs. full physical counts.
Tightly controlled items deserve a tighter trail. Switch those SKUs to unit-level tracking so each pack or device is its own record with a status and a logged history, not just a quantity. That is how you answer “who had it, and when?” without reconstructing the week from memory. See an audit trail for every unit.
Compounding: treat the formula as a recipe
Compounding pharmacies do not just count finished bottles. They count APIs, bases, flavors and packaging, then combine them. An assembly is a recipe: list the ingredients and quantities, see how many you can make from live stock, and consume the parts when you build. Lot and expiry still live on the ingredient lines, so a recalled bulk powder is still a search.
The same idea covers clinic kits, immunization trays and DME accessories: a named bundle whose parts you already track, instead of a second count that will drift.
Ask before you order, not after you stock out
The built-in MCP server lets an AI assistant such as Claude or Grok read live stock (scoped to the company you authorize) and take the boring actions: check what is below par, list what expires this month, set a lot number on a stock line, draft a reorder list. No API keys pasted into a chat. Setup is in connecting AI.
Bring the catalog with you, not one SKU at a time
Independent pharmacies often already have a spreadsheet or a wholesaler export. A bulk CSV import with a preview is how you get live in an afternoon instead of retyping 2,000 items. Map names, costs, on-hand quantities, reorder points and the custom fields you actually use (NDC, lot, expiry). Details in the fastest way off spreadsheets.
From there, a one-click valuation and low-stock report tells you what the shelves are worth and what to order, and an export to QuickBooks or Xero keeps the books from becoming a second inventory.
Who this is for (and who should keep looking)
Simple Inventory fits a community pharmacy, a clinic dispensary, a compounding lab, a veterinary pharmacy, or the supply room that sits next to a dental or medical practice. It also fits the front end: OTCs, durable medical equipment, testers and bags, which many PMS inventory modules treat as an afterthought.
It is not PioneerRx, QS/1 or a hospital pharmacy information system. It will not submit claims, send an e-prescription, file a DEA Form 222, or run DSCSA serialization. If you need those, keep the system that does them. Use Simple Inventory where those tools are weak: dated lots, par levels the team will actually maintain, phone scanning, multi-location counts, and an AI you can ask about stock in plain language.
One plan, unlimited items and teammates, QR on every bin, custom fields for the details pharmacies cannot skip. Currently free for a limited time.