What does the Leaky Paywall Payment Status field mean?
Subscriber Payment Statuses
Every subscriber in Leaky Paywall has a Payment Status that controls whether they can access restricted content. This article explains what each status means, which ones grant access, and how the expiration date interacts with status.
How Access Is Determined
Status is the single source of truth for subscriber access. If a subscriber's status is in the "grants access" group, they can read restricted content. If it isn't, they can't — regardless of what their expiration date shows.
The expiration date isn't checked directly when a subscriber tries to access content. Instead, a daily background job automatically transitions active and trial subscribers to expired once their expiration date has passed (with a 24-hour grace window). Gateways like Stripe and PayPal also update status automatically via webhooks when a payment fails, a subscription cancels, or a trial ends.
This means you should look at Payment Status — not the expiration date — to understand whether a subscriber currently has access.
Statuses That Grant Access
| Status | Label Shown to Subscriber | Description |
|---|---|---|
active |
Active | Subscription is active and billing as scheduled. |
pending_cancel |
Cancels Soon | Subscriber has canceled but access continues until the current billing period ends. |
trial / trialing |
Trial Active | Subscriber is in an active trial period. |
past_due |
Action Needed | Last payment failed. Subscriber retains access while the gateway retries the charge. |
Note:
past_duesubscribers keep access because gateways (Stripe, PayPal) retry failed payments and handle the final status transition via webhook. LP does not expirepast_duesubscribers via the daily cron — that's left to the gateway.
Statuses That Do Not Grant Access
| Status | Label Shown to Subscriber | Description |
|---|---|---|
canceled |
Canceled | Subscription was canceled and the billing period has ended. |
expired |
Ended | Subscription period has ended (set by the daily cron or gateway). |
deactivated |
Deactivated | Manually deactivated by an admin, or deactivated due to a payment issue. |
unpaid |
Payment Failed | Subscription is paused due to unresolved failed payment. |
incomplete |
Setup Incomplete | Subscription was started but initial payment was never completed. |
incomplete_expired |
Subscription Expired | Subscription setup window expired before payment was collected. |
paused |
Paused | Subscription is paused; no billing is occurring. |
pending_activation |
Pending Activation | Awaiting admin activation or approval. |
renewal_due |
Renewal Due Soon | Subscription is approaching its renewal date. |
on_hold |
On Hold | Temporarily paused — subscriber should contact support to resume. |
grace_period |
Grace Period | Payment failed but access has not yet been revoked. Typically set by a gateway before transitioning to past_due or canceled. |
suspended |
Suspended | PayPal-specific status indicating the subscription has been suspended. |
How the Expiration Date Works
The expiration date determines when a status transition happens, not whether access is granted in the moment.
Each night, Leaky Paywall runs a scheduled job that:
- Finds all subscribers with an access-granting status (
active,trial) whose expiration date was more than 24 hours ago - Sets their status to
expired
The 24-hour grace window prevents accidental expiration due to timing differences between when a payment is made and when it's processed.
Subscribers on pending_cancel or past_due are intentionally skipped by the cron — their final status is determined by gateway webhooks, not the expiration date.
Setting Status Manually
Admins can update a subscriber's status at any time from Leaky Paywall → Subscribers → [subscriber]. The dropdown in the admin UI includes the most common statuses: active, pending_cancel, trial, past_due, canceled, expired, and deactivated.
Common Scenarios
"A subscriber says their account expired but they're still paying." Check their Payment Status. If it shows expired or canceled, their gateway status didn't sync correctly — check your webhook configuration. Set the status back to active manually to restore access.
"I manually set a subscriber's expiration date to next year but they still can't log in." The expiration date alone doesn't grant access — the status must be in the access group. Set their status to active.
"A subscriber canceled but still has access." This is expected behavior if their status is pending_cancel. They retain access through the end of their paid period. Once the period ends, the gateway sends a webhook that transitions their status to canceled and access is revoked.
"An active subscriber lost access unexpectedly." The daily cron may have expired them if their expiration date was in the past. Check their expiration date and update both the date and status to restore access.
Developer Notes
Filtering which statuses grant access:
add_filter( 'leaky_paywall_access_statuses', function( $statuses ) { $statuses[] = 'grace_period'; // grant access during grace period return $statuses; } );
Hooking into status transitions:
`// Fires on any status change add_action( 'leaky_paywall_status_transition', function( $new_status, $old_status, $user_id ) { // your logic }, 10, 3 );
// Fires when a subscriber gains access add_action( 'leaky_paywall_status_gained_access', function( $new_status, $user_id ) { // your logic }, 10, 2 );
// Fires when a subscriber loses access add_action( 'leaky_paywall_status_lost_access', function( $new_status, $old_status, $user_id ) { // your logic }, 10, 3 );`