LifterLMS Lesson Time Tracking and Minimum Time on Lessons

How the lesson time tracking added in LifterLMS 10.1 works: setting a minimum time on a lesson, what students see, where Time in Course appears in reports, and how far you can rely on it for compliance.

  • Add as a preferred source on Google
Illustration for “LifterLMS Lesson Time Tracking and Minimum Time on Lessons”

If you need proof that students actually spent time on a lesson, or you want to stop people clicking Mark Complete ten seconds after the page loads, LifterLMS now has a built-in answer. Lesson time tracking arrived in LifterLMS 10.1 and is part of the free core plugin.

It does two jobs. It records how long each logged-in student spends on a lesson, and it can enforce a minimum time before the lesson can be completed. This guide is for course owners and training managers who want to switch it on, read the numbers correctly, and understand where the limits are before promising a regulator or a client anything.

Everything below was checked against the LifterLMS 10.3 source code, so the labels match what you will see in your dashboard.

What lesson time tracking does

When a student opens a tracked lesson, LifterLMS starts a time session for that student and lesson. A small script in the browser sends a heartbeat to the server every 30 seconds, and the server credits the time since the previous heartbeat. When the student leaves the page, a final request closes the session. Sessions add up across visits, so a student who spends six minutes today and four tomorrow has ten minutes on that lesson.

Two things make the numbers harder to inflate than a simple browser timer:

  • The server decides what to credit. It never credits more time than has actually passed since the session started, and it caps any single heartbeat at five minutes. A browser left asleep for an hour does not earn an hour.
  • One open session per student. Opening a tracked lesson closes any other open session for that student. Running two lessons in two tabs does not double the clock; the older tab shows a message asking the student to reload.

Time is only tracked for logged-in users. On a lesson marked as a free preview, time is tracked only for students enrolled in the course, and the minimum time setting is not available on free lessons at all, because visitors can open them without an account.

How to set a minimum time on a lesson

You can set the requirement in the lesson editor or in the course builder.

In the lesson editor

  1. Edit the lesson and scroll to the Lesson Settings box.
  2. On the General tab, tick Enable Minimum Time. (It is hidden while Free Lesson is ticked.)
  3. Enter the Hours, Minutes and Seconds the student must spend on the lesson.
  4. Update the lesson.

In the course builder

Open the lesson's settings panel in the builder and switch on Minimum Time on Lesson, then fill in the time fields. This is quicker when you are setting requirements across a whole course. For the rest of the builder, see our LifterLMS course builder guide.

Choose realistic times

Base the minimum on the content, not on a round number. A twelve-minute video with a short reading is a good candidate for ten minutes. Setting thirty minutes on a five-minute lesson teaches students to open the page and walk away, which defeats the point and fills your inbox with complaints.

What students see

On a lesson with a minimum time, a timer appears above the lesson content. By default it reads like 0:03:12 (Minimum required time: 0:10:00). Until the time is met:

  • The Mark Complete button is disabled.
  • The button to start the lesson's quiz is disabled, and so is the start button for an assignment if you use the Assignments add-on.
  • If the student tries to start the quiz by other means, the server refuses with the message that they must spend the required minimum time on the lesson first.

When the requirement is met the buttons unlock without a page reload. The check is enforced on the server as well, so removing the disabled attribute in the browser does not let anyone complete the lesson early.

You can change the wording under LifterLMS > Settings > Courses, in the Lesson Time Tracking section. The Timer Display Format field accepts the placeholders {CURRENT_TIME} and {MINIMUM_TIME}, for example "Time on this lesson: {CURRENT_TIME} of {MINIMUM_TIME}".

If the student's login expires mid-lesson, the timer stops and asks them to log in again. Tell students this up front, especially on long lessons.

Tracking time on every lesson for reporting

By default, only lessons with a minimum time are tracked. If you want time data for the whole course without forcing a minimum anywhere, go to LifterLMS > Settings > Courses and tick Track Time on All Lessons.

With this on, lessons without a minimum are tracked silently: no timer is shown and nothing is locked. It is the better choice when you want to learn how long lessons really take before you decide on minimums, or when a client wants a time-on-course figure without changing the learner experience.

The setting only affects time collected from that point on. Switching it on today does not create history for last month.

Reading Time in Course reports

Time data appears in three places under LifterLMS > Reporting:

WhereWhat you see
Courses > a course > StudentsA Time in Course column with each student's total, which is also included when you export the table.
Students > a student > Courses > a courseA Total Course Time tile at the top of the student's course report.
The same screen, lesson tableA Time on Lesson column per lesson. Times below the lesson's minimum are shown in red.

Times are shown as hours, minutes and seconds. Two labels need explaining to whoever reads the report:

  • (Partial) after Total Course Time means some lessons in the course are not tracked, because they have no minimum and Track Time on All Lessons is off. The total is real, but it does not cover the whole course.
  • (Overridden) after a lesson time means an administrator completed the lesson for the student, bypassing the minimum. More on that below.

The LifterLMS documentation for the course Students report describes the other columns. For using them day to day, see our guide to LifterLMS reporting and student progress.

Admin overrides and resets

