← Back to work
Client
Strive Pharmacy × Hims & Hers
Product
RxVortex — Pharmacy Management System
Role
Product Designer
Stack
Elixir · Phoenix LiveView · Tailwind

RxVortex

A new & improved pharmacy management system for Strive Pharmacy

RxVortex assembly workflow

Due to HIPAA compliance, I’m only able to show a prototype version of the product, which I created myself. The prototype seeds data that replicates that of a real order from a provider. No real patient information appears anywhere.

In partnership with Hims & Hers

This is Strive Pharmacy in partnership with Hims & Hers — Strive fulfills GLP-1 medications for Hims & Hers. The scope of what is fulfilled by RxVortex is solely on GLP-1s for Hims/Hers like semaglutide, glycine B12, and tirzepatide. The majority of compounding pharmacies make most of their revenue through GLP-1 medications. While Strive has diversified their portfolio of compounded medications, when it comes to Hims/Hers specifically, the focus is GLP-1’s, which require unique handling and consideration.

Hims & Hers did about $725 million in weight-loss revenue last year, and Strive is one of the pharmacies fulfilling it. The volume and revenue was high, but we knew we could take it to the next level when we learned more about the current pain points the technicians, pharmacists, and business-related stakeholders were each facing.

User Experience, Product design, Contextual and Evaluative Research

I conducted research with providers, pharmacists, and technicians, then designed the workflows end to end, the interaction design and the interface, and built them in the product’s own codebase, opening pull requests for the engineering team to review. Everything below was tested against real seeded data, running in the app, rather than as mockups. Also, it is worth noting this is the first pharmacy management system ever made (in the world) using Elixir instead of Javascript. This presented its own special set of technical constraints, but it also gave us a lot of technical leverage for the problems we were facing. Elixir/Phoenix LiveView allow the PMS to ingest orders in real time and users are able to receive live updates across the system from where ever they are working.

“It’s pretty much an error system.”

Strive Pharmacy currently uses a pharmacy management system called LifeFile. The problem is that it’s very outdated, it’s very noisy, it’s very hard to navigate — it’s a very dense experience overall, so the learning curve is steep. It’s also the sort of software where they have to do everything manually. There’s very much a LifeFile way of doing things for every kind of task you can think of, and it creates a lot of extra work for them.

It’s also very hard to keep any sort of traceability in the app, and hard to get cross-functional communication through it — comments between departments, or even getting any kind of visibility between departments, is extremely hard in LifeFile. But ultimately, the main problem is just the level of errors it produces. You put in an order, and from start to finish there’s an extreme amount of churn to get it through all the way, because there are so many different manual checks all over the place — to the point where it’s just slow. They get behind. They ship orders late. Sometimes orders just get stuck. Simply stuck.

Assembly workflow — scan and verify each item against the shipping label
Assembly — the label preview on the left is verified against every item scanned on the right.

The whole product, from the ground up

Order management is the heart of it, but RxVortex covers the operation end to end:

Information architecture for version one of RxVortex
The information architecture for version one: the Order Management dashboard branching into user and supervisor dashboards per station, the Order Details page as the hub — order history, patient summary, Rx summary and hard copy — and the pages behind products, lots, MFRs, pricing, patients, providers, and practices. Click to open full size.

The line, station by station

An order moves through Data Entry (a data entry technician), PV1 (a PV1 technician), Fulfillment (a pharmacist or technician), PV2 (a pharmacist — it’s a pharmacist verification), and Assembly. Then it hits Packing/Shipping, a purely physical station — we don’t build any UI for it. The only thing the system does there is make a backend call to the shipping provider to get status on the order.

Each work area got a custom workflow and a modular dashboard specific to how that station receives work.

The full order lifecycle — from electronic order submission through data entry, PV1, payment, fulfillment, PV2, packaging, shipping, and delivery
The order lifecycle, mapped end to end: electronic order submission in, then data entry, PV1, payment, and fulfillment — with the compounding-lab loop when inventory isn’t available — through PV2, packaging, shipping, and delivery. Click to open full size.

How each station gets into an order

Stations like Data Entry and PV1 are given a next-order component on their dashboards — and the order is pretty much forced on them. The reason is that technicians will cherry-pick orders they think will be easier. The next-order component feeds them an order automatically, so we eliminate cherry-picking. That’s a business pain point, not a user pain point — obviously they’d love to cherry-pick orders, but that’s not good for the business. We fixed that for the business, to make the PMS more efficient.

Other stations are what we call scan stations — Fulfillment, PV2, and Order Assembly. A scan station doesn’t get fed an order the same way: they scan something to start an order, in whatever order they receive the item. They don’t have the cherry-picking pain point, because they’re fulfilling different needs for the order.

Fulfillment scans a lot, then weighs and fills the prescription. PV2 scans the barcode Fulfillment prints at the end of its work cycle — that scans in the prescription on the bottle. Order Assembly scans that prescription label too, then prints a shipping label. And Packing scans the shipping label.

It’s a two-sided thing: we thought about the business pain points, but we also addressed a lot of the technician and pharmacist pain points — largely around how they document, track, and resolve issues — through automation and traceability.

Verify against the original, flag what’s wrong

Data entry is queue-fed: the technician starts the next order and is fed the original document alongside the system’s record. They verify the information matches, make pharmacy-side changes where needed, and records update in real time.

