HighLevel is good at sequences and bad at knowing what a patient did yesterday. A workflow cannot tell that the patient logged a dose this morning, that the parcel was delivered, or that they just hit thirty days of weigh-ins. The patient portal knows those things, and with HighLevel connected it hands them over as workflow triggers, as custom fields on the contact, and as one action a workflow can run.
Here are five workflows built on that, written as recipes: the trigger, the wait, the message, and the condition that gets the patient out. The exit is the part most clinics skip, and it is what separates automation from spam. The full trigger catalog is on the integration page; connecting is one click from the dashboard, as the help article shows.
What a workflow has to work with
Four triggers. injection_missed fires the morning after a scheduled dose passed without being logged or skipped, once per dose, with the scheduled date in the payload. streak_broken fires when a patient with three or more logged doses has fallen to a zero-week streak, once per patient per week, with their total shots and last dose date. order_status_changed fires on every order transition, wherever it was made, once per order and status, with the status and tracking number. achievement_unlocked fires once per achievement, with its type, name and value.
Five custom fields on the contact, refreshed after each dose or weigh-in the patient logs, at most once every 30 minutes: portal_total_shots, portal_streak_weeks, portal_last_injection_date, portal_last_weight and portal_shots_30d. The exits below read these. Every event also puts an event: tag on the contact, so a tag-based workflow works without the marketplace trigger.
One action, Invite to patient portal, which creates the contact's account, sends the claim link and replies with a status the workflow can branch on.
One thing to hold in mind: the portal already messages patients itself. A reminder the day before a dose, a "did you take yesterday's dose?" email after a miss, two reorder reminders as the supply runs down, and an email at every order status. Your workflows should not repeat those. Their job is the text in the provider's voice, the task for a human, and the pipeline move.
Recipe 1: the second nudge after a missed dose
Trigger: injection_missed.
Wait: 24 hours. Most misses are late logs: the dose was taken, the app was not opened. The portal's email has already asked them to log it; a text two hours later interrupts those patients for nothing.
Check: portal_last_injection_date. If it is on or after the scheduled date in the payload, the dose has been logged since. End the workflow.
Message: an SMS from the provider's own number. "Hi {{first name}}, it's Dr. Patel. Saw a gap this week, which is normal. If something's getting in the way, reply here and we'll sort it." No medication name and no dose. A text preview is a lock screen.
Exit: a reply, which puts a human on the thread in Conversations, or the field updating. Wait three more days, check portal_last_injection_date again, and if there is still nothing add a task for the care team to call. Then end. Leave re-entry on; each missed dose is its own event, and the check at the top protects the patient who caught up.
Recipe 2: the lapse, with a human at the end of it
Trigger: streak_broken. The payload says who you are dealing with. Fourteen shots and a two-week-old last dose is a week-nine patient with a strong start. Four shots over three months was always sporadic. Branch on totalShots if you want two tones.
Wait: none. A broken streak already means a week has gone by.
Message: first a task, not a text. Assign the care team a call, with the last dose date and total shots in the task body. If the task is still open next day, text: "{{first name}}, we noticed you've paused. Want a 10-minute check-in? Book here: {{calendar link}}."
Exit: portal_streak_weeks is 1 or more, which means a dose was logged on time and the streak restarted; or an appointment booked from the link. Switch re-entry off for 30 days. The trigger fires once per patient per week while they stay lapsed; without that setting the same patient gets the same text four weeks running.
Recipe 3: shipped and delivered are two different jobs
Trigger: order_status_changed, branched on status.
Shipped branch, no wait: text the tracking number from the payload in your own words. "Your {{clinic}} order is on its way: {{tracking number}}." The portal has emailed the same thing; the text is for the patients whose inbox is a graveyard. End.
Delivered branch, wait two days: long enough for the first dose from the new package. "Everything arrive OK? If you've got a question about this one, reply here." Then end.
Exit: on the delivered branch, check portal_last_injection_date before sending. If it is after the delivery date, they have already dosed from the new package and the question answers itself. Skip the text.
The payload's items carry product names; keep them out of the message. And an order created with a HighLevel opportunity moves it on its own, won on delivered and lost on cancelled or refunded, so skip a second workflow for that.
Recipe 4: milestones, filtered hard
Trigger: achievement_unlocked. It fires for every achievement the app records: weigh-in streaks of 7, 14, 30 days and up, shot milestones at 1, 5, 10, 25, 50 and up, weight milestones and goal-progress percentages. Unfiltered, this workflow texts a patient every few days.
Filter: type is injection_milestone and value is 25, or type is weigh_in_streak and value is 30. Not weight milestones. A text that says "20 lbs lost" reads someone's medical progress to whoever is holding the phone.
Wait: until business hours. A congratulations at six in the morning reads like a bot.
Message: from the provider. "{{first name}}, 25 doses logged. That's real consistency. Proud of you." At 50, add a one-line review ask.
Exit: none needed; it is a single message. Leave re-entry on. Every milestone is a distinct event and the portal delivers each one once, so the same milestone cannot fire twice.
Recipe 5: the invite that follows up on itself
Trigger: your pipeline. The opportunity reaches "Consult done", or whichever stage means the patient has agreed to start.
Action: Invite to patient portal, email on, text on if you want the link to go from your HighLevel number. It creates the account, passwordless, sends the claim link, and marks the contact an active patient. It needs the marketplace app installed in the sub-account, and HighLevel bills premium actions per execution.
Branch on the reply's status: invited, carry on. already_claimed, end. invalid, add a task to fix the contact's email or name, then end. locked or blocked, add a task for the owner: go-live steps unfinished, or the plan at its patient limit.
Wait: three days.
Check: the portal_* fields on the contact. They appear the first time the patient logs a dose or weigh-in, so a contact with none has not started. Text: "{{first name}}, your {{clinic}} portal link is waiting. Need a hand? Reply here."
Wait: seven more days, then run the Invite action again. resent means a fresh link went out and the old one stopped working. already_claimed means they got in since. End on either.
Exit: already_claimed at any point, or any portal_* field appearing. For an existing list rather than a pipeline, the rollout plan covers the waves and the deliverability side.
Two rules that hold for all five
The exit is a check before each message, not a step at the end. Every exit above reads a field or status the portal keeps current, so the workflow acts on what the patient did, not on its own timer. A drip aimed at someone who already came back costs you a number's reputation and a patient's goodwill.
Do not repeat what the portal already sends. The day-before reminder, the missed-dose email, the reorder reminders and the status emails go out on their own. Your workflows add what they cannot: a human's voice, a human's task, and a pipeline that reflects where the patient really is.
The triggers, fields and action above are as the portal ships them today; HighLevel's workflow builder supplies the waits, branches and re-entry settings. Nothing above is medical advice.