Sometimes a student genuinely did the work and the clock disagrees: a lost connection, a long video watched in another app, a support case. An administrator can mark the lesson complete for the student from the reporting screens, and LifterLMS allows it even when the minimum has not been met.

It does not do this silently. The override is stored against the student and lesson with the admin's user ID, the trigger, the time actually recorded, the time required and the date, and the report shows (Overridden). If the lesson is later marked incomplete, the override record is cleared.

For a compliance programme you will often want overrides in your own audit log as well. LifterLMS fires the action llms_lesson_time_admin_override with all of those details, so a small snippet in a custom plugin can write them to a LifterLMS log file:

<?php
/**
 * Plugin Name: LLMSX Time Override Log
 */
add_action( 'llms_lesson_time_admin_override', 'llmsx_log_time_override' );

function llmsx_log_time_override( $data ) {
	$admin   = get_userdata( $data['admin_id'] );
	$message = sprintf(
		'Override by %1$s (#%2$d): student #%3$d, lesson #%4$d, recorded %5$ds of %6$ds required, trigger %7$s.',
		$admin ? $admin->user_login : 'unknown',
		$data['admin_id'],
		$data['student_id'],
		$data['lesson_id'],
		$data['actual_time'],
		$data['required_time'],
		$data['trigger']
	);
	llms_log( $message, 'time-overrides' );
}

The log appears under LifterLMS > Status > Logs. Put code like this in a small plugin rather than your theme, as described in how to customize LifterLMS without breaking updates.

Developers can also change the heartbeat interval with the llms_lesson_time_heartbeat_interval filter (default 30 seconds) and the maximum credit per heartbeat with llms_lesson_time_max_credit_per_heartbeat (default 300 seconds). Leave both alone unless you have measured a reason: a shorter interval means more requests to your server for every student on a lesson.

Using time tracking for compliance

Many regulated programmes ask for a minimum number of hours: continuing education credits, mandatory workplace training, safety refreshers. Lesson time tracking is useful evidence for these, as long as you describe it accurately.

What it can show

  • That a named, logged-in student had the lesson page open for at least the required time, measured by the server.
  • That they could not complete the lesson or start its quiz before that time.
  • When an administrator overrode the requirement, and who did it.

What it cannot show

  • Attention. The timer keeps running while the page is open, even in a background tab. There is no idle detection. It measures time on the page, not time paying attention.
  • Video watched. It does not know whether an embedded video was played. If you need that, you need a video player or add-on that reports viewing progress.
  • Identity. It cannot prove the account holder was the person at the keyboard. Combine it with measures against account sharing and, where the stakes are high, proctored assessment.

Check your accrediting body's rules before you rely on it. Some accept seat time recorded by the LMS. Others want a final assessment, a signed attestation or both. A practical pattern is a minimum time on each content lesson, a graded quiz at the end, and a certificate that is only awarded on passing.

Common mistakes and troubleshooting

  • The timer never appears. The lesson is marked as a Free Lesson, the student is not logged in, or Enable Minimum Time is not ticked. With Track Time on All Lessons alone, no timer is shown by design.
  • "Your session on this lesson has expired". The student opened another tracked lesson, or the same lesson in a second tab. Reloading starts a new session and keeps the time already earned.
  • Time looks too low. Heartbeats were blocked. Firewalls, security plugins or aggressive caching that interfere with admin-ajax.php requests stop time being credited. Test with a student account in a private window and watch the network panel.
  • Minimums on every lesson. Students resent waiting on short lessons. Use minimums where the content justifies them and track the rest silently.
  • Changing minimums mid-cohort. Raising a minimum after students have completed a lesson does not reopen it. Change requirements between cohorts, not during one.

Frequently asked questions

Is lesson time tracking a paid add-on?

No. It is part of the free LifterLMS core plugin from version 10.1. Update LifterLMS if you do not see the settings.

Does the timer pause when the student switches tabs?

No. Time keeps counting while the lesson page is open. Only one lesson can be tracked at a time, and the server never credits more time than has actually passed.

Can I set a minimum time for a whole course instead of each lesson?

Not directly. The minimum is set per lesson. The course total is the sum of lesson times and appears as Time in Course in reporting.

Can students see how much time they have spent?

Yes, on lessons with a minimum time the timer shows their accumulated time for that lesson. Course totals are only shown in the admin reports.

What to do next

Turn on Track Time on All Lessons for a few weeks before you set any minimums. The real numbers will tell you which lessons are skimmed and what a fair minimum looks like. Then add minimums to the lessons that matter, and check the reports after the first cohort.

If you need more than the core feature offers, such as idle detection, video-watch tracking, time reports per cohort or an export your accrediting body will accept, that is custom work. Our LifterLMS customization team builds these on top of the core data. Tell us what your compliance rules require and we will tell you what is realistic.

Add LifterLMS Expert to your preferred sources

Add lifterlmsexpert as a preferred source on Google, or open this article in your AI assistant to use it as a source.

  • Add as a preferred source on Google
Free consultation

Prefer expert help over DIY?

Skip the trial and error. Get specialist LifterLMS help and ship faster.

Talk to a LifterLMS Expert Explore our services

Replies within one business day