Skip to content
Industry · School management module

A school management system that follows your fee rules and your timetable

Schools rarely fit the software. There's the sibling discount the bursar applies by hand, the bus fee that only some families pay, and the attendance rule the principal wants enforced but no teacher has time to check. A school management system on the Frappe Education app or Odoo can carry those rules for you. Describe how your school runs and erpfly writes the module.

ERPNext v16

Works with ERPNext v15 and v16, and Odoo 17, 18 and 19.

Features

What your school management module can do

Admissions that end in an enrolment

Applicants move through enquiry, assessment and offer, and an accepted applicant becomes a Student with a Program Enrollment without anybody rekeying names.

Family-aware fees

Sibling discounts, staff child rates and scholarships apply from rules tied to the guardian, so the bursar stops keeping a list in a notebook.

Attendance that tells someone

Streaks of absence alert guardians and the class teacher. The rule is a few lines of Python you can read and change.

Transport as its own thing

Bus routes, stops and per-route fees, with a list per route for the driver and for the front office on a rainy morning.

Report cards from real assessments

Assessment results roll into grades by your grading scale, then into a report card Print Format that looks like the one parents already know.

The output

What actually gets generated

Real files in a real repository. Here’s the typical output when someone asks for school management.

ERPNext / Frappe app

  • Sibling discount rule applied when fees are generated
  • Custom fields on Student and Guardian
  • Absence alert hook on Student Attendance (doc_events)
  • Transport Route DocType with stops and route fee
  • Report card Print Format per grading scale

Odoo addon

  • Student and enrolment models, or _inherit on op.student if you run OpenEduCat
  • Fee plans that create account.move invoices per family
  • Attendance model with a mail.template guardian alert
  • Portal record rules so guardians see only their own children
  • Timetable calendar and list views
school_rules/attendance/alerts.py
import frappe
from frappe.utils import add_days, getdate

STREAK = 3

def alert_guardians_on_absence(doc, method=None):
    """Student Attendance.on_submit. Assumes one attendance mark per student per day."""
    if doc.status != "Absent":
        return
    recent = frappe.get_all(
        "Student Attendance",
        filters={"student": doc.student, "docstatus": 1, "date": ["<=", doc.date]},
        order_by="date desc",
        limit=STREAK,
        pluck="status",
    )
    if len(recent) < STREAK or any(status != "Absent" for status in recent):
        return

    student = frappe.get_doc("Student", doc.student)
    # last_absence_alert is a custom Date field on Student
    if student.last_absence_alert and getdate(student.last_absence_alert) > add_days(doc.date, -7):
        return

    emails = [frappe.db.get_value("Guardian", g.guardian, "email_address") for g in student.guardians]
    emails = [e for e in emails if e]
    if emails:
        frappe.sendmail(
            recipients=emails,
            subject=f"{student.student_name} has been absent {STREAK} school days",
            template="absence_streak",
            args={"student_name": student.student_name, "date": doc.date},
        )
    frappe.db.set_value("Student", student.name, "last_absence_alert", doc.date)
Trimmed excerpt. The full module includes tests, fixtures and a README.

How it works

From a paragraph to a pull request

The long version
  1. 01

    Describe it

    In your own words. Paste the spreadsheet or a photo of the paper form if that's easier.

  2. 02

    Answer a couple of questions

    It asks only what it can't work out from your setup, like who's allowed to override.

  3. 03

    Try it on a sandbox

    A copy of your site with the module installed. Break it, then ask for changes.

  4. 04

    Merge when it's right

    Code lands as a pull request with tests. Your developer, or ours, reviews it first.

Why a school management system goes wrong

Most school software is bought for the brochure features. Online admissions, a parent portal, a timetable screen. Then term starts and the office discovers it can’t express the rules that actually govern money and attendance at that particular school.

So the exceptions get handled on paper. The sibling discount is a manual credit note. Absence follow-up depends on which teacher remembers. Within a year the school management system is a very expensive student list.

The fix is to put those local rules in code, where they run the same way every time.

What Frappe Education and Odoo actually give you

The Frappe Education app is the natural base on the ERPNext side. It has Student Applicant, Student, Guardian, Program, Course, Program Enrollment, Student Group, Course Schedule, Student Attendance, Assessment Plan and Assessment Result. Fees run through Fee Structure and Fee Schedule, and how invoices are created depends on your Education version. It’s open source and has been around a long time.

