Our work / Open source

Final grade submission, for Moodle

Teachers check each course total and submit it. Submitted totals are locked in the gradebook. A head of department can approve them first. Every night the grades waiting to be sent go into one CSV file for your student records system, with new, changed and withdrawn grades marked. 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
A course's final grades page: tiles for five not submitted, two waiting for approval, one ready to send and two sent, then each student's ID number, course total, percentage, letter and status, with a returned grade and its reason, a missing ID number and an ungraded exam flagged
The teacher's page. Jonas's grade came back from the head of department with a reason. Maya's exam is not marked yet, and the page says so before anyone submits.

How do schools get final grades out of Moodle today?

Mostly by hand. The teacher exports the gradebook, someone cleans the spreadsheet, and the registrar uploads it to Banner, SITS or whatever the records system is. Grades change in Moodle after the spreadsheet was made and nobody notices. Universities that fixed this each built their own "submit final grades" button, and the open one we found, UCL's marks transfer, only talks to SITS. This plugin does the part every school needs: a clear submit step, a lock, an optional sign off, and a file the records system can load.

How does final grade submission work?

  1. Check. Open Final grades in the course menu. Each student's course total, percentage and letter are listed, with a warning for items not graded yet and for missing ID numbers.
  2. Submit. Tick the students whose total is final and submit. Their totals are locked in the gradebook, so a late change to an activity cannot move them.
  3. Approve. If your school wants a second pair of eyes, a head of department approves the grades or returns them to the teacher with a reason.
  4. Export. Every night the grades waiting to be sent go into one CSV file for the student records system. The registrar can also export now and download any past file.
  5. Fix. A teacher can withdraw a submitted grade with a reason. If it was already sent, the next file says so, and the corrected grade goes out as a change.
The registrar's exports page: six grades waiting to be sent, listed per course with new, changed and withdrawn counts, an Export now button, and the past export files with their row counts
The registrar's page. What goes out tonight, per course, and every file sent before.

What is in the export file?

One CSV file per export, UTF-8, with a header line. Each grade is sent once. A grade withdrawn and submitted again before the next export is one change line, not two.

ColumnExample
action new, change or withdrawn
course_idnumber HIST210-2026-AUT
course_shortname HIST210
student_idnumber S240117
student_name Omar Haddad
grade 77.00
percentage 77.00 %
letter C+
submitted_by Hana Lee
submitted_at 2026-10-30T12:46:00Z (UTC)
Withdrawing a submitted grade: the submitted total, percentage, letter and date, whether it was sent, and a required reason field
Taking a grade back needs a reason. It stays in the grade's history and in the logs.
  • Locked means locked. A submitted total does not move when an activity grade changes. Withdrawing unlocks it.
  • Warnings before submit. Items not graded yet, a student without an ID number, a course without an ID number.
  • Files stay in Moodle. Every export is kept for download. A drop folder on the server is optional.
  • On the record. Every submission, approval, return, withdrawal and export is a Moodle log event, and the privacy tools export and delete it.
  • Works with Autoflow. Those events can start an Autoflow workflow, for example to email the registrar when a course is fully submitted.

How is it tested?

PHPUnit covers the gradebook lock (a late activity change does not move a submitted total), submission, approval and return, the export file and its actions, the drop folder, the page data and the privacy provider. Behat walks a teacher through submitting and withdrawing and a registrar through an export, with Moodle's accessibility checks on every page. 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 teachers submit final grades from Moodle to the registrar?

Install the plugin and open Final grades in the course menu. Tick the students whose course total is final and press Submit selected grades. The totals are locked in the gradebook and go out in the next nightly CSV export, which the registrar downloads or picks up from a folder on the server.

Does submitting lock the grade in the Moodle gradebook?

Yes. The student's course total is locked, so changing an assignment or quiz grade afterwards does not move it. Withdrawing the submission, with a reason, unlocks it and the total follows the gradebook again.

What if a student has an exam that is not graded yet?

Moodle leaves empty grades out of the course total by default, so the total can look final while an exam is unmarked. The page shows how many items are not graded for each student before you submit.

Which student records systems does it work with?

Any system that can import a CSV file: Banner, SITS, PowerSchool, Colleague, Jenzabar or your own. The file uses the student and course ID numbers from Moodle. A direct connection to one system's API is not part of the plugin; we build that per institution.

Can a head of department approve grades before they are sent?

Yes. Turn on Require approval and give the approve permission to the head of department in a course category. Grades then wait until they are approved, and a returned grade goes back to the teacher with the reason.

What happens when a grade changes after it was sent?

The teacher withdraws it with a reason and submits the new total. The next export has one line for that student with the action change. If the grade is only withdrawn, the line says withdrawn.

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 it to push grades into your records system's API, upload by SFTP, or match your registrar's file layout, we build that at a fixed price.

Need it to talk to your records system?

A push to the Banner, SITS or PowerSchool API, an SFTP upload, your registrar's exact file layout, or grade change forms with sign off. We build that on top of this plugin at a fixed price.

Get a fixed price

Backed by Ta9in.