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
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. Record-keeping and controlled-substance requirements are confirmed with the pharmacy's superintendent pharmacist before scoping.
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.
This is what we'd build. Yours will look a little different.
Every concept on this page changes once we sit with how your operation actually runs. Tell us what's different about yours.
Start the operations review