LifterLMS Mark Complete Not Working? Why Lessons Will Not Complete
Diagnose a LifterLMS lesson that will not mark complete: quiz and assignment requirements, minimum lesson time, cached pages with expired security…
Read article"I paid but I can't get into the course" is the most common support message on any course site. When a LifterLMS student can't access a course, the plugin is almost always doing exactly what it was configured to do. The job is to find out which rule is applying to this student, on this lesson, right now.
This guide gives you a repeatable diagnosis. It explains the order in which LifterLMS checks access, shows how to see what the student sees, and then walks through enrollment, orders, plan expiration, drip, prerequisites, course dates and memberships. A short developer snippet at the end prints the exact reason for any page.
For any course, lesson, quiz or membership-restricted page, LifterLMS runs one function that returns either "accessible" or a restriction with a reason. The checks run in this order, and the first one that fails decides what the student sees:
One more rule explains why you cannot reproduce the problem as an admin. Roles selected in Unrestricted Preview Access under LifterLMS > Settings > General bypass enrollment, drip and prerequisite restrictions. By default that includes administrators, LMS managers, instructors and instructor's assistants.
Start by reproducing the problem from the student's side. The message they get is the fastest clue.
| Message or behaviour | Likely cause |
|---|---|
| The course's Content Restricted Message, or the course sales content | No active enrollment |
| "The lesson ... will be available on ..." | Drip |
| "... cannot be accessed until the required prerequisite ... is completed" | Lesson, course or track prerequisite |
| The course's Course Opens Message or Course Closed Message | Course time period |
| Redirect to a membership page or another URL | Membership restriction and its Restricted Access Redirect |
| Logged-out version of the page although they are logged in | Page caching, not an access rule |
Go to LifterLMS > Reporting > Students, open the student and their Courses tab. Each course shows its Enrollment Status:
From the command line, wp llms course enrollments 123 lists the students enrolled in course 123, which is handy for checking a batch. To restore access manually, use the course's Student Management box in the editor; our guide to memberships and access plans explains how enrollment and plans relate.
Paid enrollments follow the order. Open Orders, find the student's order, and read its status and notes. LifterLMS changes enrollment automatically when the order status changes:
| Order status | Effect on enrollment |
|---|---|
| Completed, Active | Enrolled |
| Pending Payment | Not enrolled yet; the payment never completed |
| Pending Cancellation | Still enrolled until the end of the paid period |
| On Hold, Cancelled, Refunded, or moved to the trash | Enrollment set to Cancelled |
| Expired, Failed | Enrollment set to Expired |
On Hold surprises people most. When a subscription renewal fails, the order goes on hold while LifterLMS retries the payment, and the student loses access until a payment succeeds. Our guide to recurring payments that do not process covers why renewals fail.
The order's Student Enrollment box lets you change the enrollment status or delete it directly. One subtlety: an order only removes the enrollment it created. If an admin enrolled the student manually and their order later expires, that manual enrollment stays.
Two different settings can end access on a date, and they are easy to confuse.
An expired enrollment is renewed by a new purchase or by changing the status manually. A course time period is changed on the course itself.
If the student is enrolled but a specific lesson is locked, look at that lesson's settings.
Lesson drip methods are On a specific date, After course enrollment, After course start date and After prerequisite completion. "After course enrollment" counts from each student's own enrollment date, so a student who enrolled yesterday will not see week-two lessons that an older cohort can. The course can also drip lessons in bulk through Enable Lesson Drip.
A lesson can require another lesson (Enable Prerequisite on the lesson); a course can require a course or a course track. If the prerequisite lesson has a quiz with Require Passing Grade enabled, a failed quiz keeps everything after it locked. Our guide to drip content and prerequisites explains the ordering rules.
Memberships add three more possibilities:
When a membership is the access layer for courses through Auto Enrollment, ending the membership also removes the course enrollments that came from it.
If the enrollment is fine and no rule applies, look outside the access logic:
For developers, this snippet prints the access decision for any course, lesson or quiz page for a given user. Visit the page as an administrator with ?llmsx_check_user=42 added to the URL:
<?php
add_action( 'wp_footer', 'llmsx_print_access_check' );
function llmsx_print_access_check() {
if ( empty( $_GET['llmsx_check_user'] ) || ! is_singular() || ! current_user_can( 'manage_lifterlms' ) ) {
return;
}
$user_id = absint( $_GET['llmsx_check_user'] );
$result = llms_page_restricted( get_the_ID(), $user_id );
echo '<pre>' . esc_html( print_r( $result, true ) ) . '</pre>';
}
The reason value, such as enrollment_lesson, lesson_drip, lesson_prerequisite or course_time_period, and the restriction_id tell you which rule and which item to fix. Remove the snippet afterwards.
Administrators and other roles listed in Unrestricted Preview Access bypass enrollment, drip and prerequisites. Test with a student account.
Check the order. A Pending Payment order means the payment never completed; an On Hold order means a renewal failed. Either way, enrollment follows the order.
Fix the cause first, then change the enrollment status in the order's Student Enrollment box or enroll them from the course's Student Management box.
Work from the student's message to the rule: enrollment, order, plan expiration, course dates, drip, prerequisites, membership, then caching. Writing the answer to each step into your support macro saves time on the next ticket.
If access problems keep recurring after renewals, imports or a migration, our LifterLMS support team can audit enrollments and orders across the site. Contact us with an example student and course.
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 article
Move from Thinkific to LifterLMS in ten ordered steps: exports to run first, how chapters and lesson types map, importing students and completions…
Read articleSkip the trial and error. Get specialist LifterLMS help and ship faster.