Membership Plans and Usage Quotas

Overview

Membership plans let you define who can access your facility as a member, how they are billed, whether they need approval before starting, and how many visits, hours, or bookings they are allowed per period. When a quota is exceeded, you can either block further usage or take the booking at the normal plan price.

Members can view their current quota status at a glance on the home screen of the Member App through the QuotaBar component.


Detailed Features

Feature 1: Application Flow

When creating a plan, choose how applicants progress to an active subscription:

Flow How it works
Pay first (default) The applicant pays during signup. If auto_approve is off, the subscription becomes active only after staff manually activate it.
Apply first The applicant submits an application form with no payment. Staff review the application in Awaiting review on the Members page and approve or reject it. Approved applicants receive an email and are prompted to complete payment to activate their membership.

Apply-First Plan Settings

When Apply first is selected:

  • Applications can be submitted with no payment (payment happens after approval)
  • Submitted answers are displayed on each pending-review row so staff can review them before approving

To collect additional information at signup (name, contact info, etc.), you can configure this on either application flow, not just Apply first. It's set up in the Application Form section that appears after you save the plan (see Feature 1.5: Setting Up the Application Form).

Approving and Rejecting Applications (Awaiting review on the Members page)

Approval and rejection are done on the Members page (the old Pending Approvals tab is gone). Only facility owners and above can approve or reject.

  1. Open Membership and press "Review in Members ›" on the Awaiting review card of the To do tab (new applications and plan changes). Or, on the Members page, set the person filter to Awaiting review (/members?filter=pending_subscription)
  2. The list shows "Plan applied for" (for a plan change, "Plan change: A → B"), ① Usage (Not started · Under review (application date)), ② Money and the actions. View answers (n) opens the application-form answers below the row
  3. Press Approve — the applicant receives an email and can proceed to payment
  4. Press Reject — a confirmation modal explains the effect and has an optional reason (sent to the applicant by email)

Other staff see "Review (approve / reject) is done by facility owners and above" and no action buttons.

A row you approved or rejected stays in place in green and reads "Approved · leaves when you change the filter". Above the list a result line such as "Approved ○○. Moved to "Awaiting payment"" appears, with the link to where they moved (e.g. View in "Awaiting payment" ›) and Open details › (the member detail). Below the list: "N awaiting review · N approved (handled here)".

Result Message Link
Approved and became a member "Approved. They are now a member." "See in With a membership"
Approved, waiting for the first on-site payment "Approved ○○. Moved to "Awaiting payment"" "View in "Awaiting payment" ›"
Approved, waiting for the card payment The applicant's card payment is awaited —
Rejected That it was rejected —

After approval, the subscription remains in pending_payment state until the member completes their payment. It becomes active once payment is confirmed.

Feature 1.5: Setting Up the Application Form

Once you save a membership plan, an Application Form section appears in the plan edit screen. Here you can pick one form (created on the Forms page) and attach it to this plan's signup. It's exactly the same mechanism used to attach a form to a Check-in Config, so the same form definition can be reused for both check-in and membership signup.

Item Detail
Supported flows Both pay-first and apply-first (not limited to apply-first)
Available field types Text, email, phone, number, select, date, textarea, image upload
Where answers are stored Form Responses (the same response list used by the Forms feature), covered by the same personal-data protections as other form answers
Per plan One form maximum (multiple forms cannot be attached at once)

How to Configure

  1. Create the application form ahead of time on the Forms page (forms with target scope "Identity" or "Reservation" appear as candidates)
  2. Create the membership plan and save it once
  3. In the Application Form section of the edit screen shown after saving, select the form
  4. The selection takes effect immediately

Not available immediately on creation. Because the form binds to the saved plan's ID, it's a two-step process: save the plan first, then reopen the edit screen to attach the form.

Migrating from the Old Intake Builder

Previously, only Apply first plans could collect intake fields, through a dedicated field builder limited to three field types (text, email, phone). That builder has been retired. Plans that already had fields configured were automatically converted to the new form mechanism at release time — no action is required from the facility. The converted form appears in the Application Form section and keeps working as before.

Server-side validation of required fields (missing answers, invalid email format) works the same way as before.

Feature 1.6: Fee Payment Method (On-site)

For each membership plan, you can choose how the fee is collected. This is set with the "Fee payment method" dropdown on the plan edit screen.

Option Behaviour
Online payment only (default) Both signup and renewal are billed automatically through Stripe, as before
On-site only (no Stripe) Never goes through Stripe. The application stops in "awaiting payment"
Applicant chooses The applicant picks online or on-site at signup

Choosing "On-site only" or "Applicant chooses" reveals two extra fields:

Field Detail
Display label (up to 40 characters) The name shown to both the applicant and the front desk. Defaults to "On-site payment" if left blank — override it to match how the facility actually collects payment (bank transfer, invoice, etc.)
Description (up to 80 characters) Optional note for the applicant (e.g. "We will contact you separately.")

Renaming the label does not change the mechanism. Even if the label reads "Bank transfer", the front-desk action (recording a receipt — see Feature 1.7) is the same.

