Member statuses explained
What every status value on a member record means, how application status and payment status work independently, and when expiry kicks in.
Overview
Each member record carries two independent status dimensions: an application status that tracks where the member is in your club's lifecycle, and a payment status that reflects what Stripe reports about their subscription. Both appear on the member detail page and are available as filters on the Members index.
Application status
| Status | What it means |
|---|---|
pending |
The member has submitted an application and is waiting for admin review. They cannot access the member portal. |
approved |
The admin has approved the application. For paid memberships, the member is waiting to complete payment. For free memberships this is a transient state — the system activates them immediately. |
active |
The member is fully activated. They can log in to the member portal and access club resources. |
rejected |
The admin rejected the application. The member is notified by email. A rejection_cooldown_days window (default 7 days) prevents re-application via the public join page. |
expired |
The member was active but their expires_at date has passed. A nightly job transitions eligible records. |
suspended |
Set manually by an admin. The member's access is blocked but the record is preserved. Suspension does not interact with Stripe — any active subscription continues to charge until separately cancelled. |
Payment status
Payment status is set by Stripe webhooks and is only present for members with a Stripe subscription. Members on free plans or manual invoices have a blank payment status.
| Status | What it means |
|---|---|
active |
Stripe is successfully billing the member. |
past_due |
A charge failed but Stripe is retrying. The member keeps access during the retry window. |
cancelled |
The subscription was cancelled (either immediately or at period end). The member's application status is not automatically changed — that transition happens at expires_at. |
How the two statuses interact
Application status and payment status are independent — a member can be application-active but payment-past_due. Use both together to understand a member's situation:
active/past_due— the member is in good standing but has a failed payment. Stripe is retrying; no action needed unless retries exhaust.active/cancelled— the subscription was cancelled but the membership period hasn't ended yet. The member keeps access untilexpires_at.active/ blank — the member is on a free membership or was manually activated without Stripe.
Membership expiry
expires_at is a date field on the member record. When set, it controls when a membership transitions from active to expired. The transition happens via a scheduled job that runs nightly.
Members whose expires_at falls within the next 30 days appear in the Expiring soon filter on the Members index. Use this to send reminders or prompt renewals before access lapses.
To extend a member's expiry without charging them, use the Renew action on their detail page.
Edge cases / gotchas
expiredis not the same ascancelled(payment). Expiry is a time-based transition on the application status; cancellation is a Stripe event on the payment status. They can happen independently.suspendeddoes not cancel Stripe. If you suspend a member who has an active subscription, Stripe continues to charge them. Cancel their subscription separately if you want billing to stop.- Stripe webhooks update payment status asynchronously. There may be a short delay between a Stripe event and the status reflecting in Club OS.
Was this helpful?
Thanks for the feedback!