Our work / Open source

At-risk students, for Moodle

One page per course category that lists the students who stopped opening a course, missed deadlines, or have a low course total, with the reason next to each name. Staff record who they contacted and what was agreed, so nobody gets called twice and nobody gets forgotten. It is free and open source.

  • 4.5 to 5.3 Moodle versions, on PHP 8.1 to 8.4
  • GPL v3 free to use and change
  • Alpha try it on a test site first
The At-risk students tab of the Faculty of Science category: five students with their course, coloured reasons such as 3 missed, 17 days without a visit and Course total 38.25%, and for one student the manager's name, the date and a note about the call
What a faculty manager sees: who, in which course, why, and who already called.

Why not use the reports Moodle already has?

Moodle can tell a teacher who has not logged in to one course, and its Analytics model can predict dropout once it has enough past data to learn from. What a programme lead or a student support team needs is different: every struggling student across all the courses they look after, in one list, with a plain reason, and a shared record of who already reached out. Without that, three teachers email the same student and a fourth student slips through. This plugin is that list.

How does it work?

  1. Set the thresholds. Install the plugin and set three numbers: days without a visit, missed deadlines, and the course total that counts as low.
  2. Give managers the category. Anyone with the Manager role on a course category, or the at-risk capability, sees an At-risk students tab on that category.
  3. Read the list. Every few hours a scheduled task rebuilds the list for every visible course. The category page shows each student, the course, why they are listed and who last contacted them.
  4. Record the contact. After an email or a call, the manager records it with a short note. The next person who opens the page sees who called, when, and what was agreed.
  5. The list clears itself. When the student comes back, submits or their grade recovers, they drop off the list at the next refresh. The contact history stays.
The Record contact form for Lucas Ferreira in Organic Chemistry, with a note saying he was stuck on problem set 2 and booked office hours for Thursday
Recording a call takes one note. It shows on the list for everyone who looks after that category.

What puts a student on the list?

Any one of three rules. Each threshold is a site setting, and the grade rule can be turned off.

ReasonWhen it applies
No visit The student has not opened an enrolled course for 14 days (you choose the number). Counted from the enrolment date if they never opened it.
Missed deadlines Two or more assignments past their due date and not submitted. An extension that has not run out does not count.
Low course total The course total is under 50% (you choose, or turn it off). Ungraded work does not count against the student.
  • Only real students. Teachers, suspended enrolments and hidden courses are left out.
  • Rebuilt, not accumulated. The list is rebuilt every few hours, so it never shows a problem that is already solved.
  • On the record. Every contact is a Moodle log event, and the privacy tools export and delete both the flags and the contact notes.

How is it tested?

PHPUnit covers each rule with its edge cases: never visited, extensions, ungraded work in a natural aggregation course total, teachers and suspended students, hidden courses, a flag clearing when its reason goes, subcategories, the latest contact, and the privacy provider. Behat sets up a category with four students, runs the scheduled task, and walks a manager through the list and recording a contact in a real browser, and checks that a teacher without the capability sees nothing. CI runs on Moodle 4.5 to 5.3, on PostgreSQL and MariaDB.

PHPUnit and Behat results PHP test coverage

Questions people ask

How do I find students at risk of failing in Moodle?

Install local_atrisk and set three thresholds: days without opening a course, missed assignment deadlines, and a low course total. Managers of a course category get an At-risk students page listing every student in that category's courses who crosses any of them, with the reason, and can record who contacted each student.

Is this the same as Moodle's Analytics 'Students at risk of dropping out' model?

No. The core Analytics model predicts risk with machine learning and needs past course data to train on. This plugin uses three rules you can read and change, works from the first week, and adds what the core model lacks: one list per category and a record of who contacted each student.

Who can see the list?

Anyone with the local/atrisk:view capability on a course category. By default that is the Manager role. Give it to programme leads or student support staff on their own category, and they see only the courses in it and its subcategories.

Does it email students?

No. It tells staff who to contact and keeps a record of the contact. The message itself goes through whatever your staff already use. We can add Moodle messages or templated emails on request.

Which Moodle versions does it support?

Moodle 4.5 to 5.3, on PHP 8.1 to 8.4, with PostgreSQL or MariaDB/MySQL.

Is it free?

Yes, open source under the GNU GPL v3. If you need other signals (quiz attempts, forum activity, attendance), per-course thresholds, or a feed to your student records or CRM, we build that at a fixed price.

Need other signals or a feed to your CRM?

Quiz attempts, forum activity or attendance as reasons, thresholds per course or programme, messages to students from the list, or the list sent to your student records or CRM. We build that on top of this plugin at a fixed price.

Get a fixed price

Backed by Ta9in.