
School Management: Students, Classes & Tuition
School management: classes generated from a weekly pattern, a register that closes itself, fees charged pro rata, make-up lessons and marks.
Available for Odoo 16.0, Odoo 17.0, Odoo 18.0, Odoo 19.0. Technical name bambooforge_school.
School Management: Students, Classes & Tuition
For a tuition centre or a small school on Odoo Community. Written around the two things every school argues about: who was in the room, and who owes what.
Overview
The student is in the class; somebody else pays for it. The invoice goes to the payer chosen on the enrolment - a guardian, a sponsoring company, or an adult student paying for themselves - and each line carries the child's name, so a family with three children can read one invoice and tell which lessons belong to whom.
Classes are generated from a weekly pattern. Tuesday and Thursday at 18:00 across a term becomes twenty-four real lessons. Regenerating in week six never touches a lesson that has already happened, nor one somebody moved by hand.
A mid-term joiner pays for the lessons that are left, counted off the real timetable rather than a fraction somebody guessed. The same number refunds a withdrawal, as a credit note against the posted invoice.
The register closes itself. One row per student per lesson, and a lesson that is over is closed the next morning - so the absence list is true without depending on a teacher remembering a button. A register cannot be signed in advance.
An excused absence earns the lesson back, a plain one does not, and the balance follows the correction a parent phones in the next morning. Spending a make-up lesson is an action somebody takes, never a number that quietly drifts.
Marks that add up. Assessment weights are held to a hundred percent, and the final mark is computed on what has actually been marked - a student with 80% in the only test that has happened has 80%, not 8%.
Requirements
Odoo 18.0, Community or Enterprise. Standard apps: Invoicing (account) and Products (product). No Enterprise module is needed. Full source, OPL-1.
Getting started
Programmes and terms. A programme is what you teach; a term is when. Both live under School → Configuration.
Classrooms carry a real capacity. A class cannot outgrow its room, and no room or teacher is ever double-booked - including when a cover teacher is put on a single lesson.
Create a class, give it a weekly slot pattern, and generate the term. The timetable fills with real lessons you can move, cancel or cover one at a time.
Enrol students. Choose the payer on the enrolment. Invoice from the enrolment and the tuition is raised for the lessons that remain.
Usage
The timetable
School → Timetable is the working view. A lesson can be moved, given a cover teacher, or cancelled. A cancelled lesson is owed back to whoever paid for it; a moved lesson keeps everything attached to it. Neither is a delete, so the history a parent may ask about survives.
The register
Open a lesson and mark the room. Present, absent, or excused. The lesson closes itself the morning after it ends, which is what makes the absence report trustworthy: nothing is missing because a teacher forgot.
Make-up lessons
An excused absence credits a make-up. The credit is spent explicitly, against a specific lesson, and the ledger shows both halves - earned and spent - so a dispute is settled by reading rather than by remembering.
Fees
Tuition is charged pro rata from the real timetable. A student who joins in week six pays for the lessons still to come. A withdrawal credits the same figure against the posted invoice.
Marks
Assessments carry weights that must total a hundred percent. Marks are the teacher's working notes until they are published; after that only a manager can change one, because a parent has already seen it.
Data, privacy and limits
A teacher never sees a fee, and nobody outside the office sees a child's details. That is an access rule on the models and on every one of the fields - date of birth, admission number, guardian list, care note - not a hidden notebook page. A notebook page hides a tab; it does not stop Contacts, select all, Export.
This is a tuition and timetable system, not a full student information system: there is no transport, no boarding, no state reporting export.
Marks are recorded and weighted; the module does not print certificates or transcripts.
Everything runs inside your Odoo. No external service is called and no data leaves the database.
Troubleshooting
Regenerating a term did not create the lessons I expected. Generation never touches a lesson that has already happened or one that was moved by hand. Those are left exactly as they are, on purpose.
A student's invoice looks short. Pro rata counts the lessons that remain on the real timetable at the moment of invoicing, not a fraction of the term.
A teacher cannot see the fee fields. That is the access rule working. Fees are visible to the office roles only.
Support
Every request answered within 24 hours, setup help included, by the people who wrote the code: support@bambooforge.dev
Uninstallation
What is removed
The school models and their records: programmes, terms, classes, sessions, enrolments, attendance, make-ups, assessments and marks.
What is preserved
Everything standard. Contacts, the invoices raised and their payments stay exactly where they are, because they are ordinary Odoo records.
Changelog
18.0.1.0.0
First release: classes generated from a weekly pattern, a register that closes itself, fees charged pro rata, make-up lessons and marks that add up.
Screens


