Pharmacies & pricing: let patients pick a pharmacy
Set a patient price and your cost per pharmacy for every dose, let patients on Patient App v2 pick a pharmacy, and see your margin by pharmacy.
If you work with more than one pharmacy, you can give each one its own patient price and your own cost for every dose option. Patients on Patient App v2 then see the price from each pharmacy, start on the lowest one (or your pick), and can choose another in one tap. Every order records which pharmacy fills each line and what it costs you, so you can ship from the right place and see your margin by pharmacy.
Nothing changes until you turn it on. Patients on the current app keep paying the product's own price.
Turning it on
Go to Settings → Features and switch on Pharmacy choice. Two things happen:
- Patients on Patient App v2 see per-pharmacy prices for the products you price this way, and can pick a pharmacy.
- Checkout always charges the prices on file, on every version of the app. A patient whose app shows an older price is asked to review it before paying.
Under the switch, choose what patients start on:
- Lowest price: the cheapest of your pharmacies for that dose.
- Our pick: the pharmacy you mark as your pick. For any size your pick doesn't offer, patients start on the lowest price instead.
Pharmacy choice is included on every plan. Turn it off at any time: patients go back to the product's own price and nothing you entered is lost. Auto-refill subscribers keep the price they enrolled at until they turn auto-refill off and on again.
Your pharmacies
Settings → Pharmacies lists every pharmacy you order from. For each one you can set:
- Name: your name for it (internal, and the name on your vendor agreement).
- Patient-facing name and Description (up to 140 characters): what patients see, for example "Licensed compounding pharmacy in Florida".
- Ships in: the fewest and most days it takes to ship, shown to patients as "Ships in 2 to 3 days".
- Show to patients: off by default. A pharmacy patients can't see is never offered, whatever its prices.
- Our pick: one per clinic. Patients see it marked as the clinic's pick.
- Active: off keeps its prices but never offers it.
- States served, contact and notes are for your team only.
A pharmacy that still has active prices on a product can't be deleted. Turn those prices off first, or switch the pharmacy to inactive instead.
Prices and costs
Open a product, go to its Pricing tab and you'll see a grid: one row per size, one column per pharmacy shown to patients. Each cell has a Patient price and Your cost.
- Your cost is internal. Patients never see it, and it never appears in emails, push notifications, HighLevel or your payment records.
- A size with no pharmacy price is charged its house price (the size's own price on the product).
- Paste from spreadsheet fills the grid from copied cells, and Copy to all sizes of this strength repeats a row.
- The Monthly plan price stays the same whichever pharmacy fills it. The pharmacy only decides who ships it and what it costs you.
Price lists, CSV import and undo
Each pharmacy has a Price list (Settings → Pharmacies → Price list) with every size you ship, its house price, the pharmacy's patient price, your cost and the margin. From there you can:
- Export CSV, edit the file in your spreadsheet, and
- Import CSV: match the columns (SKU, or product and size, then patient price and cost), then Check file. Nothing changes yet: you see what matched, what didn't and every price that would change.
- Import the changes when the preview looks right.
You can Undo import for 24 hours. Undo puts the earlier prices back; any price you edited by hand since the import is left as it is.
What patients see
Only patients on Patient App v2, and only for products you have priced per pharmacy:
- The price they start on, with the pharmacy's name, such as "Hallandale · lowest price".
- Pick my pharmacy opens a list of your pharmacies with their prices and shipping times, lowest first. The lowest price is always marked, and so is your pick.
- Under the list: "Your provider reviews the order before anything ships, whichever pharmacy you pick."
- Their orders show "Filled by" with the pharmacy's patient-facing name.
The pharmacy's name appears in the app only. Patient emails and push notifications never name a pharmacy.
Auto-refill never charges more than the price a patient enrolled at. If the price drops, later refills charge the lower price; if it rises, they keep the enrolment price.
Lowest price or your pick
"Lowest" always means the lowest among your own pharmacies for that dose, not a market price, and the app never claims your pharmacies' products are the same. If two pharmacies have the same price, your pick comes first, then the one that ships faster.
If a patient picked a pharmacy that can no longer fill a dose (you turned it off, or removed its price), checkout tells them and asks them to pick another. Their choice is never swapped silently.
Orders and fulfillment
Every order line records its pharmacy, the price and your cost at the time of purchase, so renaming a pharmacy or changing a price never rewrites history.
- Orders gains a Pharmacy column and filter.
- Needs fulfillment chips count orders waiting to ship per pharmacy (paid orders, and free ones such as a free-product reward), for example "Hallandale 4 · Empower 2". Click a chip to see just those orders.
- On an order, each line shows its pharmacy, how it was priced (lowest price, patient's pick, clinic's pick or Monthly plan) and your cost. An auto-refill line shows the same: Monthly plan when it was charged the Monthly plan price, otherwise how its pharmacy was picked.
- When you add tracking, the parcel's pharmacy is filled in for you. A cost you enter on a parcel replaces the expected cost for that pharmacy's lines. A costed parcel that names no pharmacy, or a pharmacy that fills none of the order's lines (you shipped it from another pharmacy), counts as the whole order's cost.
Orders still go through clinical review exactly as before: an order that needs review is ready to ship only once a prescriber approves it.
The pick list
Click a Needs fulfillment chip, then Pick list. You get a printable sheet for that pharmacy: totals by item and dose, then every order waiting to ship (paid or free) with its order number, the patient's name, the shipping address and the items and quantities that pharmacy fills. Lines another pharmacy fills are left off.
The pick list is made in your browser from your orders. Nothing is sent to the pharmacy: click Print, or save it as a PDF from the print dialog and send it the way you always do. Every printed page names the pharmacy and the date.
Margin by pharmacy
Analytics → Margin by pharmacy (shown while Pharmacy choice is on) shows, for the last 30 days, 90 days, 12 months or all time:
- Orders and Units per pharmacy.
- Revenue: what patients paid, less any refund. When an order has lines from two pharmacies, it is split by list price, after any coupon or credit.
- Cost: the parcel cost you entered for that pharmacy, or otherwise its cost when the order was placed. A row with no recorded cost shows Not recorded.
- Platform fee: the platform's fee on payments through your connected Stripe account.
- Gross profit and Margin.
Paid, partly refunded and free orders count: a partly refunded order counts what the patient kept paying (with its full cost), and a free order counts its cost with no revenue. Unpaid, cancelled, fully refunded, disputed and duplicate records are left out. Lines charged the house price are shown as House price. Orders from before you turned on pharmacy choice appear under the pharmacy their parcels name. An order filled by two pharmacies counts once in the total. CSV downloads the table.
The cost of goods on the Orders stats counts paid orders only, like its revenue, so an unpaid, free or refunded order's cost does not lower the profit there.
Sending orders to a pharmacy's own system
By default the platform sends nothing to any pharmacy: you send orders the way you do today. If a pharmacy wants to receive its orders in its own system, you can give it a key to the partner API that only sees its orders.
In Settings → API, create a key and choose Bind to pharmacy (the option appears once Pharmacy choice is on; API access is part of the Growth and Enterprise plans). A bound key:
- sees only orders that are paid (or free), past clinical review when the order needs one, and have a line that pharmacy fills. Auto-refill renewals need no review, so they reach it as soon as they are charged;
- sees only those lines: never another pharmacy's lines, prices, order totals or your costs;
- sees only the patient's name, phone and shipping address;
- can read and update those orders and subscribe to their order events, and nothing else (no patient list, messages, products or subscriptions);
- on an order another pharmacy also fills, can add its tracking number but not change the order's status, which stays yours to set.
The first time you bind a key to a pharmacy, you confirm this statement:
{Pharmacy} is our vendor. We instruct HL Patient Portal to send it the patient and order details it needs to fill orders, under our agreement with {Pharmacy}.
HL Patient Portal is ClinicBond's previous name. The statement keeps the wording clinics have already confirmed.
Your confirmation is recorded on the pharmacy, with who confirmed it and when, and added to your audit log. Webhooks filtered to a pharmacy (order events only, carrying only that pharmacy's lines) need the same confirmation. It is recorded the first time you bind a key to the pharmacy, or with Confirm vendor under Pharmacies receiving orders in Settings → API.
Pharmacies receiving orders lists, for each pharmacy, whether you confirmed it, its bound keys and every webhook that sends it order events. To stop one:
- Remove a webhook and that endpoint stops receiving events at once.
- Revoke the key in Settings → API and it stops working at once; the pharmacy webhooks it set up are removed with it.
- Delete the pharmacy and its keys stop working and its webhooks are removed.
If something looks off
- A patient doesn't see pharmacy prices. Check that Pharmacy choice is on, that the pharmacy is Active and Shown to patients, that the size has a patient price for it, and that the patient is on Patient App v2.
- Margin looks too high for older orders. Orders from before pharmacy choice only have a cost if one was entered on their parcels; without one their cost counts as $0 (shown as Not recorded).
- A pharmacy's key sees no orders. Orders name their pharmacy only while Pharmacy choice is on, and a bound key sees an order only once it is paid and, when the order needs clinical review, approved.
See the dashboard and the patient app on a 20-minute call, or start a 14-day trial with no card.