BESTMED  /  Aged care  /  Enterprise platform

Ordering, dispensing and receiving.

Ordering, dispensing and receiving across BESTMED's two connected systems: Facility, on the ward, and Pharmacy, in dispensing. It covers an order from the moment a nurse raises it to the moment the delivery is checked in against it.

Facility, on the ward

Facility Ordering screen, Deliveries tab, with three deliveries awaiting check-in and a tote barcode field
  1. order.submitted, Facility to Pharmacy
  2. order.status.changed, Pharmacy to Facility
  3. order.line.dispensed, Pharmacy to Facility
  4. order.completed, Pharmacy to Facility
  5. delivery.receipted, Facility to Pharmacy
  6. discrepancy.reported, Facility to Pharmacy

Pharmacy, in dispensing

Pharmacy Orders screen, Check tab, with orders part-scanned and a Scan off button on each row
The same order on both sides of the seam. Six named events cross between the two systems, each arrow showing which way it travels, and most of them hang off one dispense-label barcode.
What constrained it
Two products, two engineering teams, one regulated process. Schedule 8 medications require a witnessed count that cannot be softened for the sake of a smoother screen, and nothing could be designed that assumed a shared database the two systems do not have.
What I prioritised
Closing the loop before polishing either end. A traceable order mattered more than a faster one, so I spent the first phase defining the six events that cross the seam and the single identifier they hang off, then designed screens against that contract.
What I traded
Speed at the point of ordering. The cart adds a step to a task nurses repeat all day, and the scan gate stops them opening a delivery list they are not standing in front of. Both are deliberate: the loop only holds if the ward's receipt is real.
Client
BESTMED
Systems
Facility & Pharmacy
Role
Sole UX/UI designer
Stage
Prototype
Constraint
S8 compliance
01
Discovery

How both systems were mapped.

Four maps, drawn live in business-analysis sessions: the seam as it stands today, then each module end to end, then the one mechanism that has to cross between them.

The current connection between Facility and Pharmacy
Before  /  Chart 01

Everything the facility can raise converges on a single press, and that press puts one row in the pharmacy queue. The only other thing that crosses the boundary is the message thread - status comes back, nothing else does.

Diagram: the current seam between Facility and Pharmacy
Ordering, end to end
After  /  Facility

The whole module on one page. Every order type is staged in the cart and leaves in one submit; the right-hand half - everything after the delivery arrives - has no counterpart in the current ordering flow.

Diagram: ordering, end to end
Lifecycle, the whole module on one page
After  /  Pharmacy

Five fixed stages, one hold loop, one gate that cannot be skipped. Solid arrows advance, rust arrows hold, the dashed green route is Send to skipping forward, and the dashed grey route is release.

Diagram: pharmacy lifecycle
One barcode, two scans
Mechanism  /  Chart 03

The dispense label barcode is the only identifier physically attached to the medication. It is created once and read twice, and each read answers a different question. The third step is not a scan at all.

Diagram: one barcode, two scans
02
The problem
Facility

Receiving sits outside ordering.

Raising an order means choosing from six separate tiles, four of which submit immediately - no cart, no review, no undo beyond a separate Cancel afterwards. Rows can appear locked with no explanation, and the Urgent flag is hidden by a facility-level setting more often than not, so the warning about ordering after cut-off appears on a form with no way to mark the order urgent. The bigger gap is that receiving isn't part of the ordering flow at all. Check-in lives in BESTtrack, a separate module, and it is entirely manual: the nurse searches for each resident by name, opens them one at a time, picks the medication and types in the current stock level. Nothing on that screen refers to the order it answers, so a delivery is never checked against what was ordered, and the pharmacy never hears what actually arrived.

03
The problem
Pharmacy

The queue disagrees with itself.

The queue's default date range silently disagrees with the count that linked into it, so clicking a facility's own "22" can land on "No items to display." Its summary labels don't match the queue's actual states, so the pharmacist translates on every click, and the task spans three different shells with browser back crossing app boundaries. "Add to Dispense List" doesn't add anything to the dispense list - it silently sets the order to Pending - and when a dispensing report does load it arrives with every row pre-ticked, so one press of Dispense can dispense an entire facility's orders at once with no confirmation, no toast and no undo.

04
The solution
Closed loop

Six events, one barcode.

The redesign closes the loop with six named events crossing between the two systems. Most of them run through one mechanism: a dispense-label barcode, created once by the pharmacy at Confirm dispense and read twice - at the pharmacist's own check, and again by the ward at goods receipt. It's the one field that has to be written back to Facility for the ward's scan to mean anything; without it, check-in degrades to a manual checklist.

