Pharmacy Retail and Dispensing Platform
A community pharmacy or small chain selling prescription and over-the-counter medicines alongside general goods, buying from several distributors at varying prices, holding stock in batches with different expiry dates, and dispensing against prescriptions from many prescribers.
The problem
A pharmacy is a retail business with clinical and regulatory obligations attached. Generic retail software handles the retail and none of the obligation: no batch, no expiry, no prescription record, no controlled register, no recall trace.
In scope
- Product and formulary
- Batch stock with expiry
- Point of sale
- Prescription dispensing
- Patient records
- Controlled items register
- Purchasing and receiving
- Pricing
- Reorder
- Multi-branch
- Reporting
- Access control
Out of scope
- Clinical prescribing
- Laboratory
- Insurance claim adjudication beyond recording the scheme and amount
- Wholesale and van sales — that is the Wholesale Distribution and Van Sales concept
- Drug interaction checking against a licensed clinical database — integrable, not built.
What this would cover
Grouped by module — open the ones you want to read.
Formulary and products
- Generic and brand name, strength, form, pack size, therapeutic class, prescription-only flag, controlled schedule flag, with explicit conversion between purchase pack and dispensing unit
Batch stock
- Quantity by batch with expiry and supplier, per branch; stock is never held at product level in the underlying record
Point of sale
- Over-the-counter sale, mixed baskets of medicines and general goods, cash, transfer, card and POS, split payment, receipt
Prescription dispensing
- Prescriber and prescription recorded, patient identified, item and quantity dispensed against the prescription, partial dispensing with the balance owed tracked, refusal recorded with a reason
Patient records
- Dispensing history by patient, allergy notes, chronic medication for refill prompting; light identity, since a pharmacy is not a clinic
Controlled items
- Separate register with tighter access, full movement audit, running balance that must reconcile, and a physical-count reconciliation workflow
Picking rules
- First-expiry-first-out suggested at dispensing and at sale, with an override that is logged
Purchasing
- Purchase orders, receiving with batch and expiry captured at intake, distributor price history exposing which supplier is cheapest over time, returns and credits
Pricing
- Cost-plus or fixed price per item, price by branch, price change history
Reorder
- Levels and consumption-based suggestion, low-stock and out-of-stock reporting
Expiry management
- Alerts at configurable horizons, expiry exposure valued in money, quarantine state, write-off workflow with reason and authorisation
Multi-branch
- Stock per branch, transfers with goods in transit, branch-level reporting
Reporting
- Sales by item, class and branch; margin by item using actual batch cost; dispensing volume by prescriber; expiry write-off; controlled item movement; stock valuation
Access control
- Pharmacist, dispenser, cashier, stock controller, manager; controlled items and write-off authorisation restricted
What it would look like
Concept mockup — an illustrative interface, not a built system.
6
Low stock items
₦94,000
Expiring in 30 days
Reconciled
Controlled register
| Product | Batch | Expiry | Status |
|---|---|---|---|
| Amoxicillin 500mg | B22014 | Nov 2026 | |
| Paracetamol Syrup | B21987 | Oct 2026 | |
| Insulin Vial | B21654 | Sep 2026 |
Data model
- Product → Batch → StockMovement
- Sale → SaleLine
- Prescription → Prescriber → DispenseRecord
- Patient
- ControlledRegisterEntry
- PurchaseOrder → GoodsReceipt
- Supplier
- Branch → Transfer
- WriteOff → Authorisation
- User → Role
Invariants
- Stock is held and moved at batch level, always.
- Nothing leaves without a movement recorded against a sale, a dispense, a transfer, or a write-off with a reason and a person.
- A batch past expiry cannot be sold or dispensed without a logged override.
- The controlled register balance is derived from movements and must reconcile to a physical count; a discrepancy is a recorded event requiring authorisation, never a silent adjustment.
- Selling price is captured on the sale line at the moment of sale; batch cost is captured from the specific batch dispensed, so margin is real rather than averaged.
Offline behavior
Point of sale must survive a network outage with queued local capture — a pharmacy cannot stop serving. Controlled items and stock transfers require connectivity, because a register that reconciles is worth more than uninterrupted convenience.
Hard trade-offs
The difficult decisions, stated plainly — not trimmed for length.
Batch capture at receiving is slower than counting boxes, and it is the foundation everything else stands on.
First-expiry-first-out, expiry forecasting, recall tracing, true margin and the controlled register all fail without it. A pharmacy unwilling to change its receiving process should be told plainly that it is buying a till.
Regulatory obligations here are specific and enforced — registration, record retention, controlled substance handling and inspection requirements.
Afivox builds to the obligations the pharmacy states and to its professional body's guidance; Afivox does not interpret the regulations on the pharmacy's behalf. [FILL: confirm PCN and NAFDAC record-keeping and controlled-substance requirements with the client's superintendent pharmacist before scoping. Do not publish specific regulatory claims on the website until verified.]
End state
What would be true about their day once this is running.
- Every unit in the pharmacy has a batch, an expiry and a real cost.
- Nothing leaves without a recorded movement and a name.
- Expiry is a forecast with a money value, not a discovery on the shelf.
- The controlled register reconciles and its discrepancies are events with authorisations.
- A recall can be traced to the batches received and to where they went.
- Margin is computed from what that batch actually cost.
Let's map how your operation actually runs.
One session. We look at what's breaking, and what we'd build around it — whether or not you hire us afterward.
Start the operations review