Three contract models in one place: hourly tiers with optional overage, flat / per-class fees, and a ledger of every overage charge.
Three tabs: Hourly plans / Flat & per-class fees / Overage charges.
Create subscription plans (e.g. "10h / month — $300"). For each plan, choose either: Block further bookings once the monthly limit is reached, OR Allow overage and charge per extra hour ($/hour rate you set).
Three flavours on the same tab: Flat monthly (fixed amount each month), Per class (rate × number of classes taught), or Per hour (rate × actual class minutes that month — designed for ad-hoc renters who use the room as-needed). By default these settle manually via the monthly invoice report; Per class and Per hour renters can instead be switched to pay at the moment they book (next step).
On the instructor's edit page under Flat / per-class, turn on "Collect payment when they book".
See every overage with status (pending / charged / failed). Waive any one of them — if it's already charged, the refund happens automatically. A charged overage is only marked waived once that refund has gone through: if it can't (for example Stripe is no longer connected), nothing changes and the page tells you why. If you then refund it yourself in your Stripe dashboard, press Waive again (with Stripe connected) and it will be marked waived. Waive also checks Stripe for a charge that still reads pending or failed: if the card was in fact charged, that payment is refunded and the page says so. If the overage is sitting on a draft invoice, waiving it lowers the draft's total automatically; if it's already on a Sent invoice, waiving is blocked — void that invoice first, waive the charge, then re-generate. Paid invoices are unaffected (use a Stripe refund instead). Waiving requires the "Instructor Contracts & Membership Tiers" manager permission.
On the instructor's edit page, open the Contract section and choose No contract, Hourly plan, or Flat / per-class fee. Assigning a plan records what they owe — it does not charge anyone by itself. An hourly plan is collected one of two ways: the instructor subscribes once from their own portal (Room Plan → Subscribe; the card then renews every month), or you generate their month under Settings → Invoices and send it. When you assign a paid plan, the instructor is emailed the subscribe link automatically. Until one of the two has happened, the Money tab shows "Not subscribed" — with a Send subscribe link button to re-send that email, and Create invoice — and after 14 days the Dashboard's Alerts tab says so too.
Once assigned, the Money tab of the instructor's profile shows a Contract Hours card (the "Room plan" button above the tabs takes you straight there): a stacked progress bar (blue for classes, teal for room bookings, amber for hours held from cancelled sessions) against the contracted amount, a breakdown table, and mini bars for the previous three months. Use the arrows to browse past months. The total now matches what the instructor sees on their own Room Plan and what month-end overage actually bills.
The Bookings tab lists this instructor's classes, room bookings and 1-on-1 appointments together. It opens on Upcoming — everything they have booked from today onwards, however far ahead — and one click on Past walks back through their whole history, newest month first.
Anything paid at booking is automatically excluded from the monthly report so nobody is billed twice. And if a paid booking is later cancelled — by the renter, by you, or by a studio closure — that session's rent is refunded to their card automatically.
If that rent refund does not go through (Stripe refused it, or Stripe is not connected), the session is still cancelled and the refund is kept on a list until it is done: the cancel result says "$40.00 room rent was not refunded", your dashboard shows "1 room rent refund did not go through", and Settings → Instructor contracts → Flat & per-class fees lists it under "Rent refunds to finish" with a "Refund $40.00" button. Press it once the cause is fixed (it is safe to press again). If you already refunded the whole charge in Stripe, pressing it just clears the row. A renter who cancels their own booking is told the refund did not go through and that the studio will finish it.
The renter saves a card once (they're prompted on their Room Bookings page), and from then on each ONE-OFF booking — a single room booking or a one-time class — charges that card immediately (a 90-minute booking at $45/hour charges $67.50 on the spot). The charge is in your studio's currency (Settings → Money → Studio Currency).
Cancelled sessions are kept in the list, each with an attribution badge naming who cancelled it ("By Jamie Bischoff"; older cancellations without an audit record fall back to "By admin" / "By teacher"), and those whose hours are still held show a Return hours button right there, so you can reconcile an instructor's count without opening each class. The current month's class and room totals stay pinned to the top of the card whichever range you're looking at. Appointments (1-on-1 services) appear in the same list with an "Appointment" badge, the client's name, and the appointment's own status (Pending, Confirmed, Completed, Cancelled, No answer …); an Appointments filter chip appears once the practitioner has any. A home visit that includes an automatically-booked intake shows as one line starting at the intake's time, and its minutes are totalled separately in the header ("1h 45m appointments") because they are not studio hours.
Instructors can pay contract invoices online: once you Send an invoice, the instructor sees it under Instructor → Invoices (NOT under Room Plan — that page is only for the monthly room-booking tier subscription) and can pay the exact amount by card. Their sidebar shows an unpaid-invoice count badge so the bill is hard to miss, and the invoice email also includes a "Pay invoice online" link.
Refunding a month of an instructor's room plan: open the instructor, go to the Money tab (or press 'Room plan' above the tabs), find 'Room plan payments', and press Refund on the month you mean. Each row shows the billing window, so two identical charges are tellable apart, and a month already refunded shows 'Refunded' with no button. The money goes back to their card and Klasly's platform fee is reversed with it, so the refund costs you exactly what you charged.
The instructor's Start Subscription payment page stays open for 30 minutes, and it is closed early if you change or remove their tier while it is open. If a payment still arrives from an out-of-date page, Klasly checks it against the plan as it is now. After a tier change the subscription starts, that first month stays as charged, and it renews at the new tier's price. After you removed the plan — or when they paid twice — no subscription is started: the payment shows under 'Room plan payments' marked 'refund this one', and you and the instructor are both emailed. Klasly does not refund it for you. Until you refund it the payment counts as room plan income on your monthly statement, because the money is in your Stripe balance; once refunded it is taken back out.
A room plan month refunded from the Stripe dashboard is picked up too: the payment is marked refunded in Klasly, comes off your monthly statement, and you get the refund email. Refunding from Klasly is still the safer way, because it always returns Klasly's fee with it.
Changing the price of an hourly plan changes it for everyone on the plan, including instructors who already pay it by subscription. The edit form tells you how many subscribed instructors there are before you save, and the button names the number. When you save, each of their subscriptions is moved to the new price from their next renewal: the month they have already paid is left as it is, nothing is charged that day, and each of them gets an email with the old price, the new price and the date it starts. If Stripe cannot update one of them, nothing is changed for anyone and the plan keeps its old price. To keep current subscribers on the old price, leave the plan alone and add a new plan for new instructors. Setting the price to $0 makes the plan free: the subscriptions are cancelled when you save, nobody is charged again, payments already made are not refunded (use Refund under Room plan payments if you want to return a month), and the instructors stay on the plan.
When the instructor comes back from the payment page, their Room Plan page confirms the payment with Stripe itself and shows the result straight away: the plan is Active, it is Active and renews at a different price than they just paid, or the payment was taken and no subscription was started. Until the result is in, Start Subscription is not offered, so a slow confirmation cannot turn into a second payment for you to refund.