01
order.submitted
The order itself crosses into the pharmacy the moment it's sent from the cart.
02
order.status.changed
Every pharmacy stage maps back to one of four ward-facing steps.
03
order.line.dispensed
Data only. Writes the barcode onto the order line and arms the ward's scan; moves nothing itself.
04
order.completed
Fires when the pharmacist has scanned off every item, and puts the order on the ward's expected deliveries.
05
delivery.receipted
The ward's own receipt becomes the proof of delivery, not the pharmacy's claim of it.
06
discrepancy.reported
Lands as work the pharmacy still owes, not a silently closed order.

On the facility side, ordering becomes one screen with five tabs replacing the six-tile hub, the cart becomes a real review step, and Deliveries brings receiving into the ordering flow: a scan-gated check-in list, a decision tree for what a scan resolves to, and a discrepancy report the pharmacy can act on. On the pharmacy side, the queue becomes five fixed stages - Unprocessed, Pending, Waiting, Check, Completed - with role gates printed on the actions themselves, so a Packer accepts, dispenses and hands off, a Technician can move and hold orders, and only a Pharmacist or Manager can scan an order off into Completed.

05
Redesign
Facility

One screen, five tabs, and a receiving gate.

Prototype captures from the tablet design, not yet tested with nurses. The five tabs replace a six-tile hub; the three check-in states are what happens once a delivery lands on the ward.

Tabs
Check-in
New Order
Plate 01
New Order screen
Order type first, then everything reshapes
Four order types become pills where today they are four separate tiles, and the filter strip below reshapes to match. Every row is a charted line, so a nurse cannot invent a medication here, and rows check themselves against history: 'Already on order' for a live duplicate, 'Recently cancelled, confirm need' where the same medication was pulled back.
Pending Cart
Plate 02
Pending Cart screen
One cart, one send, named destination
The review step the current product does not have. Every order type lands here together, category chips count what is actually in the cart rather than what exists, and the submit button names the quantity and the pharmacy before the nurse commits: 'Submit order, 12', above 'Order will be sent to Unanderra Pharmacy'.
Order in Progress
Plate 03
Order in Progress screen
A four-step track and a thread per line
Submitted, At pharmacy, Dispensed, Delivered, each stamped with the time the order reached that step, with a message thread addressed to the supplying pharmacy and unread counts tracked per user. Once delivered, the row carries a link back to the tote it arrived on.
Deliveries, the receiving gate
Plate 04
Deliveries screen
Visible to all, locked until scanned
What is expected today is listed for everyone, but contents stay locked until the physical tote is scanned: you cannot tick items off a delivery you are not standing in front of. Any tote carrying a controlled drug is flagged S8, witness required, before it is opened. Seeded totes run 24 to 78 lines, matching real deliveries of 50 to 100.
History
Plate 05
History screen
Filters first, nothing loads until you search
The archive, now that in-flight orders have their own tab. Searchable by section, resident, priority, status, type and date range, including historical sections and historical residents, which an audit needs and the current product hides.
Scanning the tote
Plate 06
Tote barcode scan
Five answers, not a beep
A scan resolves to one of five outcomes, each written as a sentence: a match checks the item in; another delivery's barcode says which delivery it belongs to and not to check it in here; an unknown code says set it aside and call the pharmacy; an already-done item says so; an S8 is blocked until a second-nurse witness is present. Filter chips count the work left, against a header that reads '0 of 78 checked in'.
Witnessed S8 check-in
Plate 07
S8 dual signature panel
A register entry, not a confirmation dialog
The arithmetic is shown before anyone signs: register balance 12, received 20, new balance 32. The nurse on the device signs, a second-nurse witness is picked from staff on shift and confirmed with a PIN, and the storage instruction is named on the panel. Both signatures are written to the S8 register and cannot be edited afterwards.
Reporting a discrepancy
Plate 08
Report discrepancy panel
Every way a delivery can be wrong
Seven named issues, from not in tote to cold chain breach, so the ward reports the actual fault rather than free text the pharmacy has to interpret. Each gets a quantity, optional photo, and one of four pharmacy actions: resend today, next delivery, credit only, or pharmacist to call. The shortfall then moves back into Order in Progress, so a short delivery stays owed instead of closing with the receipt.
06
Redesign
Pharmacy

Unprocessed, Pending, Check, Completed.

