LifterLMS Course Tracks: Learning Paths, Prerequisites, Certificates

How LifterLMS course tracks turn separate courses into a learning path: create a track, require it before an advanced course, award a certificate when it is complete, sell it as a bundle, and show students their progress.

  • Add as a preferred source on Google
Illustration for “LifterLMS Course Tracks: Learning Paths, Prerequisites, Certificates”

LifterLMS course tracks group related courses into a learning path. A track can be a certification programme, a role-based curriculum such as "New manager essentials", or a beginner-to-advanced sequence on one subject. Once courses share a track, LifterLMS can treat the whole path as one unit: it knows when a student has finished every course in it, can lock an advanced course until the path is done, and can award a certificate for the path.

This guide is for course creators and training managers planning a multi-course programme. It explains what tracks do and do not do, walks through setting one up with a prerequisite and a completion certificate, and shows how to display a student's progress through a track. Behaviour described here was checked in the LifterLMS 10.3 source.

What a course track is, and how it differs from a category

Technically, a track is a WordPress taxonomy, like a category. You find it under Courses > Tracks, and you assign courses to tracks from the Course Tracks panel in the course editor. A course can belong to several tracks.

The difference is what LifterLMS does with it. Categories only organize the catalog. Tracks are "completable":

FeatureCourse categoryCourse track
Groups courses on an archive pageYesYes
Can be nested (parent and child)YesYes
Shown on the course pageYesYes, as "Tracks:"
Student progress and completionNoYes
Can be a course prerequisiteNoYes
Can trigger an engagementNoYes

Use categories for topics that help visitors browse, and tracks for paths that students actually complete. Our guide to organizing courses with categories, tags and difficulty covers the browsing side.

What tracks do not do

Being clear about the limits saves a lot of rework:

  • A track is not a product. Students cannot buy or enroll in a track. They enroll in its courses individually, or through a membership that includes them.
  • A track does not set an order. LifterLMS knows which courses are in the track, not which comes first. Order is enforced with course prerequisites.
  • A track is not restricted content. The track archive page lists its courses to everyone, like a category page.
  • Child tracks do not roll up. A parent track counts only the courses assigned to it directly. Courses in a child track do not count towards the parent's completion, so assign courses to every track that should include them.

How track completion is worked out

A student completes a track when they have completed every published course in it. Progress is a simple percentage: completed courses divided by courses in the track. Draft courses are ignored.

The calculation runs when the student completes a course. Completing the last outstanding course completes the track, fires the lifterlms_course_track_completed action, and runs any engagements and notifications attached to it. A course in several tracks can complete several tracks at once.

Because the result is stored per student and updated as they complete courses, decide which courses belong in a track before students start it. Adding a course to a track that people have already finished, or removing one, can leave their stored progress out of step with the new structure. If you must restructure a live track, test with a student account that had finished it, and plan how you will handle certificates already issued.

Set up a learning path step by step

The example below builds a three-course path, Foundations, Practitioner and Advanced, with a capstone course that unlocks only when the path is complete.

1. Create the track

  1. Go to Courses > Tracks.
  2. Enter a Name, for example "Practitioner certification".
  3. Add a Description. It appears at the top of the track's archive page, so write it for students: what the path covers and what they get at the end.
  4. Click Add New Course Track.

2. Assign courses

  1. Open each course in the editor.
  2. In the Course Tracks panel in the sidebar, tick the track.
  3. Update the course.

The course page now shows "Tracks:" with a link to the track archive at /course-track/practitioner-certification/. The URL base can be changed in the LifterLMS Permalinks section of Settings > Permalinks.

3. Enforce the order inside the path

Open the Practitioner course, go to the Restrictions tab of the course options, check Enable Prerequisite, and select Foundations in Choose Prerequisite Course. Do the same for Advanced, choosing Practitioner. Each course now waits for the one before it.

4. Require the whole track before the capstone

Open the capstone course. Leave it out of the track. In the same Restrictions tab, check Enable Prerequisite and select the track in Choose Prerequisite Course Track. You can set a prerequisite course and a prerequisite track on the same course; the student must complete both.

Students who have not finished the track see a notice on the capstone's course page: "Before starting this course you must complete the required prerequisite track", with a link to the track. Its lessons stay locked with a similar message.

Note what a prerequisite does not block: enrollment. Students can still buy or enroll in the capstone; they just cannot open its content until the track is complete. If buying it early would cause support requests, say so on the sales page or only sell the capstone inside a bundle. For more on how prerequisites and drip interact, see LifterLMS drip content and prerequisites.

Award a certificate when a track is complete

