Back to work
Client
Strive Pharmacy
Product
Pharmacy Management System
Role
Product designer
Year
2026

Strive Pharmacy

Designing the workflow stations a compounding pharmacy actually runs on — and taking them into the codebase to prove they work.

Assembly workflow — scan and verify each item on an order

An order is not a screen. It's a physical thing moving through a building.

A compounding pharmacy fills prescriptions that don't exist off the shelf. Every order is made to a specific formulation, for a specific patient, and it travels through a sequence of stations on its way out the door — data entry, verification, fulfillment, a second verification, packaging, shipping.

Software for this has to match the building. The person at the packing bench is holding a physical order and needs the screen to catch up to them — not the other way round.

Designed in the codebase, not next to it

I designed the workflow stations end to end — the interaction design and the interface — then built them out in the product’s own codebase and opened them as pull requests for the engineering team to review and harden.

The point wasn’t to be the engineer. It was that every decision below got tested against real seeded data the day it was made, so the debate happened over something running rather than over a mockup.

Workflow stations across the pharmacy
[REPLACE: the six stage dashboards]

Orders don't arrive at every station in order

Early stations are a queue: work arrives in sequence and the screen can hand you the next order. Later ones aren't. At verification, packing and shipping, orders come off a cart in whatever order somebody stacked them — so a “next order” button is answering a question nobody asked.

Those three became scan stations. The operator scans the physical order and the system opens that order's workflow. A document-level keyboard-wedge hook captures the scanner's keystroke burst hands-free — no field to focus first, no button to press, which matters when both hands are holding an order. A de-emphasized manual entry sits underneath for damaged barcodes, and the lookup accepts either an order ID or an Rx number, scoped to the pharmacy and the station.

Scanning something that isn't ready for that station fails loudly and specifically rather than silently doing nothing — an unknown code and an order that hasn't reached this station are different mistakes and get different messages.

Scan station
[REPLACE: scan station idle state]
Scan error state
[REPLACE: wrong-stage scan error]

Verification should never be able to edit

The second verification station is a physical inspection: someone holds the finished product against the label and confirms it matches. It had inherited form fields from earlier in the workflow, which quietly invited the worst possible action — correcting a discrepancy instead of reporting it.

Patient data is now immutable at both verification stations. The operator confirms the patient matches the label, or flags a mismatch and sends the order back. There is no third option, because the third option is how a wrong order goes out with a right-looking record.

The station also stopped asking for the prescription number: the scan already identified the order. It shows a read-only label summary — Rx number, medication, strength, days supply — to inspect against, then verify or flag.

A directory is not a worklist

The two existing order views were worklists: things waiting for someone. The third view people kept asking for was different — every order, including cancelled and delivered ones, for when you need to find one rather than work it.

Treating it like its neighbours would have broken it. So it carries no count in the tab — the number would run to five figures and nobody is waiting behind it — and it opens narrowed to the last 48 hours rather than to everything.

Order directory
[REPLACE: the order directory]

The tab that had to be deleted

The order record had a Fills tab, and it could never have been right. A fill is a prescription-level fact — a prescription authorises a number of fills, dispensed across however many orders it takes — so a tab pooling “this order's fills” could only ever show the slice that happened to land here.

Fill history moved inside each prescription card, read directly against the quantity and fill count above it, showing every fill against that prescription with the one dispensed on this order marked. Nothing was dropped from the old page; it was reorganised into three tabs — Order, Prescriptions, Billing.

Multi-prescription orders got the same treatment: a “Prescription 1 of N” badge replaced an ordinal heading that read like a numbered step, making it legible that each prescription is verified on its own card.

Rules, not screens

Recurring decisions got written down as rules the whole product follows, so the next screen doesn't relitigate them:

Six stations, shipped

Every workflow station now has a dashboard built for how that station actually receives work, rather than falling through to a generic list. The verification stations can no longer be used to paper over a discrepancy, and the order directory answers the “just find me this order” question that the worklists were being misused for.

It shipped with 56 new tests covering the scan paths specifically — scan by order ID, scan by Rx number, unknown code, and scanning an order at the wrong station — because those are the paths where a failure means a person standing at a bench with no idea why the screen didn't respond.

6
Workflow stations designed and shipped
3
Hands-free scan stations replacing queue-fed screens
56
New tests across the stations and order views
Next project

Vimeo

View project