LifterLMS Student Can’t Access a Course? How to Diagnose It
A methodical way to find out why a LifterLMS student cannot open a course or lesson: the order LifterLMS checks access in, enrollment and order…
Read articleWhy LifterLMS subscriptions stop renewing and how to fix each cause: the staging lock, stalled cron and scheduled actions, gateway problems, declined cards and retries, and on-hold orders, starting from the order notes LifterLMS writes.
When LifterLMS recurring payments stop processing, revenue quietly stops and students start losing access. The good news is that LifterLMS leaves a trail. Every skipped or failed renewal adds a note to the order, and most problems come down to five causes: the staging lock, cron not running, a gateway problem, a declined card, or missing data.
This guide is for course owners and developers running subscriptions or payment plans. It explains how a renewal actually happens, how to read the order notes, and how to fix each cause, including the tools in LifterLMS > Status that reschedule renewals safely.
Recurring billing in LifterLMS works like this:
llms_charge_recurring_payment action for the next payment date in the Action Scheduler, the background job system bundled with LifterLMS.Each step can stop a renewal, and each leaves different evidence. If you are still setting up plans, our guide to payment plans and free trials covers the configuration side.
Open the order under Orders and read the notes panel. These messages come straight from LifterLMS:
| Order note | Meaning |
|---|---|
| "Recurring charge skipped because recurring payments are disabled in staging mode." | The staging lock is on |
| "Recurring charge was not processed due to an error encountered while loading the payment gateway" | The gateway add-on is inactive or misconfigured |
| "Recurring charge skipped because recurring payments are disabled for the payment gateway." | The gateway no longer supports recurring charges |
| "Recurring charge skipped. The user (#...) no longer exists." | The student's account was deleted |
| "Recurring charge aborted because the purchased product does not exist anymore." | The course or membership was deleted; the order is cancelled |
| "Automatic retry attempt scheduled for ..." | A charge failed and a retry is queued |
| "Maximum retry attempts reached." | All retries failed; the order is now Failed |
| No note at all on the due date | The scheduled action never ran: check cron |
For more detail, the recurring-payments log under LifterLMS > Status > Logs records the same failures with order IDs.
LifterLMS stores a copy of your site URL. If the current URL no longer matches, it assumes the site is a staging copy and disables automatic recurring payments, so a clone never charges your real customers twice. That is exactly what you want on staging, and exactly what you do not want after moving the live site to a new domain, switching to HTTPS, or restoring a backup.
Signs and fixes:
Re-enabling payments after a period in staging mode can cause renewals that were skipped to be handled late, so read the official staging documentation and our guide to staging sites and recurring payments before you switch it on. Version 10.3.0 tightened how LifterLMS blocks charges when the URL changes, so keep core up to date.
If there is no note at all on the due date, the scheduled charge never ran. The Action Scheduler depends on WP-Cron and on loopback requests from your server to itself, and both are commonly broken by:
DISABLE_WP_CRON in wp-config.php without a real server cron job.To check and fix:
llms_charge_recurring_payment. Pending actions with a date in the past mean the queue is not running. Failed actions show the error that stopped them.wp cron event run --due-now does the job.wp action-scheduler run --hooks=llms_charge_recurring_payment, or use the run link on each action in the Scheduled Actions screen.A broken cron also delays emails, so if students report missing reminders too, see fixing LifterLMS emails that do not arrive.
The renewal is handed to the order's gateway add-on, so anything that breaks the add-on breaks renewals:
For Stripe-specific setup, see our LifterLMS Stripe guide.
The Manual gateway is a special case: it cannot charge anyone. When a renewal falls due on a manual order, LifterLMS puts the order on hold until you record the payment, which is expected behaviour, not a fault.
When a charge is declined, Retry Failed Payments under LifterLMS > Settings > Checkout decides what happens next. It is on by default and works with gateways that support retries, which the retry documentation lists as Stripe, Authorize.Net and PayPal with reference transactions.
The default schedule retries after 12 hours, then after 1, 2 and 3 more days, with the student notified from the second attempt. During retries the order is On Hold. After the last failure the order becomes Failed. Developers can change the schedule with the llms_order_automatic_retry_rules filter.
Two consequences catch site owners out:
Students fix a declined card themselves from the order on their Student Dashboard, using Update Payment Method, where they can save a new card and pay the amount due.
LifterLMS fires an action for each reason a renewal can stop. A developer can collect them into one log to spot patterns across many orders:
<?php
$llmsx_renewal_hooks = array(
'llms_order_recurring_charge_skipped' => 'staging mode',
'llms_order_recurring_charge_gateway_error' => 'gateway unavailable',
'llms_order_recurring_charge_gateway_payments_disabled' => 'gateway does not support recurring',
'llms_order_recurring_charge_user_error' => 'user missing',
'llms_order_recurring_charge_aborted_product_deleted' => 'product deleted',
);
foreach ( $llmsx_renewal_hooks as $llmsx_hook => $llmsx_reason ) {
add_action(
$llmsx_hook,
function ( $order_id ) use ( $llmsx_reason ) {
llms_log( sprintf( 'Renewal stopped for order #%d: %s', $order_id, $llmsx_reason ), 'renewal-audit' );
},
10,
1
);
}
Pair it with a weekly look at Scheduled Actions and you will catch problems before customers notice.
A failed renewal puts the order on hold while LifterLMS retries, and an on-hold order cancels the enrollment until payment succeeds. Access returns automatically when the order becomes active again.
Run the pending llms_charge_recurring_payment action from Scheduled Actions or with WP-CLI once the underlying cause is fixed. Check the order notes afterwards.
The site URL changed, so LifterLMS's staging protection switched automatic payments off. Re-enable them from the staging notice on the live site.
Yes. A payment plan is a recurring order with a fixed number of payments, so the same scheduling, checks and retries apply.
Open one affected order, read its notes, and match them to the causes above. Then check Scheduled Actions for overdue renewals before you fix anything else, so you know how many orders are affected.
If renewals are failing at scale, after a migration or across gateways, our LifterLMS support team can audit orders and scheduled actions and recover missed payments safely. Contact us with an example order number.
A methodical way to find out why a LifterLMS student cannot open a course or lesson: the order LifterLMS checks access in, enrollment and order…
Read article
Diagnose a LifterLMS lesson that will not mark complete: quiz and assignment requirements, minimum lesson time, cached pages with expired security…
Read article
Find out why LifterLMS emails are not arriving and fix it: tell sending failures from delivery failures, set up SMTP and a matching sender address…
Read articleSkip the trial and error. Get specialist LifterLMS help and ship faster.