Odoo is a different story. There’s no official school management app from Odoo. OpenEduCat is a third-party product built on Odoo, with its own models such as op.student and op.course. If you already run it, we extend it. If you don’t, we’d usually generate a smaller addon on top of contacts, invoicing and the portal rather than adopt a whole third-party suite for a few features.

Either way, the rules specific to your school live in your own app or addon, and that’s what erpfly writes. On the Frappe side that means doc_events in hooks.py, custom fields shipped as fixtures, and Print Formats kept in version control. On Odoo it’s models, views and record rules in an addon with a proper manifest.

That separation matters more for schools than for most businesses. You’ll be on the same system for years, the Education app and Odoo will both release new versions in that time, and the IT person who set it up will probably move on. A module that keeps your rules apart from the platform is one the next person can pick up without guessing.

Worked example: sibling discounts and absence alerts

Take a K-12 school with about 640 students and a term fee of $1,200.

A family has three children enrolled. The rule is 10% off for the second child and 15% off for the third. When the Fee Schedule runs for the term, the eldest is billed $1,200, the second $1,080 and the third $1,020. That’s $3,300 for the family, generated on the right invoices without the bursar adding credit notes. Two of the children take bus route B at $180 a term each, so the family’s term total comes to $3,660.

Attendance is marked each morning. One of the children is absent on Monday, Tuesday and Wednesday. When Wednesday’s attendance is submitted, the hook in the snippet sees three absences in a row and emails both guardians. It records the date so a Thursday absence doesn’t send a second email. Weekends don’t break the streak, because the check looks at the last three marks, not the last three calendar days.

The class teacher still makes the phone call. The system just makes sure somebody knows.

What we’d leave out

Some requests come up every time, and we’ll usually argue against them.

A learning platform inside the ERP. Course content, quizzes and video lessons belong in a dedicated LMS. Link it to student records and keep the ERP for enrolment, fees and attendance.

An automatic timetable generator. Scheduling teachers, rooms and subjects under real constraints is a hard optimisation problem. Most schools are better served by a proper timetabling tool whose output gets imported, or by a well-designed manual timetable screen.

A report card with forty layout revisions. Agree the design with the principal on paper first. Then we build the Print Format once.

Connecting the school office to the rest

Teacher and staff salaries run through HR and payroll, and staff attendance can share logic with the attendance management module. Fee invoices, reminders and receipts sit in invoice management.

For a wider look at colleges, training centres and schools, see our page on education. If you’re deciding whether to build on an existing platform at all, Odoo vs a custom ERP walks through that choice.

Guides and terms for school management

School management module questions

Something missing? Email hello@erpfly.com and a person will answer.

Is the Education app still part of ERPNext?

Not since version 14. Education is now a separate Frappe app that you install alongside ERPNext. erpfly generates your school rules as another app on top of it, so you can update Education without losing them.

Does Odoo have an official school module?

No. Odoo doesn't ship a school management app. OpenEduCat is the best known third-party option built on Odoo, and we can extend it if you already use it. Otherwise we generate a leaner addon around students, guardians, fees and attendance.

Can parents use it on their phones?

The Frappe and Odoo portals both work in a mobile browser, so guardians can see fees, attendance and report cards. Push notifications and an app store listing mean a separate mobile app project, and many schools find email and SMS alerts cover what parents actually want.

How do we handle student data privacy?

Access is set per role in the generated code. Teachers see their own classes, guardians see only their own children, and fee details stay with the bursar's office. You still need to check the setup against your local data protection rules, and we'd encourage a review by whoever handles that at your school.

Can we migrate from our current school software?

Usually. Students, guardians, classes and outstanding fee balances come across through an import script. Old attendance and marks can come too, though some schools import only the current and previous year and keep the rest as archived reports.

How long before we can use it for a new term?

The first version generates in minutes. Give yourself a few weeks before term starts to load students, test fee runs against last term's real invoices, and let the office staff try it. Going live on the first day of term with untested fees is how bursars lose their weekends.

Your next module is one paragraph away

Write it the way you’d explain it to a new hire. We’ll turn it into an app you can read, test and install.

ERPNext v16

Create your account

Free to start. No card needed.

By signing up you agree to our terms and privacy policy.