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_due subscribers keep access because gateways (Stripe, PayPal) retry failed payments and handle the final status transition via webhook. LP does not expire past_due subscribers 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:

  1. Finds all subscribers with an access-granting status (activetrial) whose expiration date was more than 24 hours ago
  2. 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 );`

Still need help? Contact Us Contact Us