Launching a patient portal to a list of existing patients is a marketing campaign wearing an operations badge. Most clinics treat it as the badge: export the list, import it, tick "send invites", move on. Then two weeks later a third of the emails have bounced, the texts never arrived, and the handful of patients who did click landed on a login screen with no idea why they were there.
This is the rollout that works, in the order it works. It is built from launches we've run and watched, including the mistakes, and it applies whether you use our portal or someone else's.
First, decide what the invite is for
The invite is not "your account has been created." Nobody claims an account. People claim a reason.
For a GLP-1 or hormone program the reason is concrete: reorder without calling, see your progress, message the clinic from your phone, and get reminders when a dose is due. Put those in the invite, in that order, and treat the portal as something the clinic built for its patients rather than a system that generated a notification. The patients who reorder are the ones who track, so the invite's real job is to get the first login, and the first login's job is to get the first dose logged. Everything below serves that.
If you haven't read it, why patients quit at week nine explains the mechanism the portal is there to interrupt. The invite is where that starts.
Before you send anything
Clean the list. One row per patient, first name, last name, email and a mobile number. De-duplicate on email, because the second copy of a patient becomes a second account and a second invite. Drop anyone who has opted out of marketing; an invite to a service they use is arguably transactional, but the list you export from your CRM should already respect the flag.
Decide on a welcome credit. A small store credit that lands the moment the account is claimed, ten or twenty dollars, gives the email a hero and gives the patient a reason to log in this week rather than "sometime." It also converts the first login into the first order for a meaningful share of people, which is the whole point.
Load the catalogue first. A patient who claims an account and finds an empty shop will not come back for the reopening. Products, pricing and the reorder flow should be live before a single invite goes out.
Make claiming a one-tap job. The link in the invite should open a screen that already knows who the patient is and asks for one thing: a password. No registration form, no re-entering the email, no verification code on the happy path. Keep a fallback for expired links (a code sent to the same email) so a patient who opens the invite three weeks late still gets in.
The email
Write it like a launch announcement, because it is one.
Subject line. First name, then the news: "Jordan, you're invited to the new Willow Aesthetics app." If there is a welcome credit, say so in the subject: "(with $20 credit inside)." Subjects that read as system mail, "Your account has been created," "Action required," get the open rates system mail gets.
Preview text. The second hook, not a repeat of the subject: "Reorder in two taps, track your results and message our team, all from your phone."
Body, top to bottom:
- A panel in the clinic's own colour with the headline, one sentence on what the app is for, and the button. The button is above the fold and named for the outcome: "Claim my $20 credit" or "Set up my account."
- One line that makes the portal the clinic's edge. Ours reads: "Most clinics make you call to reorder and wait on hold for answers. We built you an app instead."
- The credit, if there is one, as a card the eye lands on.
- What's inside, as short titled tiles rather than a paragraph: reorder in two taps, track every dose, watch your numbers move, see the difference in photos, message the team, earn rewards. Only list what your clinic has actually switched on.
- Three steps: tap the button, choose a password, you're in.
- A second button, a human sign-off from the team, and a P.S. that repeats the credit.
Keep the footer honest: the link is personal, it lasts fourteen days, and here is what to do if it expired.
The text message
A text reaches the patients whose inbox is a graveyard, which for a med spa list is a lot of them. It is also where launches die quietly, because carriers filter business texts hard and nobody tells you.
Register before you send. In the US, business texting from a normal ten-digit number has to be registered (the scheme is called 10DLC). Your texting platform handles the paperwork, but check that the brand is verified, the campaign is approved, and the number you send from is actually attached to that campaign. Unregistered traffic is dropped.
Write for the filter as much as the patient. Carriers score messages, and the classic phishing shape gets blocked: a link next to the word "password," money words like "$20" or "free" beside a link, a long random-looking URL, dozens of near-identical messages fired from one number in a minute. The message that gets through is boring on purpose:
Willow Aesthetics: Hi Jordan, your patient portal account is ready. Set it up here: https://app.willow.com/claim?token=cgZZl0XIyuTIxCML Reply STOP to opt out
Brand first, one plain sentence, one short link on your own domain (never a public URL shortener), the opt-out line. Under 160 characters so it is one segment. Save the credit for the email and the claim screen.
Pace it. Two seconds between messages, a few hundred a day at most on a single number, and check delivery in your texting platform after the first twenty before sending the rest. If a batch comes back "blocked by carrier policy," stop and fix the wording or the registration; sending more makes the number's reputation worse.
The rollout
Sending everything on day one is the single most expensive mistake. Mailbox providers judge a sending domain by its history, and a domain that has sent fifty emails in its life suddenly sending fifteen hundred looks like a compromised account. Gmail, Yahoo and iCloud will bounce most of them, those addresses get added to your provider's suppression list, and your next campaign fails before it starts.
A two-week plan that survives contact with spam filters:
- Day 1. Email fifty patients. Watch bounces and complaints for a day. Anything above a couple of percent means stop and look.
- Day 2 to 4. Email a hundred a day, then two hundred. Keep the waves going until the list is done.
- Day 4. Text everyone who was emailed on day one and hasn't claimed. Same link, new wording. Then follow the email waves three days behind with texts.
- Day 10. One reminder email to anyone still unclaimed, with a different subject: "Jordan, your $20 credit is still waiting."
- Anyone without an email address gets the text only. Anyone without a mobile gets the email only. Nobody gets both on the same day.
Your portal should count "never emailed" and "never texted" separately so a text-only wave can go to people who already had the email. If it can only send to people who were never invited at all, the follow-up text becomes a manual job, and manual jobs don't happen.
What "claimed" should land on
The claim screen asks for a password and drops the patient on their home screen: next dose, a streak to protect, weight so far, and the credit already on the account with the shop one tap away. If the first thing they see is an empty dashboard and a "complete your profile" nag, the invite did its job and the product wasted it.
Two things worth doing in the first session, both small: ask the patient to log today's dose (it starts the streak and it is the single behaviour that predicts reordering), and show the reorder button on the treatment they're on, with the supply-runway date if you know it.
Measure the funnel, then work it
Three numbers tell you how the launch is going: invited, joined, ordered. "Joined" is a claimed account with no order yet; "ordered" is a paid order through the portal. Your patient list should be filterable by exactly those three states, because each is a different follow-up:
- Invited, not joined after ten days: a text if they only had the email, a call from the front desk if they had both. Some are wrong email addresses, and the bounce list will tell you which.
- Joined, not ordered: the credit expiring nudge, or a message from their provider asking how the program is going. These patients did the hard part.
- Ordered: leave them alone and let the app do its job. The at-risk flags (doses stopped, reorder overdue, gone quiet) will tell you when to step back in.
For rules of thumb: a third of a clean list claiming inside two weeks is a solid launch, and the text follow-up typically adds a noticeable share on top of email alone. If you are well under that, it is almost always deliverability rather than the offer, and the bounce and delivery reports will show it.
The checklist
- List exported, de-duplicated on email, marketing opt-outs removed.
- Products and pricing live in the shop.
- Welcome credit decided and switched on.
- Claim link opens to a one-field password screen, with an expired-link fallback.
- Email written as a launch: name in the subject, credit in the subject, button above the fold, features as tiles.
- Text under 160 characters, brand first, one short link, opt-out line, no password or money words.
- Texting number registered, campaign approved, number attached.
- Waves: 50, then 100, then 200 a day. Texts three days behind emails. Reminder on day ten.
- Bounces, complaints and carrier blocks checked after every wave.
- Patient list filterable by invited, joined and ordered, and someone owning the follow-up on each.
If you are setting up the portal itself, the HighLevel patient portal setup guide covers what to configure before you invite anyone. Nothing above is medical advice; it is the operational side of getting patients onto a tool that helps them stay on treatment.