A Double Diamond case study on designing Compass, a prescription price-comparison app, built around one exact moment: picking a pharmacy blind, with no way to tell whether you're about to overpay by 30–50% for the identical prescription.
Compare the flow yourself ↓Atorvastatin 20mg, 30-day supply, five pharmacies within 4 miles of the same zip code
Without Compass, their plan was to just fill it at Harborview — the pharmacy nearest their doctor's office, and the second most expensive option on the list.
Compass is a prescription price-comparison app: patients add the medications they take, and Compass checks real, verified prices at every participating pharmacy nearby — before they ever commit to filling anything. Onboarding's whole job is getting someone from "I have a prescription" to "I know exactly where to fill it for less," in minutes, not a separate errand.
It's not a hypothetical. Independent pharmacy-pricing audits have repeatedly found that identical drugs — same manufacturer, same dosage — can vary 30–50% in price between chains within the same zip code, and the patients paying the difference usually don't find out until after they've already paid. There's no shortage of pharmacies. There's a shortage of any consumer-facing way to compare them before buying.
Design an onboarding where a real price comparison happens before any commitment is asked — not a separate coupon app to remember, not five phone calls, just the price, shown before the decision instead of discovered after it.
This problem had two very different kinds of ambiguity stacked on top of each other: first, an open question of why patients tolerate this kind of price opacity at all, when they wouldn't for almost anything else they buy (a discovery problem), and only once that was answered, a second open question of what a comparison tool would need to look like to actually be trusted, not just accurate (a design problem). Double Diamond's two explicit diverge‑then‑converge cycles kept those apart instead of collapsing straight from symptom to solution.
This was a solo project end to end — no separate research team to hand off to, no PM to arbitrate scope. Every trade-off documented below (what got cut, what got kept, what got argued with a pharmacist) is one I made myself, moving between roles as the work needed:
That's a scope statement, not a boast — a real team changes this. The pharmacist consult and the pricing-liability constraint below are exactly the kind of calls I'd bring to a clinical advisor and a data partner rather than resolve alone; I've flagged those seams throughout instead of pretending they aren't there.
of surveyed prescription users found out only after the fact that they'd overpaid
typical price swing found for an identical prescription across nearby pharmacy chains
competitor tools audited required you to already suspect you're overpaying before you'd think to open them
Fig. 1 — The double diamond, mapped to this project
Question everything about why the step fails, without assuming the fix yet.
Narrow to one insight and one problem statement worth solving.
Sketch multiple, genuinely different ways to solve that one problem.
Build, test, and refine the direction the evidence actually supported.
Four phases of research and iteration follow below before this screen gets earned, line by line. If you'd rather see the full flow first and backfill the reasoning after, it's waiting in Deliver.
Jump to the full walkthrough ↓Before designing anything, the goal was to understand the problem as widely as possible — market context, secondary research, and patients' own words — without narrowing to a fix too early.
Price-comparison already exists — just never inside the actual moment of choosing a pharmacy. Five products (and one very manual workaround) were audited for how they handle prescription price transparency.
| Product | What it does | Where it falls short today |
|---|---|---|
| GoodRx | Strong price comparison and coupons across most US pharmacies. | A separate app entirely — disconnected from any prescription list or refill flow. |
| SingleCare | Similar coupon-card model to GoodRx, broad pharmacy coverage. | Same disconnect: a patient has to already suspect they're overpaying to think to open it. |
| Amazon Pharmacy | Transparent pricing, but only for its own fulfillment. | Doesn't help a patient compare against their existing local pharmacy at all. |
| Ro | Vertically integrated pharmacy bundled into a telehealth flow. | No pharmacy choice at all — convenient, but opaque by design. |
| Included Health | Care navigation with pharmacy benefits guidance. | Guidance is manual, via a care advocate — not something a patient can self-serve in the moment. |
| Calling around | What most patients still do: phone 2–3 nearby pharmacies and ask. | Doesn't scale past a couple of calls, and pharmacy staff don't always know competitors' prices either. |
Every price-comparison tool on the market lives outside the moment a patient actually needs it — a separate app, a phone call, a coupon card you have to remember to bring. None of the six sit inside the actual decision: which pharmacy do I go to, right now.
220-person survey, prescription users.
A 220-person survey and 17 moderated interviews (14 patients, 3 caregivers managing a family member's prescriptions) ran in parallel with the secondary research.
"I'll spend twenty minutes comparing two blenders on Amazon. Why would I not check this? I just didn't know I could."
"I don't need the cheapest pill on earth. I need to know what this is going to cost us this month, total, before it just happens."
"It felt rude to question it, honestly. My doctor's system just sends it to whichever pharmacy's already on file. I didn't even know I could ask for somewhere cheaper."
Discovery surfaced a lot — pricing, trust, caregiving, insurance confusion. Define was about resisting the urge to solve all of it at once.
Patients weren't distrustful of pharmacies in general — they were distrustful at the one moment they were asked to commit to one blind. The pharmacy step didn't need less friction. It needed the one piece of information that made the choice reasonable: the price, shown before the commitment, not after.
So the pharmacy step stops asking patients to trust a number they've never seen.
Not a separate errand on a different app that a patient has to already be suspicious enough to go find.
So Walter can see what five prescriptions cost together at one pharmacy, in one glance.
Three rules, pulled straight from the HMWs above, that every decision from here on had to answer to.
Never ask someone to choose before showing them what it costs — the order of operations is the whole redesign.
A lower price has to arrive with proof — same drug, same manufacturer options, licensed pharmacy — not just a number in green.
If someone's managing more than one medication, the app does the adding up — they shouldn't have to.
A patient can identify the verified lowest-price nearby pharmacy unaided.
Measured in actual dollars a tester could see they'd save, not just a completion rate.
SUS and self-reported trust stay high — showing a lower price must not read as "cutting corners."
The insight was narrow. The solution space still wasn't — three structurally different ways to act on it were sketched and concept-tested with 5 testers before committing engineering time to any of them.
The app silently assigns whichever verified pharmacy is cheapest — no patient decision needed at all.
A separate "Compare prices" tab, sitting alongside the pharmacy step but not inside it.
Real-time price comparison shown directly inside the pharmacy step, before any pharmacy is confirmed.
A concept project skips real partnerships and funding rounds — it doesn't skip the constraints they'd create. These shaped decisions throughout, not just at the end.
Compass can't scrape or estimate pharmacy prices — a wrong number is a liability problem before it's a UX one. That's why every price on screen carries a "verified today" timestamp, and why the design assumes a licensed pricing-data partner — the same category GoodRx and SingleCare already rely on — not a first-party negotiation built from scratch.
Knowing what someone takes can reveal a lot about their health. Compass never asks for a name, date of birth, or condition to run a comparison — only a drug, a dosage, and a location — and nothing is stored server-side until a pharmacy is actually confirmed.
The same model GoodRx and SingleCare have already validated: the licensed pricing partner negotiates the discounted cash rate shown on screen as a "negotiated rate" — Compass doesn't set or mark it up. Compass earns a small referral fee from the pharmacy only when a comparison leads to a filled prescription, paid by the pharmacy, not the patient. That distinction shaped the design, not just the business plan: it's why the price breakdown always shows the negotiated rate as a pass-through, and why showing the true lowest price is never in tension with how Compass would earn money.
The chosen direction went through three rounds of hi-fi design and usability testing before this was considered ready to hand to engineering.
01 — Patients add every current medication, not just one.
02 — List view, sorted lowest to highest, total across both medications.
03 — Map view — the same data, for whenever distance matters as much as price.
04 — The "why" behind the number — including a check against the insurance added at onboarding.
05 — Confirmation reframes the choice as a win, not a chore.
06 — Edge case: unverified prices are clearly labeled estimates, never disguised as fact.
Respects Dynamic Type up to the largest accessibility size before truncating price labels; swipe-back gesture is reserved for navigation, not repurposed for sorting.
Primary actions stay in the bottom nav rather than relying on the system back gesture, which conflicts with edge-swipe on several OEM skins; font scaling follows the system setting, not a fixed app scale.
A simplified click-through of the same flow. Add a medication, compare, and confirm.
↑ Click through it
See every nearby verified price, sorted low to high, before choosing anything.
See exactly why a price is what it is — cash price, network rate, what's left to pay.
Commit with a visible number, not a leap of faith — and see the savings made concrete.
9 participants (5 remote moderated, 4 in-person, including 2 matched to the Walter persona), testing three tasks: adding two medications, identifying the verified lowest-price pharmacy, and understanding why a price was what it was before confirming.
4 of 9 participants hesitated on the cheapest option, assuming it meant an inferior or possibly counterfeit medication.
Added the reassurance badge — "Same medication. Same manufacturer options. Licensed pharmacy." — to every price detail screen.Testers couldn't tell at a glance whether the list was sorted by price or by proximity, and wanted to choose which mattered more.
Added an explicit sort toggle between price and distance, defaulting to price.Both older-adult participants managing multiple prescriptions tried to add up individual prices in their heads rather than compare pharmacies directly.
Added a combined "total at this pharmacy" rollup whenever more than one medication is on the list.Thumb reach, one-handed price scanning
Primary actions — compare, confirm — stay in the easy-reach band; price details scroll into view rather than requiring a stretch.
Color
Brand deep
#184F95
Brand
#2A78D6
Accent
#EB6834
Good price
#0CA30C
Fair price
#C77E00
High price
#D03B3B
Price-tier tokens
Elevation
Type scale
| Style | Family / weight | Size / line |
|---|---|---|
| Display | Newsreader, italic 500 | 32–74px / 1.0 |
| H2 / H3 | Newsreader, 560 | 20–40px / 1.2 |
| Body | Inter, 400 | 14–18px / 1.65 |
| Label | IBM Plex Mono, 600–700 | 10–12px / 1.3 |
| Data / price | IBM Plex Mono, 700 | 15–36px / 1.1 |
$21.00 · Verified today
Icons
Validated through iterative usability testing ahead of a planned engineering handoff.
Price transparency turned out to be a trust mechanic more than a savings mechanic. Patients didn't just want the lowest number — they wanted to understand why it was lower, and without that "why," a cheap price read as suspicious rather than reassuring. Showing the reasoning mattered as much as showing the number.
Next steps include extending the same comparison into the refill flow, not just onboarding; factoring in manufacturer copay cards and patient-assistance programs alongside cash and network pricing; and testing insurance-plan-aware pricing once claims data is available to the team.