Skip to Content

Inactive Students for LearnDash

Free

Description

Most LearnDash sites have inactive students nobody knows about. This plugin finds every learner who started a course and stopped, shows the exact step they stopped on, and tells you which lesson loses the most people.

The number nobody can see

You already know your completion rate is lower than you would like. Everyone’s is. What you almost certainly do not know is where the losses happen.

That distinction matters more than it sounds. A completion rate is a scoreboard: it tells you the result, and nothing about the cause. If forty per cent of your learners never finish, that number on its own gives you nothing to act on. But if you can see that twenty-eight per cent of everyone who reached Lesson 3: Configuring Webhooks never got past it, you have something specific and fixable. One lesson. Probably one confusing paragraph, one missing screenshot, or one instruction that stopped being true when the software changed.

LearnDash reporting, and every reporting add-on built on top of it, is built around the scoreboard. Enrolments, completions, time spent, quiz scores. All useful. None of it answers the question that actually changes your revenue: which lesson is costing me completions, and who did I lose to it?

Incomplete courses are expensive in ways that compound. Learners who never finish do not renew. They do not upgrade. They do not leave testimonials or refer anyone. A meaningful share of them ask for refunds — and they are right to, because they did not get what they paid for. Every one of those outcomes traces back to a moment when somebody opened a lesson, did not get through it, and never came back.

Two reports, one question each

Stalled Learners — who has gone quiet

Stalled Learners — who has gone quiet, and the exact step each of them stopped on.
Stalled Learners — who has gone quiet, and the exact step each of them stopped on.

Every row is one learner in one course: their name and email, how far they got, when they were last active, how many days ago that was, and — the column that makes this plugin different from every other LearnDash report — the exact step they stopped on.

Not “45% complete”. Not “last seen in March”. The specific lesson, topic or quiz sitting unfinished in front of them right now, with a link straight to it.

Sort by days inactive to see who has been gone longest. Filter to a single course. Search by name or email. The summary line above the table gives you the headline immediately — “38 of 210 students who started are inactive (18%), most of them stopped at Lesson 4” — so you know the shape of the problem before you read a single row.

Course Drop-off — where the course loses people

Course Drop-off — the whole course as a funnel, with the worst step highlighted.
Course Drop-off — the whole course as a funnel, with the worst step highlighted.

Pick a course and get its whole structure as a funnel, in the order a learner actually reads it: a lesson, then its topics and quizzes, then the next lesson. For every step: how many learners reached it, how many got past it, how many were lost there, and what percentage that represents.

The worst step is highlighted and named in the summary above the table.

That highlighted row is the entire value proposition. It is the difference between “my completion rate is 60%” and “the Configuring Webhooks lesson loses more than a quarter of everyone who reaches it, and here is the list of the specific people it lost”. The first is a fact you can feel bad about. The second is a task you can do on Tuesday.

Courses without linear progression are handled honestly: a learner can complete step 5 before step 4, so “Reached” is floored at “Passed” and drop-off never reports a negative. On a strictly linear course this makes no difference.

What “inactive” actually means here

Reports like this are only worth having if you trust the list. Trust comes from the plugin being strict about who it accuses of quitting. A learner shows up only when all of the following hold:

  • They started. They completed at least one step, or they have a recorded activity against the course. Enrolment alone is not starting — somebody who bought a course and never opened it is a different problem, needing a different fix, and putting them in this list would bury the people you can still save.
  • They have not finished. Anyone who completed the course never appears.
  • They have been quiet for at least N days, where N is yours to set.

Two more rules keep the list clean. Learners whose course access expired are excluded by default, because they did not quit — they lost access, which is a billing conversation rather than a content one. You can include them, clearly flagged, if you would rather see them. And learners whose inactivity genuinely cannot be measured — progress recorded but no activity history at all — are left out and counted separately, rather than being guessed at.

Unpublished courses are skipped. Deleted user accounts are skipped cleanly instead of appearing as nameless quitters.

Set the threshold to match your course

Settings — inactivity threshold, expired access, schedule and course exclusions.
Settings — inactivity threshold, expired access, schedule and course exclusions.

Fourteen days is the default and a reasonable starting point, but the right answer depends entirely on what you teach. A two-week intensive bootcamp and a twelve-month professional certification have completely different rhythms; a fortnight of silence means panic in one and nothing at all in the other. So the threshold is yours to set, and you can change it and rescan as often as you like.

You can also exclude courses entirely. Most sites have at least one piece of evergreen reference material that nobody is expected to work through end to end, and left in the report it would dominate every list and make the real problems harder to see.

Export the list, then use the tool you already have

