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 until expires_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

  • expired is not the same as cancelled (payment). Expiry is a time-based transition on the application status; cancellation is a Stripe event on the payment status. They can happen independently.
  • suspended does 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?