When something is wrong, they flag a section issue — patient information, prescriber information, Rx information, or shipping information — and it routes to an Issue Hub, where another technician can fix it in the system in real time. Resolved issues send the order back into the queue. In version one, clinical and routing issues are still worked through HubSpot, which Strive uses third-party — anything data-related to the patient is solved inside RxVortex.

Data Entry Workflow — order record beside the live entry form
The Data Entry workflow — the order’s record on the left, the form on the right. The technician works section by section: patient, prescriber, Rx, shipping.
Address correction warning — this also updates the patient's profile
Correcting an address updates the patient’s record everywhere in the app, and the form asks you to acknowledge that before you can verify the section.
Flag an issue modal, scoped to Prescriber Information
Flagging an issue — it defaults to the section it was raised from, with a note on what’s wrong. This is what routes to the Issue Hub.
Shipping Information — address verified with the carrier, verify or flag actions
Shipping information, with the address verified against the carrier. Every section ends the same way: verify it (⌥V) or flag it (⌥F).

Flagged, resolved, back in the queue

As an order moves through the line, people flag issues as they see them. The issue bounces to the Issue Hub if need be, gets resolved, and the order comes back into the queue. The hub shows who flagged it, where it originated, which section, and how long it’s been waiting.

Flagged Orders — every flagged order across the line in one table
Flagged Orders — every flagged order across the line, searchable by issue code, type, origin, patient, or who flagged it.
Resolve issue modal — root cause and note required
Resolving an issue takes a root cause and a note, and the fix happens on the real record in real time.
Activity pane — resolution recorded with root cause and resolver
The resolution stays with the order — what was wrong, what fixed it, and who resolved it — in the order’s activity pane.

The standard of the pharmacy world

PV1 is the standard of the pharmacy world: a senior technician double-checks patient information, prescriber information, Rx information, billing, delivery, and a QR review — comparing what was typed into the computer against the original prescription hard copy.

It’s part of HIPAA, it’s needed for DEA regulations, and it’s quality assurance for the platform all at once.

PV1 Workflow — six decision cards against the full order record
The PV1 workflow — six sections to decide per order: patient, prescriber, Rx, billing, delivery, and the DUR review, checked against the full record on the left.
PV1 — two sections verified, Rx card open with SIG, date written, and refills
Two of six decided. The Rx card opens to each prescription’s SIG, date written, and refills, with Change one keystroke away.

Fulfillment, PV2, Assembly

At fulfillment, the lot gets picked, scanned, weighed, visually inspected, labeled, and binned for PV2. There, a pharmacist runs the secondary physical verification: free of particles, separation, and discoloration; fill amount correct; container and closure intact.

Assembly prints the shipping label — defaulted to UPS Next Day Air, because GLP-1 medications ship cold — then verifies the medication and every ancillary supply, alcohol prep pads and syringes included, is in the box. Packing packs it up and ships it out with what assembly handed over.

All along the line, issues get flagged as people see them, bounce to the Issue Hub, get resolved, and come back into the queue — with patient notes carrying the context for any change made at the order or patient level in real time.

Fulfillment Workflow — pick it, scan it, weigh it, look at it, label it, bin it
Fulfillment — pick it, scan it, weigh it, look at it, label it, bin it. The checklist enforces the sequence, and P sends the Rx label to the station printer.
Weighing the lot — weight recorded inline in the checklist step
Weighing the lot records right in the step — no side forms.
PV2 — physical verification checks per prescription
PV2 — the pharmacist’s physical verification per prescription: free of particulates, separation, or discoloration; container count; container and closure intact.
Assembly — shipping label verified, UPS Next Day Air as the default method
The shipping label at assembly, verified — UPS Next Day Air is the default because GLP-1 medications ship cold.
Order Assembly — scan and verify each item to assemble the order
Order assembly is scan-first — no queue, just scan each item to verify it into the box.

Keyboard-heavy super users

The crux of it all: we know the users are really keyboard-heavy users. So we took their current workflow and lifestyle and applied a super-user workflow on top of it, where they can just key-bind through everything they need to get through very quickly.

And not only can they do it with a keyboard — there are accessibility concerns too. If they don’t want to work that way, they can still use a mouse to get through everything. Through that, we reduced the time it takes to get through an order by more than 70%.

No more problem bucket

We effectively sped up orders by a significant amount — but we also created space for traceability, through audit logging and issue tracking. A lot of the reason this push happened was to get transparency-related metrics and be able to see across the entire order pipeline.

In LifeFile, things would be sent to a problem bucket, get lost, and then that order would just never be made. RxVortex doesn’t just help those situations — indirectly, it increases revenue too. Orders that get lost end up getting canceled, and that leaves a bad impression on customers. They aren’t going to be repeat customers if they’re having order issues.

That $725 million a year happened with every order churning through LifeFile. Cut the time per order by 70% and the same stations can handle more than three times the orders. There’s a lot of room for that number to grow.

3.3×
Order throughput, from a 70%+ reduction in the time it takes to get through an order
$725M
Annual Hims & Hers weight-loss revenue that Strive helps fulfill
100%
Of issues traceable from flag to resolution. Nothing disappears into a problem bucket
Next project

Vimeo

View project →