Memberships and recurring billing
Charge patients on a recurring basis — create monthly or yearly plans, put a card on file, enroll patients, and manage renewals and cancellations.
A membership is a standing charge: the patient's card is billed the same amount every month or every year until somebody stops it. That makes it different from everything else in billing — an invoice bills the patient once for work that was done (Invoices and patient payments), a claim bills the insurer, and a membership bills nobody in particular for anything in particular. It's the concierge fee, the wellness plan, the unlimited-messaging tier.
Because the charge happens without anyone present to approve it, memberships have two hard prerequisites. Both are worth getting straight before you start.
Before you start: Stripe
Memberships run on Stripe subscriptions against your clinic's connected account, so Stripe must be connected with charges enabled. Until it is, memberships aren't half-available — they're invisible. Memberships doesn't appear under Settings → Billing at all, and going to the page directly sends you to Connect Stripe instead.
On a patient record you'll see it stated plainly: an amber "Online payments aren't enabled yet" card, with a Finish Stripe setup button if you're an admin and a note to ask one if you aren't. The Enroll button stays disabled.
If that's where you are, go to Connecting Stripe first and come back.
Turning memberships on
Go to Settings → Memberships. The toggle reads "Charge patients on a recurring basis with membership plans."
Plans and members stay hidden until the toggle is on. There's no Save button — the setting autosaves.
The same toggle controls what patients see. With it on, Memberships appears in the patient portal and patients can join and cancel plans themselves. With it off, they get "Memberships aren't available for your clinic."
Creating a plan
New plan opens a sheet: "Patients enrolled in this plan are billed on a recurring schedule."
- Name — required. This is what staff and patients see on the plan.
- Description — optional, up to 500 characters, "shown to staff when enrolling patients." Worth writing: without one the plan card nags with "No description yet — add one so staff know what this plan covers."
- Price (USD) — required. Currency is fixed to US dollars.
- Billing interval — Monthly or Yearly. There is no weekly or quarterly option.
Each plan card then shows the name, the interval badge, how many members it has, and the price with its cadence — $150.00 over per year.
Editing a plan doesn't change existing members
This is the detail that surprises people. Editing a plan's price or interval creates a new price and applies to new enrollments only — as the sheet puts it, "Patients already enrolled keep their current rate."
There is no bulk migration. To move an existing member onto new pricing you cancel their membership and enroll them again on the updated plan.
Archiving a plan
Plans can't be deleted, only archived. Archiving hides the plan from new enrollments; patients already on it keep their membership and keep being billed until it's cancelled. Archived plans collapse into an Archived · n group below the active ones.
If you want to actually stop the money, archiving isn't enough — cancel each membership.
Who can do what
- Owners and admins — everything, including the settings page and plans. The Memberships settings page is admin-only.
- Front-desk staff — can enroll and cancel on a patient record, but not create or edit plans.
- Doctors — can see a patient's memberships, but enroll and cancel are not theirs to run.
See Roles, licences, and permissions.
The card on file
Nobody can be enrolled without a saved card. The Payment method card sits in the right rail of the patient's Memberships tab: "Card on file for auto-charge and balance collection."
Add card (or Update card) opens a hosted Stripe checkout page in a new tab. The card number is typed into Stripe, never into Ona — hence "Stripe-encrypted · PCI-compliant" under the saved card. When the patient or the staff member finishes, you're returned to the record and the card appears with its brand, last four digits, expiry and the date it was added.
Two routes to the same place:
- You collect it. Useful at the desk or on the phone — you open checkout and the patient reads out the card, or you hand them the screen.
- They add it themselves. In the portal, under Memberships, the patient gets the same Card on file section: "Add a card to join a membership — you're billed automatically each period."
Remove card takes it off file. Do that on a patient with an active membership and the next renewal has nothing to charge.
Enrolling a patient
On the patient record, Memberships → Enroll. The dialog is blunt about what happens: "The patient's card on file is charged now and on each renewal."
Pick a plan — plans the patient is already active on don't appear in the list — and the strip below confirms the arithmetic: "Charges $150.00 / year to the card on file." Then Enroll & charge.
The first charge is taken immediately, while you wait. That's deliberate: if the card is declined you get Card declined and no membership is created, rather than a half-built subscription that quietly never bills. Fix the card and try again.
A patient can hold several memberships across different plans, but only one per plan — enrolling twice into the same plan returns Already enrolled.
Renewals, failed payments and statuses
After enrollment, Stripe owns the cycle. It charges the saved card at the start of each period without anyone doing anything, and it retries when a charge fails. There is no separate Ona invoice for a membership charge, so membership revenue shows up in Stripe rather than in the Invoices list.
The status badge on the membership card tells you where it stands:
- Trialing — inside a trial period, not yet charged.
- Active — paid and renewing.
- Past due — the last charge failed and Stripe is retrying. The card grows an amber footer: "The last charge didn't go through — update the card on file to keep this membership active." Update the card and the next successful charge flips it back to Active.
- Unpaid — Stripe has run out of retries.
- Cancelled — over, whether by you, the patient, or repeated failure.
Past due still counts as a current membership, so it stays in the main list rather than dropping into Past. It's the state worth watching: it's the only one where money you expected isn't arriving.
Cancelling
The cancel dialog asks when, not whether:
- At period end (recommended) — access continues to the renewal date, then it cancels. No further charges. The card shows "Cancels on {date} — access continues until then." until it lapses.
- Cancel immediately — access and billing stop now. There is no refund and no proration of the part-period already paid for.
Period end is the default for a reason: the patient has paid through that date, so ending it early takes something they bought.
What the patient sees
With memberships on, the portal has its own Memberships page. Patients can add or update their card, Join & pay into any active plan, see what they're paying and when it renews, and cancel — at period end or immediately, the same two choices you get.
This means enrollment isn't only a staff action. A patient can sign themselves up without anyone at the clinic touching it. See The patient experience: self-setup, portal, and self-service.
Details that matter
- US dollars, monthly or yearly. No other currencies or cadences.
- Price changes never migrate existing members. Cancel and re-enroll is the only path.
- No proration, anywhere — not on immediate cancellation, not on switching plans.
- Archive is the only removal. Plans persist so historical memberships still make sense.
- Membership charges don't create Ona invoices. For the receipt, the retry history, or a refund, go to the Stripe dashboard.
- Removing a card doesn't cancel anything. The membership stays active with nothing to charge, and drifts to past due.
Related guides