Track completion is one of the built-in engagement triggers, so a path certificate needs no code.

  1. Create the certificate template under Engagements > Certificates. Name the programme on it, because certificate merge codes do not include the track name. Our guide to LifterLMS certificate merge codes lists what you can insert automatically.
  2. Go to Engagements > Engagements and add a new engagement.
  3. Set Triggering Event to Student completes a course track.
  4. In Select a Course Track, choose your track. Leaving it empty means any track.
  5. Choose the certificate as the engagement to award, set a delay if you want one, and publish.

The same trigger can send an email or award an achievement badge. LifterLMS also has a built-in "Course Track Complete" notification that congratulates the student on screen and by email; you manage it under LifterLMS > Settings > Notifications. The LifterLMS course track documentation describes the same options.

Test it with a separate student account rather than your administrator account, so you see exactly what a student receives.

Sell a track as a bundle

Since a track cannot be bought, the usual pattern is a membership that mirrors it:

  1. Create a membership named after the path.
  2. In its Auto Enrollment settings, add every course in the track with Add Course(s).
  3. Give the membership an access plan with the bundle price.

Buying the membership enrolls the student in all the courses. The track then does the tracking, the prerequisites do the ordering, and the engagement does the certificate. Keep the membership's course list and the track's course list identical, or students will finish one but not the other. Our article on course bundles and upsells covers pricing the bundle against individual courses.

Show students their progress through a track

Core shows progress per course, on the course page and the student dashboard, but has no built-in "track progress" display. A small shortcode fills the gap. It uses the real LLMS_Track and LLMS_Student classes:

<?php
/**
 * Plugin Name: LLMSX Track Progress
 * Usage: [llmsx_track_progress track="practitioner-certification"]
 */

add_shortcode( 'llmsx_track_progress', 'llmsx_track_progress_shortcode' );
function llmsx_track_progress_shortcode( $atts ) {
	$atts    = shortcode_atts( array( 'track' => '' ), $atts );
	$student = llms_get_student();
	$term    = get_term_by( 'slug', sanitize_title( $atts['track'] ), 'course_track' );

	if ( ! $student || ! $term ) {
		return '';
	}

	$track   = new LLMS_Track( $term );
	$courses = $track->get_courses();
	$percent = $student->get_progress( $term->term_id, 'course_track' );

	$html  = '<div class="llmsx-track-progress">';
	$html .= '<p>' . esc_html( sprintf( '%s: %s%% complete', $track->get_title(), $percent ) ) . '</p><ul>';
	foreach ( $courses as $course ) {
		$done  = $student->is_complete( $course->ID, 'course' );
		$html .= sprintf(
			'<li>%s <a href="%s">%s</a></li>',
			$done ? '&#10003;' : '&#9675;',
			esc_url( get_permalink( $course ) ),
			esc_html( get_the_title( $course ) )
		);
	}
	$html .= '</ul></div>';

	return $html;
}

Place it on the track description, a welcome page or a custom dashboard tab. Courses are listed in the order WordPress returns them, which is by date, not your learning order; if order matters, sort them by a value you control, such as the course menu order.

Common mistakes with course tracks

  • Expecting the track to set the order. It does not; add prerequisites.
  • Putting the capstone inside the track it depends on. The track can then never be completed before the capstone, so the capstone stays locked for good.
  • Relying on parent tracks. Only directly assigned courses count.
  • Leaving a draft course in the track. It is ignored, so students can complete the track without it. Publish it, or remove it from the track until it is ready.
  • Changing a live track without a plan for students who are mid-way or already certified.

Frequently asked questions

Can a student enroll in a whole track at once?

Not directly. Create a membership with the track's courses as auto-enrollment courses, and sell that.

Can a course belong to more than one track?

Yes. Completing it counts towards every track it belongs to.

Do tracks appear on the course catalog?

Each track has its own archive page listing its courses, using the catalog's sorting and pagination. Link to it from menus or landing pages.

Can I report on who has completed a track?

Core reporting is organized by course, membership and student, not by track. Completion of a track is recorded, and engagements fire on it, so a certificate or a CRM tag set by an engagement is a practical way to track it. A dedicated track report is custom development.

What to do next

Sketch the path on paper first: which courses, in which order, what unlocks what, and what the student receives at the end. Then build it in this order: track, course assignments, prerequisites, certificate engagement, and finally the bundle membership if you sell the path as one product.

If your programme needs things core does not provide, such as track reports for managers, a path progress page in the student dashboard, or CE credits that add up across a track, our LifterLMS development service builds those on top of tracks without changing core files. Contact us with an outline of your programme and we will suggest the leanest way to deliver it.

Add LifterLMS Expert to your preferred sources

Add lifterlmsexpert.com 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