⚠️ The application stops at "awaiting payment" and does not activate until the front desk records a receipt. The same action is required for every renewal (monthly / yearly), too. Unlike a Stripe-managed fee, nothing is charged automatically when the due date arrives, so every renewal needs a receipt recorded through Feature 1.7. Leaving it unrecorded leads into the automatic lapse described in Feature 1.75.

Feature 1.65: Filtering Members (Members Page)

The member list, reviews and payment recording now live on the Members page (/members), not on the Membership page (the old Members, Pending Approvals and Awaiting Payment tabs are gone).

The "To do" tab of the Membership page

The page heading is "Membership", with the description "Plans, and the applications and payments that need you". The tabs are To do and Plans.

To do shows four cards. Counts are numbers of people; a count that cannot be loaded shows "—". The link on each card opens the Members list already filtered.

Card Meaning Link Filter it opens
Awaiting review New applications and plan changes Review in Members › /members?filter=pending_subscription
Awaiting payment (approved) Approved, waiting for the first on-site payment Open in Members › /members?filter=awaiting_payment
Unpaid / in grace On-site fee past due Open in Members › /members?money=attention
Renewal soon (within 7 days) On-site fee due within 7 days Open in Members › /members?money=due_soon
  • The tab badge is the total of Awaiting review + Awaiting payment + Unpaid / in grace
  • Below the cards a note reads "The member list has moved to the Members page. Search by name and filter by plan or payment state.", with the link Open Members with a membership ›
  • Old tab URLs (?tab=members / ?tab=pending / ?tab=awaitingPayment) automatically move to the matching filter on the Members list

Filtering on the Members page

Person filters and contract filters combine with the search (for example, "Plan: Monthly Pass" with "Payment: Unpaid / in grace"). See Member Management for the full list.

Axis Options
Person (buttons with counts) All / With a membership / Awaiting review / Awaiting payment / Reservation only / Forms only / Banned (facility owners and above only). Pending reservation and Last 30 days are in the "Other" dropdown
Contract: Membership plan A specific membership plan. Retired plans are suffixed with "(ended)"
Contract: Payment Unpaid / in grace / Renewal within 7 days / Cancelling / Paid at the desk / Card auto-pay
Contract: Access In use / In grace / In use, cancelling / Not started / No access
Contract: Ticket book Ticket book purchases
  • Use it at month end to review only the members of one plan and process renewals and cancellations together
  • The list is a table, and each row shows ① Usage / ② Money / ③ Reason it ends

Feature 1.7: Recording an On-site Fee Receipt

A payment from an on-site-payable member (on-site only, or "applicant chooses" with on-site selected) is recorded from the Membership contract card on the member detail page (facility owners and above only; the buttons on the old Members / Awaiting Payment tabs are gone). It is the same shared receipt form used for on-site reservations and counter ticket-book sales.

Recording a receipt is what renews the membership. The member becomes active and the expiry moves to the next boundary (the 1st of next month at 00:00 for a monthly plan, the next yearly boundary for a yearly plan).

Expiry at the time of recording How it extends
Not yet reached (paid early) From the current expiry to the next boundary — remaining days are not cut
Already passed (past due / expired) From the moment of recording to the next boundary — the lapsed days are not given back

From the Membership contract card

  1. Open the Members page. To find who has not paid, open it from the Unpaid / in grace or Renewal soon (within 7 days) card on the To do tab of the Membership page, or from the "Money" filter on the Members page
  2. Open the person and click the payment button on the Membership contract card on the right. The button name depends on the situation: for the current period "Record payment for this period (10/4–10/31)"; for a member whose expiry is still ahead "Record a prepayment (11/1–11/30)"; for the first payment "Record the first payment (…)". Under the button: "Recording extends the expiry to 10/31 (grace is lifted)"
  3. The confirmation modal shows "Current expiry 9/30 (in grace) → after recording 10/31 (covers 10/4–10/31)". Enter the amount (defaults to the plan price — change it to what you actually received), the payment method (cash / bank transfer / other), the date and time received (the deposit date for a bank transfer), and an optional note, then click "Record receipt" (or "Cancel")

The recorded payment stays in the contract card's payment history (date and time / amount / method / covered period / recorded by).

The button appears on a contract whose status is approved-pending-payment, active, past-due, or expired. It does not appear on a cancelled, force-cancelled, or rejected contract.

  • The amount does not have to match the plan price. Record what you actually received, such as a pro-rated amount; the entered amount is what the receipt keeps. A blank or negative amount cannot be recorded
  • It can be recorded on a ¥0 plan (monthly or yearly), too. With nothing to collect, pressing it still extends the expiry — useful for closing at month end and renewing when the member next visits
  • An expired member becomes active again, with keys and access restored, once a receipt is recorded. An expired on-site member can be brought back from the contract card. If the same person has already applied again and has another membership row, the receipt is refused — record it on the new application instead
  • It does not appear for a plan with no expiry, since there is nothing to renew
  • A blacklisted person cannot have a receipt recorded. A receipt re-issues access, so it goes through the same check as an admission ("This member is on the blacklist, so the payment cannot be recorded."). If the check itself fails, nothing is recorded and you are asked to try again

Finding uncollected fees

Check the counts on the cards of the To do tab of the Membership page, then press a card to filter the Members page.