Both reports export to CSV, honouring whatever filters are on screen, and matching the visible data exactly — so what you download is what you were looking at. There is also a one-click button that copies every email address in the current filtered list to your clipboard, de-duplicated and ready to paste.

What this plugin will not do is send those emails for you, and that is a deliberate decision rather than a missing feature. Sending email properly means deliverability, consent, unsubscribe handling and record-keeping. Your existing mail platform already does all of that, with your existing suppression list and your existing unsubscribe link. A reporting plugin that grew its own parallel sending pipeline would either duplicate that badly or quietly land you in trouble. So this gives you the list and gets out of the way.

Built to survive a real site

This is the heaviest query of anything in the LearnDash reporting space: every learner, against every course, against every step. On a site with a few thousand students, a report like this written the obvious way would simply time out.

So it is never computed when you open the page. A background job works through the site in chunks and writes results to its own tables; the admin screens only ever read that cache. That is why they open instantly whether you have fifty students or fifty thousand, and why the header always tells you exactly how fresh the figures are, with a button to refresh them on demand.

A few details that matter on a production site:

  • A half-finished scan can never corrupt your report. Every row is written tagged with the scan that produced it, and results only go live when a scan completes. If a scan dies part way through, you keep seeing the last good report.
  • Nothing is ever double-counted. A database-level lock means only one worker advances a scan at a time, even when the scheduler, cron and your browser all try at once.
  • It works on hosts where cron does not. Blocked loopback requests silently break WP-Cron and Action Scheduler on a great many hosts. When you are watching the report, the browser drives the scan instead, so Recalculate now finishes while you wait rather than sitting at 1% forever.
  • Chunk size is adjustable, so constrained shared hosting can take smaller bites.

Read-only, and careful about it

The plugin never writes to LearnDash data. No progress is altered, no enrolment is changed, no account is touched. It reads, counts and reports.

Every LearnDash function it calls is wrapped so that a future LearnDash release which moves or renames something degrades to a skipped feature rather than a fatal error. If LearnDash is deactivated entirely, the plugin does nothing and says so in a notice.

Engineering standards

  • Passes phpcs --standard=WordPress with zero errors and zero warnings
  • Every database query prepared; capability and nonce checks on every action
  • Fully translatable, with a .pot file included
  • Uninstall removes its own tables, options and scheduled jobs and nothing else
  • GPL-2.0-or-later

Who this is for

  • Course creators who want to know which lesson to rewrite first, rather than guessing
  • Anyone running re-engagement campaigns who needs an accurate list of who to contact and what they were stuck on
  • Agencies and freelancers auditing a client’s LearnDash site and needing evidence, not impressions
  • Membership and subscription sites where completion drives renewal

Frequently asked questions

How is this different from ProPanel or other LearnDash reporting plugins?

They report on activity and completion — enrolments, completion rates, time spent, quiz scores, and in some cases a list of users who have been inactive. None of them tell you which step a learner stopped on, or which step in a course loses the most people. That step-level view is the whole point of this plugin, and it is the part that tells you what to actually change.

Will it change or delete anything?

No. It is entirely read-only with respect to LearnDash. It creates three of its own tables to cache results, and removes them again if you delete the plugin.

How many days without activity should count as inactive?

Fourteen by default. Adjust it once you have seen one report — a good threshold is comfortably longer than the gap a committed learner would normally leave between sessions on that particular course.

Where does “last activity” come from?

The LearnDash user activity table, which records genuine engagement with lessons, topics and quizzes. Enrolment records are deliberately excluded, so buying a course and never opening it does not count as activity.

What happens to students whose access expired?

They are left out by default, because they did not quit — they lost access. You can include them flagged as “access expired” if you would rather see them.

What about students who never started?

They never appear. This report is specifically about people who began and stopped. People who never began are a real problem too, but a different one with a different fix, and mixing them in would bury the learners you can still recover.

Will this slow my site down?

No. Nothing is calculated on page load. Scans run in the background in chunks, and you can lower the chunk size if your host is particularly constrained.

Does it email students automatically?

No, by design. It gives you the list and a one-click copy of every address, so you can send from whatever you already use — with your existing unsubscribe handling and suppression list intact.

Does it work with LearnDash groups?

Group members appear in the report like any other learner. Filtering and reporting by group is not in this version.

Which LearnDash versions does it support?

Tested against LearnDash 4.10 on WordPress 6.8. It requires WordPress 5.8 or later and PHP 7.4 or later.

Inactive Students for LearnDash — Documentation

How to install and use Inactive Students for LearnDash: the two reports, how "inactive" is defined, every setting, how the background scan works, exports, developer filters and troubleshooting.

Open the full documentation

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.