The Product Manager started the pharmacy rework. I helped shape the solution and produced the UX and UI designs: five fixed stages, with role gates printed on the actions themselves. One plate per stage follows, then the stage picker and the teams a pharmacy owns.

Screens
Unprocessed
Plate 09
Unprocessed, grouped by resident
One queue, regrouped for how the bench actually works
Every stage carries its own badge count and urgent orders sort to the top. Each row carries the medication, the quantity and when it was last ordered for that resident, so a repeat raised too soon is visible before anyone accepts it. Group by resident, order type, facility or medication: order type collects every Med Change and Monthly Eye Drop into one pass, and medication turns the queue into a picking list, so one trip to the shelf covers every order for the same medicine. Actions a role doesn't hold are never shown as disabled controls, so a Packer isn't staring at greyed-out actions meant for a Pharmacist.
Pending, team queues
Plate 10
Pending, team queues
Dispensing and labelling happen in one stage
Pending holds the team queues a pharmacy sets up for itself: here Packing, Dispensing and Pharmacist. In a sequential pharmacy the only move is a hand-off to the next team; in a parallel one any team can pull any order. Items, labels printed and status are on the row, so a part-labelled order is visible as such. The ward only ever sees “At pharmacy,” however many teams the order passes through.
Waiting, held orders
Plate 11
Waiting, held orders
A hold is a reason, an owner and a follow-up time
Six named reasons, each with its own release rule: script required and account release themselves when the blocker clears, the rest need a person. Sorted by follow-up overdue rather than by age, with the latest note on the row, so the queue reads as work owed rather than a pile of exceptions. Release always returns the order to the stage it was held from.
Check, scanning off
Plate 12
Check, scanning off
The dispense point, and the only way into Completed
Responsibility for the supply attaches here, at the pharmacist's own scan-off, not at Confirm dispense. A pharmacist can scan off several items or orders in one go, with Scan off on the row or Scan off selected on the bar. An order moves to Completed only when every item is off; a part-scanned one like O'Brien's, at 2 of 3, stays on Check. Scan Barcode is a search tool, not a sign-off: on any tab it finds the order wherever it sits in the funnel. Check can't be switched off, and a Packer or Technician who tries to scan off is told check-off is restricted, with nothing changed.
Send to, the stage picker
Plate 13
Send to, the stage picker
One picker instead of a row of one-step buttons
Send to lists every stage the order can go to from here, with the pharmacy's teams indented under Pending. It can skip forward through the bench or step back to any earlier stage, but Completed is never on the list: an order only gets there through the pharmacist's scan-off. Waiting sits at the bottom because a hold always needs a reason.
Completed, the record
Plate 14
Completed, the record
A record, not a queue
Read-only. Each order shows when it was completed and who received it on the ward, taken from the facility's own goods receipt rather than the pharmacy's claim. The bar prints a delivery report or exports proof of delivery for the day, and nothing on this tab moves an order.
Configuring the teams
Plate 15
Configuring the teams
Every pharmacy packs differently, so Pending bends to them
The five stage names are fixed, so a pharmacist moving between sites reads the same words everywhere. What a pharmacy owns is the level underneath: Pending split into the teams that actually run the bench, working in sequence or as parallel pools, or left as a single queue.
07
Outcome

Traceable rather than assumed.

Success means an order can be traced from the moment a nurse raises it to the moment it's verified on the shelf, across two separate products built by two separate teams, with no manual reconciliation step in between. The six crossing events and the shared barcode make that traceable rather than assumed.

Four entry points became one
The four order types were four separate tiles, each with its own screen and its own submit. They are now one selector on one screen that reshapes beneath it, so a nurse learns the ordering task once instead of four times.
A review step where there was none
Orders previously left the ward one line at a time with no chance to check them. Every type now collects in one cart and leaves in one send that names the quantity and the destination pharmacy, which is also what makes a single order identifier possible downstream.
Six phone calls became six events
The status questions that were answered by ringing the pharmacy are now defined crossings between the two products, each with a state on both sides. Nothing about the order has to be reconstructed by asking someone.
Typing became a scan
Check-in used to mean finding each resident by name and typing in a stock level by hand. A scan now identifies the pack and resolves to one of five named outcomes written as instructions, so the exceptions that used to end in a paper note are handled inside the receiving task.
Status

Neither side has shipped. The pharmacy side has been through sanity-check sessions with pharmacists; after a round of UI refinement, the business analyst writes the specs and it moves into development. The facility side follows, and hasn't been tested with nurses yet.