Card / filter Meaning
Awaiting payment (approved) Approved, and the first on-site payment has not been recorded
Renewal soon (within 7 days) The on-site fee is due within 7 days
Unpaid / in grace The on-site fee is past due (inside the grace window before lapse — see Feature 1.75)

⚠️ This button never appears for a member Stripe is billing. A member on an "applicant chooses" plan who selected online payment cannot have a receipt recorded from the contract card, even though the plan itself supports on-site payment — Stripe is already collecting correctly, and recording it here would double-charge them. Check Stripe Dashboard for that member's payment status instead.

Feature 1.75: Automatic Lapse of On-site Fees

A fee that does not go through Stripe (on-site payment, or a ¥0 plan) is swept every 15 minutes for expiry.

Transition When
Active → Past due Once the expiry (renewal date) has passed. The member can still get in during this window
Past due → Expired Once the plan's grace days (7 by default) have passed since the expiry. Keys and access are revoked

Grace days are set per plan

Choose 0–31 under "Days of entry after expiry" on the plan's edit screen (default 7; plans that existed before this setting stay at 7).

Setting Behaviour
0 days (close at expiry) At the first sweep after the expiry (month end for a monthly plan — at most 15 minutes later), the member expires straight away without a past-due stage, and keys and access are removed. Made for "close at month end, renew when they visit next month"
1–31 days After the expiry the member first becomes past due (entry still works), and expires once that many days have passed since the expiry
  • The field appears only on plans paid at the counter ("on-site only" or "applicant chooses") and on ¥0 plans. It does not appear on paid card-only plans (Stripe decides the grace — see Feature 1.76) or on plans with no expiry
  • An expired member becomes active again once a receipt is recorded at the counter (Feature 1.7) — on a ¥0 plan, with "Renew (record payment)"
  • Shortening the days also applies to members who are already past due. Anyone whose grace has run out under the new setting expires at the next sweep (within 15 minutes)

Why not cut them off immediately by default? An on-site member can only pay by showing up. Locking them out on the renewal date itself would remove the very visit during which they would have paid — hence the default 7-day grace window. No automatic reminder is sent to the member during this window; check Unpaid / in grace on the To do tab of the Membership page proactively instead.

A member Stripe bills is never touched by this sweep. A subscription with a Stripe subscription ID keeps following Stripe's own retry / dunning behaviour regardless of this sweep.

Feature 1.76: Failed Stripe Fee Payments (Retries and Keys)

When a Stripe-billed fee (online payment) cannot be collected on the renewal date, the key does not stop at that moment. Stripe retries the card, and access is revoked only once Stripe gives up and cancels the subscription.

Transition When Entry
Active → Past due The moment a charge fails Allowed
Stays past due For as long as Stripe keeps retrying Allowed
Past due → Cancelled Once Stripe stops retrying and cancels the subscription Denied (keys and access are revoked)

Entry stays open during the past-due window for the same reason as on-site fees in Feature 1.75: an expired card or a hit credit limit is usually something the member does not know about, and cutting them off on the first failure removes the very visit or contact during which they would have fixed it.

Stripe decides how long the grace window is

There is no day count to configure in UnlockOS. The number of retries, their spacing, and what happens after the last one are all set in the Stripe Dashboard under Settings → Billing → Subscriptions and emails, in the "If a payment fails" section. By default Stripe retries several times over roughly two to three weeks. Check that screen for the exact schedule.

⚠️ Set "If a payment fails" to "Cancel the subscription" or "Mark the subscription as unpaid"

