Our work / Open source
Recertification for Moodle
A Moodle plugin that makes course completions expire. A year after a learner finishes fire safety, safeguarding or any annual refresher, Moodle reminds them, archives what they did, resets their progress and asks them to complete it again. 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
Why can't Moodle do this already?
Moodle tracks when a learner completes a course. It has no idea that a completion should stop counting a year later. Schools, hospitals, care providers and companies with mandatory training end up exporting completions to a spreadsheet and chasing people by email.
The plugin many of them used, Course recompletion, is now sold on the Moodle Marketplace (US$25 a year when we checked in November 2026). We built an open source one for Moodle 4.5 to 5.3, with an archive of every past certification.
How does recertification work?
Switch it on in a course and set how many days a completion stays valid. A daily task does the rest.
- Completion. The learner completes the course as usual. Their certification is valid from that day.
- Reminders. Before it expires (30 and 7 days by default), Moodle reminds them. Each learner gets the nearest reminder once, even if cron missed a few days.
- Expiry. On the day it expires, Moodle copies everything they did into the history: activity completion, grades, the course total, quiz attempts and SCORM tracking.
- Reset. Then it clears that progress in the course, through the quiz, SCORM and gradebook APIs, and tells the learner to complete it again.
- Retake. The learner completes the course again and is certified for another period. The past certification stays on record.
Why is resetting completion harder than it looks?
Clearing a learner's completion is not enough. Moodle recalculates activity completion from the module's own data the next time the learner opens the activity. If the old quiz grade and attempts are still there, the quiz marks itself complete again the moment the retake starts, and the course shows the learner as certified without a retake. We wrote a test for exactly that before writing the reset, and watched a completion-only reset fail it.
So the reset removes what completion is calculated from, after archiving it:
| Learner data in the course | Archived and reset? |
|---|---|
| Activity and course completion | Yes |
| Gradebook grades and the course total | Yes, through the grade API, so the grade history shows the deletion |
| Quiz attempts | Yes, through mod_quiz, which logs each deleted attempt |
| SCORM attempts and tracking | Yes, through mod_scorm |
| "Viewed" records for activities | Yes |
| Assignment submissions | Not yet. Planned. |
What do auditors and managers get?
- History. Every expired certification with its completion date, expiry date, course total and the full archive of what the learner did.
- Reports. A report builder source, "Past certifications", for compliance reports across the site, by course, learner and date. Only site managers can use it.
- Logs. Each expiry is a Moodle log event.
- Privacy. The history and the reminders sent are covered by Moodle's privacy API for export and deletion.
- No surprises. The status page works while recertification is off and says how many learners would be reset in the next 7 days.
How is it tested?
PHPUnit covers the reset with a real quiz attempt (including the case above), the archive, certifying again after a reset, other learners left alone, SCORM, the reminder schedule, the daily task, the privacy provider and the report source. A Behat scenario covers the status page and settings. CI runs on Moodle 4.5 to 5.3, on PostgreSQL and MariaDB.
Client plugins get the same checks. See what "done" means.
Questions people ask
How do I make a Moodle course completion expire after a year?
Install this plugin, open Recertification from the course's More menu, switch it on and set Valid for to 365 days. A daily task reminds learners before their completion expires, then archives and resets their progress so they complete the course again.
Why not just reset course completion?
Because it comes back. Moodle recalculates activity completion from the module's own data, the old quiz grade, attempts and SCORM tracks, the next time the learner opens the activity. A reset that only clears completion undoes itself and shows the learner as certified again without a retake. This plugin removes the data completion is calculated from, after archiving it.
Is the learner's old result lost?
No. Before the reset, the plugin stores their completion date, the course total, each activity's grade and completion state, every quiz attempt and the SCORM tracking values in a history table. Site managers can report on it with Moodle's report builder.
Can I see who would be reset before I switch it on?
Yes. The status page works while recertification is off. It shows each learner as valid, expiring soon, expired or not completed, with completion and expiry dates, and how many would be reset in the next 7 days.
Which Moodle versions does it support?
Moodle 4.5 to 5.3, on PHP 8.1 to 8.4, with PostgreSQL or MariaDB/MySQL. Course completion and cron must be on.
Is it free?
Yes, open source under the GNU GPL v3. If you need periods per role, assignment resets, a link to your HR system or certificates on renewal, we build that at a fixed price.
Need it to fit your training rules?
Different periods per role, assignment resets, certificates on renewal, a feed to your HR system. We build that on top of this plugin at a fixed price.
Get a fixed priceBacked by Ta9in.