Skip to main content

Features

A tour of what Pharma360 does and how each piece fits together.

Inventory & batches

Products carry a category, a regulatory schedule, a sell price, a unit, and a reorder point. Stock arrives as batches, and every change is recorded as an append-only movement (receipt, sale, adjustment, transfer, or return). On-hand quantity is derived from that ledger.

Expiry tracking

Each batch has an expiry date. Pharma360 groups stock into expired, expiring within 30 days, and within 90 days, so you can act before stock becomes a write-off. Expiry status is always computed from the current date — it is never a stored, stale field.

Low-stock & expiry alerts

When a product falls to or below its reorder point it is flagged as low stock; at zero on-hand it is out of stock. These, along with expiry warnings, surface on the dashboard and in notifications so nothing slips.

Point of sale (offline-first)

The POS supports M-Pesa and cash. Crucially, it works with no internet: each sale is written locally and queued, then drained to the server when you are back online. A sync indicator, an offline banner, and a queued-writes badge keep the state visible at all times.

Multi-branch

See on-hand stock across every branch in one view, and record transfers between branches. Reporting rolls up across branches without any parallel source of truth.

Roles & permissions

Access is role-based across Owner, Pharmacist, Assistant, and Cashier. Each role maps to a set of permissions — for example, only Owners manage settings, and only Pharmacists and Owners reach the clinical reference library.

Reports

Sales summaries, best and slow movers, and expiry-loss views are all sourced from the same sales and movement data — so the numbers on a report always reconcile with the ledger.