After the final retry, Stripe can "cancel the subscription", "mark the subscription as unpaid", or leave it as is. UnlockOS ends the membership and revokes the key when "cancel the subscription" or "mark the subscription as unpaid" is selected (#4005).

With "leave it as is", the member stays past due in UnlockOS after Stripe has stopped retrying, and the key keeps opening while the fee goes uncollected. If you use memberships, check this setting.

⚠️ Prerequisite: the membership subscription webhook must be configured

Everything above only happens once Stripe's notifications reach UnlockOS. Membership subscription notifications arrive at a separate endpoint from payment results, each with its own signing secret.

Pressing "Set up automatically" on the Stripe Payment Integration screen registers both. Check that both of these lines say "configured", per mode:

  • Webhook (live mode): configured
  • Membership webhook (live mode): configured

While the membership one is not configured, a failed charge leaves the member Active and the key does not stop. You can also verify that fees are actually being collected from the invoice list in your Stripe Dashboard.

Keys already issued do not disappear at that moment

What stops when a membership is cancelled is the next check-in. A key that has already been issued (PIN, QR code) stays valid until that stay ends — that is, until check-out.

To stop one immediately, check the stay out from the Check-in List. The key is invalidated as the check-out completes.

Feature 1.77: Force-cancelling a Member

On the member detail page, the "Force Cancel" button on the Membership contract card on the right ends that membership on the spot (for facility owners and organization owners; the button on the old Members tab is gone).

  • Any membership that has not ended can be force-cancelled, whatever its state. Besides active and past-due members, this includes members scheduled to cancel (they cancelled themselves and are waiting for the period end), awaiting approval, and awaiting payment. The button does not appear on cancelled, force-cancelled, rejected, or expired members
  • A force-cancelled member becomes "force-cancelled" and loses keys and access. For a member billed by Stripe, the Stripe subscription is cancelled immediately as well
  • Any plan-change request the member had submitted is withdrawn too. It does not stay in Awaiting review, so approving it later cannot bring the member back to active
  • A force-cancelled member is not brought back to active by a Stripe notification (subscription created, updated, or payment failed) or by completing a payment on the member side. To bring them back, have them apply again
  • Keys that were already issued behave as described in "Keys already issued do not disappear at that moment" under Feature 1.76
  • Bookings after the end date that were free because of the membership are cancelled (the membership has ended; within 15 minutes)

Feature 1.78: When a Member's Own Cancellation Takes Effect (Cancellation Deadline Day)

When a member cancels from their member page, the membership does not end immediately: it becomes "scheduled to cancel" and they can still enter until the end date. The end date depends on how they pay.

How the member pays End date
Card (Stripe) The end of the current period if they cancel by the plan's cancellation deadline day (default the 20th); after that, the end of the next period (Stripe bills that next period)
At the counter, or ¥0 The end of the current period (this month's end for a monthly plan), regardless of the deadline day

A member who pays at the counter has not paid for the next period, so cancelling after the deadline day does not push the end into next month. The cancellation deadline day only affects card-paying members.

  • Cancelling on the deadline day counts as "by the deadline day"
  • On a yearly card plan, too, the only check is whether the day of the month is on or before the monthly deadline day (default the 20th). Cancelling from the 21st bills the next year even when the current year has months left, and the membership runs to its end
  • Once the end date has passed, bookings after the end date that were free because of the membership are cancelled ("void once the membership ends"). Members are told this on the cancel confirmation screen

For the whole picture by status, see the Membership Rulebook.

Feature 1.8: Enrollment Fee (one-time)

The "Enrollment fee (one-time)" field on the plan create / edit screen charges a one-time amount on the first invoice only, separately from the recurring price. Leave it blank or 0 to charge nothing.

Item Detail
When it is billed On the first invoice, together with the (prorated) first month — one payment, not two
Apply-first plans The post-approval payment includes both the first month and the enrollment fee
Changing it Unlike the monthly price, it can be changed after the plan is created (it is a one-time line built at signup, not a Stripe recurring price)
Existing members Unaffected. The fee only lands on the first invoice of a new application
Where it is shown On the plan summary in the signup flow, and in the confirmation breakdown (first month / enrollment fee / total)

It cannot be set on a ¥0 plan

A free plan never goes through payment, so there is no path that could collect the fee. Saving one is rejected. If you need "¥0 per month with a one-time charge", model it as a one-time reservation plan instead of a membership.

When it is waived

Today the fee is waived only when the same application is resumed. Re-joining after cancelling creates a new application, so the enrollment fee applies again — otherwise cancelling and re-joining would be a way to skip it.

Indefinite free pause is a separate, planned feature. The value of pausing is precisely "no enrollment fee when you come back", which is why the fee lands first.

Feature 1.9: Sales Status (Public / Unlisted / Closed)

The "Sales status" field on the plan create/edit screen controls whether the plan is listed on the member app and whether it accepts new signups.

Status Listed on member app New signups via signup URL
Public (default) Listed Accepted
Unlisted Not listed Accepted (only for people who have the URL)
Closed Not listed Not accepted

No status affects members who are already enrolled. Their membership, keys, and billing continue as-is, and the member app keeps working for them. Sales status only controls who can newly join.

Every plan card always shows its signup URL (member.unlockos.io/{facility-slug}?plan={planId}). For Unlisted and Closed plans, a note about what happens if someone opens that URL is shown alongside it.

When to use Unlisted

Use this for invite-only plans, corporate contracts, or staff-only plans — cases where you don't want the plan on the public list, but still want people who have the URL to be able to join.

When to use Closed

Use this when you want to stop new signups only — for example, the plan is full or you're temporarily pausing enrollment. If you want to remove a plan that still has members, use Closed first rather than retiring it (see Feature 2.7: Retiring and Reactivating a Plan).

How to Configure

  1. Open the admin dashboard and navigate to the Membership → Plans tab, then create or edit a plan
  2. In the Sales status dropdown, choose Public, Unlisted, or Closed
  3. Save

Feature 2: Configuring Quotas (Admin)

Quotas are set when creating or editing a membership plan in the Membership → Plans tab of the admin dashboard.

Configurable Limits

Field Description Counted in
Monthly Visits Maximum number of check-ins per month The month of the check-in
Daily Hours Maximum hours of usage per day The day (recorded on the day of checkout)
Monthly Bookings Maximum time slot bookings per month (by count or by hours) The month of the day the booking is used (not the month it was made in)

Booking quota is counted in the month the slot is used. Booking a November slot during October uses November's quota; October's quota does not go down. Changing the date moves the quota to the new month. If that month is full, the change is refused and the original booking and quota stay as they are.

Cancelling gives the quota back only inside the plan's full-refund window (the same rule as ticket books). A cancellation in a fee-bearing window, or after the start time, does not give it back. The same applies to shortening a stay on an hours-based plan. See section "7. Usage quota" of the Membership Rulebook.

Monthly Bookings — Limit Type

Monthly bookings can be set to one of three modes:

Choice Behavior
Unlimited No cap on monthly bookings or booking hours. The quota bar does not show a booking progress row.
By count Sets a maximum number of bookings (slots) per month.
By hours Sets a maximum total booking duration (hours) per month.

Monthly Visits and Daily Hours are treated as unlimited when left blank.

How to Create a Plan with Quotas

  1. Open the admin dashboard and navigate to the Membership → Plans tab at the far right (the page opens on To do)
  2. Click the Create Plan button — you will be taken to a dedicated plan detail page
  3. Enter basic plan information (name, price, billing interval, application flow, etc.)
    • The Price and Billing interval fields are labelled (Not editable after creation). These cannot be changed after saving due to Stripe integration constraints
  4. In the Usage Limits section, enter the desired limits

Duplicating an Existing Plan

Instead of re-entering everything for a similar plan, copy an existing one.

  1. In the admin dashboard, open the Membership → Plans tab and click the duplicate icon (left of the edit icon) on the plan you want to copy
  2. The create-plan page opens pre-filled with the source plan's settings (price, billing interval, usage limits, check-in configurations, covered reservation plans, and so on)
  3. The name is set to {original plan name} (copy) — change it as needed
  4. Review the form and click Create Plan to save it as a new plan

What is NOT carried over:

Item Behaviour
Sales status Always opens as Closed, even when the source plan is public, so a copy is never put on sale the moment it is created. Switch it in the form if you want the plan on sale
Application form binding Not copied. Form bindings attach to a saved plan ID, so pick the form again from the edit screen after creating the plan
Subscribers Not copied. The new plan starts with zero members

Clicking the duplicate icon saves nothing. Neither the source plan nor the new plan changes until you press Create Plan.

Feature 2.5: Subscriber Count on Plan Cards

Each plan card in the Plans tab shows the current subscriber count as {count} / {max}. When no max member limit is set, it shows {count} (no cap). The count includes subscriptions in the active, past_due, pending_approval, and pending_payment statuses. Cancelled subscriptions are excluded.

Feature 2.6: Reordering Plans (Display Order)

In the Plans tab, plan cards can be reordered freely by drag and drop, or with the up/down buttons on each card.

Item Detail
How to reorder Drag a card's handle, or tap the ↑ / ↓ button on a card
Where it applies Both the admin Plans tab and the member app's plan list use the exact same display order
Saving Reordering saves automatically — there is no separate save button
Scope Retired plans (Feature 2.7) are excluded from reordering

Previously there was no way to control display order — plans were always shown newest-first by creation date. Adding a single new plan would shift the whole order, and facilities had no way to keep their intended sequence.

If a membership plan is added or removed elsewhere (another tab, another staff member) while you are reordering, saving your change fails and the list reverts to how it looked before you started. Reload the page and try reordering again.

Feature 2.7: Retiring and Reactivating a Plan

The Deactivate button on a plan card retires the plan itself. This is a more drastic action than Closed (Feature 1.9) — it immediately cancels every member's Stripe subscription and revokes their access and keys.

Item Detail
When it can run Only when the plan has zero members
What it does Immediately cancels Stripe subscriptions, and revokes members' roles/facility membership and keys
Where it goes Removed from the regular plan list and moved to the "Retired plans" section at the bottom of the screen
Undoing it The Reactivate button in "Retired plans" restores the plan's configuration only

Plans with members cannot be retired

Attempting to deactivate a plan that still has one or more members is rejected with this message:

This plan has {member count} member(s). Retiring it would force-remove all of them, so the action was blocked. To stop new signups only, edit the plan and set its sales status to "Closed".

If you only want to stop new signups, use Closed (Feature 1.9) instead of retiring the plan. Closed has no effect on existing members.

After reactivating

A reactivated plan comes back with its sales status automatically set to Closed (so an accidentally-retired plan doesn't immediately go back on sale). To start accepting signups again, edit the plan and set its sales status to Public or Unlisted.

Reactivating only restores the plan's configuration. It does not restore the subscriptions or keys of members who were force-removed when the plan was retired.

Feature 3: Overage Policy

Choose what happens when a member exceeds their quota.

Policy Behavior
Block Bookings and check-ins beyond the limit are refused.
Charge the normal plan price Bookings beyond the limit are taken and paid at the normal plan price, the same as for a non-member. It only affects bookings: check-ins beyond the visit or daily-hours limit go through with no extra charge (choose Block to limit them).

There is no separate per-overage fee to set, and nothing is added to the membership invoice.

Feature 4: Membership Plans Excluded from the Booking Plan List

Plans created with selected_plan_type='membership' are not shown in the plan list on the booking page (Booking app). They are accessible only through the Open Reservation Plan button on the member app's Home screen. This prevents membership-only booking slots from appearing alongside general reservation plans.

Feature 5: Quota Bar (Member App)

On the home screen of the Member App, a quota bar is displayed for each active limit on the member's plan.

Displayed Information

  • Label: Monthly Visits / Today's Usage / Monthly Bookings
  • Count: Used / Limit (e.g., 2 / 5)
  • Progress bar: Visual indicator of usage percentage
    • Teal (normal): below 80% used
    • Amber (warning): 80%–99% used
    • Red (limit reached): 100% used

Overage Note

When the overage policy is set to Charge the normal plan price, the following note appears below the quota bars:

Bookings beyond the limit are charged at the normal plan price

Feature 6: Covered Reservation Plans (Free-Quota Scope)

The membership plan edit form includes a Covered reservation plans multi-select inside the Booking Limits section. The regular reservation plans selected here are covered by this membership plan's free quota.

This setting applies to walk-ins (front desk / on-site check-in) too, not just the booking service. Walk-in free-tier eligibility used to be managed per Check-in Config; it is now unified with this plan-level setting.

Selection state Behavior for bookings Behavior for walk-ins
None selected (default) All reservation plans are covered — members get the free quota on any plan they book (legacy behavior) Not decided at the plan level — falls back to the Check-in Configurations field described below
One or more selected Only the selected plans are covered. Plans not on the list are charged at the regular rate, even for members Free only if the covered plan (free) is part of that Check-in Config; otherwise charged

⚠️ Plans selected here become members-only and are no longer shown to the general public on the booking page. This applies to both fields (free for members / member-priced), and non-members who try to book such a plan are refused (while the membership plan is active). If you want members to book for free while everyone else pays, keep the public plan as it is, create a separate plan for members (for example, "Meeting room (members)"), and select that one here. If nothing is selected, no plan is hidden from the public.

How to Configure

Open the admin dashboard and navigate to the Membership → Plans tab, then create or edit a plan. In the Booking Limits section, use the two multi-selects below as needed (multi-select, searchable):

  1. Covered reservation plans (free for members) — plans selected here become ¥0 for members (covered by the free quota). Applies to both bookings and walk-ins
  2. Covered reservation plans (member-priced, charged normally) — plans selected here appear on the member app's "Reservation Plans" card, but are charged at the regular rate. This field does not affect walk-in free-tier eligibility

If both are left empty, bookings fall back (legacy behavior) to all reservation plans covered for free; walk-ins fall back to the Check-in Configurations field described next.

Saving shows the selected plans as tags in each section. The same plan cannot be selected in both fields (adding it to one automatically removes it from the other).

Constraints on Covered Plans

  • The selection candidates only include active reservation plans belonging to this facility. Plans from other facilities or inactive plans are excluded from new selections
  • If a linked plan is later deactivated, its name still appears as a tag on the existing selection, but it will not appear as a candidate for new links
  • On save, any plan ID that belongs to another facility or no longer exists is automatically dropped, and a warning — "Some plans could not be linked because they no longer exist in this facility" — appears at the top of the screen (the save itself still succeeds)

Check-in Configurations (member page entry points)

Whether the member page shows a check-in button at all is decided by this field together with "Covered reservation plans (free for members)". It is always expanded on the membership plan edit screen.

Resolution order:

  1. If a Check-in Configuration's billing plan is one of the plans selected under "Covered reservation plans (free for members)", that configuration becomes the member page entry point
  2. If none can be derived that way (nothing selected, or the selected plans are not the billing plan of any Check-in Configuration), the configurations listed in this field are used instead
  3. If neither resolves, members on this plan get no check-in button on the member page at all

⚠️ Selecting "Covered reservation plans (free for members)" alone is not always enough. If the plan you selected is not the billing plan of any Check-in Configuration, the price becomes free for members but no entry point appears. In that case, name the Check-in Configuration directly in this field.

This field is walk-in only and does not affect the booking service.

  • Pricing (whether the member pays) follows the same order. Once a "covered for free" plan is selected and it resolves to a Check-in Configuration, pricing moves to the plan-level decision
  • Facilities that used to split member tiers across several Check-in Configs can consolidate them into one entrance after migrating to covered reservation plans. Consolidating brings that entrance's max-capacity setting closer to the facility's real simultaneous occupancy (you no longer need one entrance per member tier). It also means the plan-selection step during check-in is skipped automatically on any day a member's free plan resolves to exactly one candidate

How the Free Quota Applies

When a member books a covered reservation plan:

  • If Monthly Bookings (by count or by hours) is set above, the free quota applies within that limit
  • If Monthly Bookings is Unlimited, the booking is always free
  • Exceeding the limit follows Feature 3: Overage Policy (block, or charge the normal plan price)

When a member books a plan that is not covered, the standard guest price applies as-is (the free quota is not consumed). See Member & Subscription Bookings for how this appears on the guest-side confirmation screen.


Configuration Examples

Example 1: Standard Coworking Plan

Allow up to 20 visits and 8 hours per day; block when exceeded:

  • Monthly Visits: 20
  • Daily Hours: 8
  • Monthly Bookings: (blank)
  • Overage Policy: Block

Example 2: Flex Membership

Up to 10 bookings a month on the member quota; beyond that, members can still book at the normal price:

  • Monthly Visits: (blank)
  • Daily Hours: (blank)
  • Monthly Bookings: By count → 10
  • Overage Policy: Charge the normal plan price

Example 3: Studio Class Membership

Limit to 4 time slot bookings per month; block further bookings:

  • Monthly Visits: (blank)
  • Daily Hours: (blank)
  • Monthly Bookings: By count → 4
  • Overage Policy: Block

Frequently Asked Questions

Q: When do quotas reset?

Each month is counted separately (calendar months from the 1st at 00:00, facility timezone). No manual action is required. Booking quota is counted in the month the booking is used, not the month it was made in, so booking next month's slot this month does not reduce this month's quota. Daily hours are counted per day and recorded on the day of checkout.

Q: If multiple limits are set, which one triggers the restriction?

Any one of the limits reaching its quota is enough to trigger the restriction. For example, if both monthly visits and daily hours are set, whichever is reached first will block further usage (or take it at the normal plan price).

Q: When are overage charges billed?

There is no separate bill. With Charge the normal plan price, a booking beyond the limit is paid at the normal plan price when it is made. Nothing is added to the membership invoice.

Q: A member says the quota did not come back after cancelling

Cancelling gives the quota back only inside the plan's full-refund window (the same as ticket books). A cancellation in a fee-bearing window, or after the start time, does not. The cancel confirmation shows "Member allowance: Returned / Not returned".

Q: The member's quota bar is not visible in the app. Why?

The quota bar only appears when at least one quota limit is active. If Monthly Bookings is set to Unlimited and Monthly Visits and Daily Hours are both blank, no quota bar is shown.

Q: If I update a plan's quota limits, when does the change take effect?

Updated limits take effect after the next quota reset cycle. The current usage count is carried over; only the limit threshold changes.

Q: If I add or change covered reservation plans, does it apply to existing members immediately?

Yes. Covered-plan links take effect the moment you save — no backfill is required. Members with an already-active subscription get the new configuration starting with their next booking.

Q: What happens if I don't select any covered reservation plans?

All reservation plans are covered (the legacy, backward-compatible behavior). Only narrow down the covered reservation plans if you want to limit the free quota to specific plans.

Q: Does the walk-in (direct check-in) free tier also follow covered reservation plans?

Yes. Selecting one or more "covered for free" plans applies that setting to both bookings and walk-ins. A membership plan with none selected — or one whose selected plans do not resolve to any Check-in Configuration — falls back to the "Check-in Configurations (member page entry points)" field for walk-ins.

Q: Is the application form only available on apply-first plans?

No. The Application Form section that appears after saving a plan works for both pay-first and apply-first flows. It used to be an apply-first-only field builder; it's now unified with the same form mechanism used by check-in (see Feature 1.5).

Q: If I set a plan to Unlisted or Closed, do existing members lose access?

No. Sales status only affects people who are not yet members. Existing members keep their subscription, keys, billing, and access to the member app exactly as before.

Q: I can't retire (deactivate) a plan that has members

Plans with one or more members cannot be retired, because doing so would force-remove all of them. If you only want to stop new signups, set the sales status to Closed instead. If you do need to retire the plan itself, you can once it has zero members.

Q: Can I undo retiring a plan?

Yes. Use the Reactivate button in the "Retired plans" section at the bottom of the plan list. Only the plan's configuration comes back — subscriptions and keys of members who were force-removed when the plan was retired are not restored. A reactivated plan comes back Closed, so edit it and set the sales status to Public or Unlisted to start accepting signups again.

Q: An on-site-payable member has no "Record payment" button

First check that the plan's "Fee payment method" is set to on-site-capable (on-site only, or applicant chooses). Even when it is, the button is hidden if that particular member actually chose online payment (Stripe) — this is deliberate, to avoid double-charging. The button also never appears for a cancelled, force-cancelled, or rejected member, or for a plan with no expiry (it does appear for an expired member).

Q: What happens if an on-site fee goes uncollected?

Once the renewal date passes, the member automatically becomes "past due" — access still works during this window. Once the plan's grace days have passed since the expiry (7 by default; right away on a 0-day plan), the member automatically becomes "expired" and keys/access are revoked (see Feature 1.75). No automatic reminder email is sent, so check the To do tab of the Membership page regularly to collect. Even after the member has expired, recording a receipt from the contract card on the member detail page makes them active again (Feature 1.7).

Q: When does a member whose online payment failed lose access?

Not when the charge fails. Access is revoked once Stripe stops retrying and cancels the subscription — roughly two to three weeks by default. Both the length of that window and what happens at the end of it are Stripe settings, and if "If a payment fails" is set to leave the subscription as is, the key never stops. If the membership subscription webhook is not configured, the member never even goes past due. See Feature 1.76.

Q: What if I received a different amount from the plan price?

Record the amount you received. A fee receipt does not have to match the plan price, and the expiry still moves to the next boundary as usual (the amount does not change how far it extends).

Q: An expired member came in and paid. Do they need to apply again?

No. On the member detail page, use the payment button on the expired membership's contract card. The member becomes active again, with keys and access restored.


Troubleshooting

Member is blocked even though quota appears not exceeded

Check the following:

  1. Review all quota bars on the member app home screen — daily hours and monthly visits/bookings are tracked separately
  2. Confirm the membership subscription has not expired (check "Valid Until" on the home screen)
  3. If the issue persists, contact the facility admin to review the plan configuration

Quota bar does not appear in the member app

  • Monthly Bookings is set to Unlimited and Monthly Visits and Daily Hours are both blank. The bar is not shown when no limits are active.
  • Check the plan's Usage Limits settings in the admin dashboard and add at least one limit value.

A member is charged the regular rate on a specific plan

  1. In the admin dashboard, check the Covered reservation plans setting for that membership plan and confirm whether the plan in question is selected
  2. If one or more covered reservation plans are selected, any plan not on the list is charged at the regular rate by design — this setting exists to narrow the free-quota scope
  3. To make the free quota apply to all plans again, clear every selection in Covered reservation plans (none selected = all plans covered)
  4. Changes take effect immediately after saving — reload the page if it does not appear to apply

A member is charged the regular rate on a walk-in (direct check-in)

  1. Check whether that membership plan's Covered reservation plans (free for members) includes the plan tied to the Check-in Config being used
  2. Confirm that the selected plan is the billing plan of that Check-in Configuration. Once it resolves, pricing moves to the plan-level decision
  3. If no "covered for free" plans are selected, check whether that Check-in Configuration is listed in the "Check-in Configurations (member page entry points)" field instead

The member page shows no check-in button at all

No entry point resolves for that membership plan. Check, in order:

  1. Whether a plan selected under "Covered reservation plans (free for members)" is the billing plan of some Check-in Configuration. If it is, that configuration becomes the entry point automatically
  2. If not, name the Check-in Configuration directly in "Check-in Configurations (member page entry points)". Selecting covered reservation plans alone does not create an entry point
  3. Whether the named Check-in Configuration has been deactivated

Stripe Customer Portal Setup (Required for Facility Owners)

To allow members to change their payment method and download receipts, you must enable the Customer Portal in your Stripe Dashboard.

Setup Steps

  1. Log in to Stripe Dashboard
  2. Go to Settings → Billing → Customer portal
  3. Configure the following:
Setting Value Reason
Payment methods ✅ Enabled Allow members to add, update, or remove cards
Invoice history ✅ Enabled Allow members to view and download receipt PDFs
Subscriptions > Cancel subscriptions ❌ Disabled Cancellation is handled through UnlockOS
Subscriptions > Switch plans ❌ Disabled Plan changes are managed through UnlockOS
  1. Click Save

Important Notes

  • This setting applies to your entire Stripe account (not per-facility)
  • Test mode and live mode require separate configuration
  • Once configured, a "Manage Cards & Invoices" button appears on the member app's Payment History page
  • Clicking the button opens Stripe's portal; members return to the app when finished

If Customer Portal is Not Configured

If a member clicks the button before setup is complete, Stripe will return an error. Make sure to complete the above configuration before publishing your membership plans.



Last updated: 2026-10-05 - The member list, reviews and payment recording moved from the Membership page to the Members page, and the Membership page now has two tabs, To do and Plans (the four To do cards count people). Receipts and force-cancel are done from the Membership contract card on the member detail page; added the Record payment confirmation modal and the payment history (#4876 stage 4)

Previous update: 2026-10-04 - Corrected the overage policy to the actual behaviour (the normal plan price; no overage fee fields and nothing added to the invoice). Quota is counted in the month of use and comes back on cancellation only inside the refund window (#4857 / #4871). Added cancelling free bookings after the membership ends, the deadline day itself, and yearly plans (#4873). Added the Membership Rulebook

Previous update: 2026-10-02 - On-site fees are now swept every 15 minutes and the grace days are set per plan (Feature 1.75; 0 closes at expiry). A counter-paying or ¥0 member's own cancellation ends at the current period end regardless of the deadline day (Feature 1.78) (#4700)

Previous update: 2026-10-02 - The on-site receipt is now the renew button (Feature 1.7, #4683): the amount need not match the plan price, ¥0 plans can be renewed, expired members come back on a receipt, and blacklisted people cannot be recorded

Previous update: 2026-10-02 - Documented force-cancelling a member (Feature 1.77): any membership that has not ended can be force-cancelled, a pending plan-change request is withdrawn, and Stripe notifications or a completed payment do not bring it back (#4698)

Previous update: 2026-10-02 - The Members list can be filtered by plan (Feature 1.65, #4701)

Previous update: 2026-09-18 - Documented Stripe retry behaviour and keys on a failed fee payment (Feature 1.76): the grace window is a Stripe setting, "If a payment fails" must be set to cancel the subscription, the membership subscription webhook is a prerequisite, and already-issued keys are not revoked on the spot

History: 2026-09-17 - The Membership page now opens on Members; the Plans sub-tab moved to the far right (steps updated)

Previously updated: 2026-09-08 - Documented on-site membership fee payments (fee payment method setting, recording receipts from the Members / Awaiting Payment tabs, the Stripe-billed exclusion, and automatic lapse of on-site fees) (Epic #3421 / #3424 / #3425 / #3426)

Earlier: 2026-09-02 - Documented sales status (public/unlisted/closed), plan reordering, and retiring/reactivating plans (#3202, #3203, #3204, #2772, #3068)

Open the MarkdownPaste it into an AI assistant.

Ask about this article

AI answers from this article's content.