Fees are the most politically sensitive workflow in a school. A wrong number on a parent's invoice is not just an accounting mistake — it becomes a phone call to the principal, a hallway conversation, and sometimes a withdrawal. JEduManage's fee module is built around two unglamorous virtues: every number is traceable to who set it, and every change is recorded with a reason. The result is a system the office can defend in front of anyone — a parent, an auditor, a board chair — without having to reconstruct anything from memory.
Fee structures live per (class, academic year)
Every fee structure in JEduManage is tied to exactly one class and one academic year. Class VI 2025-26 is a different structure from Class VI 2026-27 and from Class VII 2025-26. The structure carries the three components a school office actually negotiates with the management each year:
- Tuition fee — the headline annual figure for the class
- Exam fee — board exam fees, internal assessment fees, mock test fees as applicable
- Miscellaneous — lab, library, sports, activity, ID card, and any other line item the school bills uniformly to the class
Bus fee is deliberately not in this list. Transport is a separate per-tenant catalogue (see below) because students who don't use the school bus must not be billed for it, and the route fee can vary enormously between a 3 km stop and a 22 km stop. Bundling transport into the class fee structure was the single most common mistake we saw in the legacy systems schools migrated from, and JEduManage corrects it at the model level.
A class with five sections doesn't need five fee structures — the structure attaches to the class, and every section inherits it. Promotion to the next academic year creates a new structure for the same class with the updated numbers; the previous year's structure stays archived and continues to back the bills of students who were enrolled then.
Bus routes: a separate per-tenant catalogue
The Bus Routes page is the school's transport catalogue. Each route has a name, a code, a route description, an annual fee, and a list of stops. Routes belong to the tenant, not to any single class — a Class VI student and a Class XI student can ride the same route at the same fee. Transport assignment happens during admission (or later, when a family opts in) and is independent of the class fee structure. Students who walk, cycle, or arrange their own transport are simply not assigned to a route and are never billed for it.
Snapshot at assignment — the structure is a template, the bill is frozen
When a fee structure is assigned to a student, the total — tuition plus exam plus miscellaneous — is computed and written to the student's record as totalFee. That number is frozen. If the school later edits the structure (a board meeting revises miscellaneous mid-year, for example), the structure changes for future assignments but already-billed students see no change to their bills. The same rule applies to bus routes: when a student is assigned to a route, the route's current annual fee is snapshotted onto the student's record. A later route fee edit affects new assignments only.
This is the single most important design decision in the module. It means a parent who paid an invoice in May based on a published figure will never open the portal in October to discover the figure has silently moved. If the school genuinely needs to re-price an existing student — a fuel surcharge, an annual revision — that's an explicit FeeAdjustment with a reason, not a silent edit. The history is always honest.
Per-student adjustments — discounts, concessions, ad-hoc changes
Real schools rarely bill every student the strict class rate. Sibling concessions, staff-child discounts, scholarships, hardship waivers, mid-year prorations, and ad-hoc adjustments (the parent paid an excursion separately and wants it removed from the bill) all show up routinely. The FeeAdjustment model handles them as audited rows against the student's record:
- Type — discount, scholarship, waiver, concession, refund, or ad-hoc adjustment
- Amount — the rupee value, positive or negative
- Reason — free-text justification ("Sibling concession — second child of registered family"; "Hardship waiver — board-approved")
- Actor — the staff user who applied the adjustment, with timestamp
- Audit row — written immutably to the audit log alongside the adjustment record itself
The student's pending amount reflects every adjustment automatically. There is no separate "issue a corrected invoice" step — the running balance is the truth, and the parent's portal updates the next time they open it. If a principal later wants to know why a particular student is billed Rs. 18,400 instead of the published Rs. 22,000, the answer is on the adjustment history, with the reason, the actor, and the date.
Payment recording across every common method
The Payment model records each payment with the amount, the date, a method, and an optional reference number (UPI transaction ID, cheque number, DD number, card terminal reference). The supported methods are:
- Cash — the office collects and records
- UPI — usually with the upstream transaction reference attached
- Card — for schools that operate a POS at the office
- Net banking — bank transfer with reference number
- Cheque — number, bank, and date recorded
- Demand draft — DD number and issuing bank recorded
- Wallet — any digital wallet payment captured manually
Payments are written against the student's StudentFee record and the pending amount recomputes immediately. The full payment history is visible to the office and (filtered to that family) to the parent on the parent portal — payment date, amount, method, reference, and receipt download. Reconciling at month-end becomes a single export rather than a manual ledger walk.
Waivers and refunds — edge cases that always come up
Waivers and refunds are the edge cases every fee system needs to handle gracefully. A hardship waiver reduces the pending amount with a board-approved reason; a refund reverses a previously recorded payment because the cheque bounced or because a student withdrew within the refund window. Both are FeeAdjustment rows with their own type — they're not pretend-payments or pretend- fees, which means downstream reports (collected vs. billed, waiver totals for the year, refund totals for the year) come out honest without any post-processing.
The audit log captures both. A principal asked at the next board meeting "how much did we waive last year and why?" answers from the audit panel with the totals broken out by reason. There is no end-of-year tidying ritual; the data is already in shape.
SMS reminders: DLT-compliant, MSG91-backed, category-logged
Fee-due and fee-pending reminders are sent through MSG91 using DLT-compliant templates registered with the carrier. The admin builds the recipient list from the StudentFee table — filterable by class, by amount-due threshold, by overdue days — and the system shows a preview screen with the recipient count and the rendered template before anything actually leaves. Bulk-send mistakes (the wrong template, the wrong class) become hard rather than easy.
Every SMS is logged under the FEE_DUE category in the tenant's SMS log, with the recipient, the rendered message, the MSG91 request ID, and the eventual delivery outcome. When a parent calls saying they didn't receive a reminder, the office answers from the log within seconds. The same MSG91 channel powers absentee SMS (covered on the attendance management page), so the school operates one DLT setup, not several.
What the parent sees
The parent portal shows a single fee summary per child with a clean per-category breakdown:
- Tuition — annual tuition charge from the assigned class structure
- Bus — annual bus fee from the assigned route (or zero if not assigned)
- Exam — exam fee component from the structure
- Miscellaneous — lab, library, activity, and any other line items
- Total — sum of the above, frozen at the time of assignment
- Paid — running total of recorded payments
- Pending — total minus paid minus adjustments
Below the summary, the parent sees the full payment history with method, date, reference, and receipt download. Adjustments are visible with their type and date (the internal reason text is available to the office only). The result is a view the parent can answer their own questions from — which removes most of the "how much do we still owe?" phone calls the school office would otherwise field, and gives the parent the same confidence in the number that the office has. The student information system covers the rest of the student record that backs this view.
The audit log is the safety net
Every fee-related action is recorded as an immutable audit row. That includes structure assignment, route assignment, route change, FeeAdjustment creation, waiver, refund, payment recording, and SMS reminder send. Each row carries the actor, the timestamp, the affected student, the before value, and the after value. Investigations that used to take an afternoon of interviews now take a filter on the audit panel.
For schools operating under board-level scrutiny — and most schools above a certain size do — the audit log is the single biggest reason the fee module earns trust. The principal can answer "who changed this student's fee from 22,000 to 18,400 and when?" with a query, not a recollection.
How the fee module fits the rest of JEduManage
The fee module is one chapter of the larger product. The class and section the student belongs to come from the SIS; the parent identity that signs into the portal is the same one provisioned at admission; the SMS channel that delivers the reminders is the same MSG91 pipeline that delivers absentee notifications and OTP logins; the audit log that records fee adjustments is the same audit log that records role changes and student transfers. Read the features page for the per-module breakdown, or start a conversation and we'll spin up a tenant with your school's class list and a sample fee structure so you can see the parent and office views side by side, usually the same day.