Skip to content
Education

School Management System

One system for admissions, fee cycles, attendance, exams and parent communication — for schools that have outgrown registers and Excel.

Scroll to zoom · drag to pan · F to resize

The owner's dashboard. Each month's fee collection is one bar split paid / partial / due against the amount billed, so the current month's shortfall reads at a glance — next to the twelve-month admissions trend and a day-by-day submission curve.

Who it's for

Built for a specific kind of business

Private schools, school systems and institutes running multiple sections across one or more campuses. The point where this stops being an Excel problem is usually around 300 students, a dozen teachers, and the first month you cannot say with confidence who has paid.

Business type
Private school, school system, college or institute
Size
300 to 5,000+ active students
Campuses
1 to 50+, with shared or separate fee policies
Runs today on
Paper registers, Excel, and a WhatsApp group per class
Decision maker
Owner, principal or school administrator

The problem

What this actually costs you today

In the words operators use, not the words software vendors use.

  • Nobody can answer "who hasn't paid?" without an afternoon of work

    Fees are recorded in a register, receipts in a book, and concessions in someone's memory. Reconciling them means cross-checking three sources, so it happens monthly at best — which is exactly how three months of unpaid fees go unnoticed.

  • Attendance exists on paper and nowhere else

    Class registers are marked in the morning and then never aggregated. When a parent asks how often their child attended in October, the honest answer is that finding out would take twenty minutes of flipping pages.

  • Report cards are rebuilt by hand every term

    Marks are collected on loose sheets, typed into a spreadsheet, weighted by a formula that lives in one teacher's head, and formatted into cards the night before they go out. Every term. With arithmetic errors every term.

  • Teacher payroll inputs are recalculated from scratch each month

    Permanent staff, visiting faculty paid per period, and extra-duty allowances are all computed differently, usually by the accounts clerk, usually late at night, usually with a disagreement afterwards.

  • No visibility into which classes actually pay for themselves

    Revenue per section is knowable in principle. In practice, with teacher cost, room utilisation and concessions spread across different records, almost no school can tell you which of its sections is subsidising the others.

What it does

Grouped by who uses it

Feature lists organised by technical module tell you nothing about whether the software fits your team. These are grouped by the person who lives in them.

Admissions and student profiles

Admin

Admission through to alumni status as one record, so a student's fee history, attendance and results stay attached to them across classes and academic years.

  • Admission form with document upload and guardian details
  • Sibling linking, so family concessions apply automatically
  • Class and section transfers that preserve fee and attendance history
  • Status lifecycle — enquiry, admitted, on-hold, struck off, alumni
  • Bulk import from your existing spreadsheet at go-live

Classes, sections and timetable

Admin

The section is the unit everything else hangs off — fees, attendance, teachers, rooms and results all resolve through the class and section.

  • Recurring weekly timetables with room and teacher assignment
  • Clash detection across teacher, room and section
  • Capacity limits per section with a waiting list
  • Period cancellation, substitution and make-up class tracking
  • Term and academic-year promotion and rollover

Attendance

Teacher

Marked once, in class, on whatever device is at hand — then available everywhere without anyone re-entering it.

  • Mobile-friendly roll-call that works on a phone in under 30 seconds
  • QR code check-in, with a biometric-device hook for schools that have one
  • Late / leave / absent distinction, not just a tick
  • Automatic parent alert on absence, sent the same morning
  • Per-student, per-section and per-month attendance reports

Fees, challans, receipts and defaulters

Accountant

The part that pays for the system. Fee structures are defined once per class and then generate challans on a schedule, with the messy real-world cases handled explicitly rather than as exceptions.

  • Fee heads — tuition, admission, annual charges, exam, security, transport — billed on different cycles
  • Monthly, term and one-time schedules on the same student
  • Pro-rata calculation for mid-session admissions and withdrawals
  • Percentage and fixed concessions, scholarships, and sibling discounts
  • Partial payments, advance payments and carry-forward balances
  • Printable and WhatsApp-deliverable challans and receipts with a running ledger
  • Ageing defaulter report — 30 / 60 / 90 days — with one-tap reminders

Exams, marks and report cards

Teacher

Marks entered once by the teacher who set the paper, then computed and formatted by rules that live in the system rather than in a spreadsheet formula.

  • Exam scheduling with per-subject maximum marks and weightings
  • Grade schemes configurable per campus or per academic programme
  • Weighted aggregate across tests, assignments and term exams
  • Position and percentile within the section and across the class
  • Printable report cards, and the same data pushed to the parent portal
  • Progress trend per student across terms

Staff and payroll inputs

Owner

Teacher compensation is computed from the same attendance and timetable data the rest of the system already holds, so payroll month-end stops being a reconstruction job.

  • Fixed salary, per-period and per-student compensation models
  • Periods actually delivered, derived from attendance and substitution records
  • Staff leave, substitution and extra-duty tracking
  • Payout statement per teacher with the underlying period list
  • Export to your accounting software or payroll sheet

Parent communication

Parent

The single highest-value feature for retention, and the one that most reduces inbound calls to the school office.

  • Read-only parent portal — attendance, fees due, results
  • Automated WhatsApp and SMS for absence, fee due, fee received, result published
  • Fee reminders on a schedule you set, not manually triggered
  • Delivery status per message, so "we never got it" is checkable
  • Announcements to a section, a campus, or the whole school

Dashboards and reporting

Owner

The reports an owner or principal actually asks for, available without exporting anything.

  • Collections against target, today / this month / this term
  • Outstanding receivables with ageing
  • Section-level economics — revenue against teacher and room cost
  • Admission trend, and withdrawals by class
  • Attendance rate by section and by teacher
  • Multi-campus comparison for owners running more than one school

Screenshots

The actual interface

Every screenshot uses generated demo data. No real customer, student or member record appears anywhere on this site.

  • The admission form. Guardian details, class and section, document upload and any sibling concession are captured once, then follow the student through every class and academic year.

  • The student register. Filterable by class, section and status, with each student's fee standing on the same row — one place instead of a register per class.

  • The weekly course schedule. Periods are laid out by day and slot with the teacher and room on each block, and a clash on any of teacher, room or section is flagged as you build it.

  • The all-fees list. One row per fee record, filterable by class and status, with paid / partial / due on every line — the answer to "who hasn't paid?" without leaving the screen.

  • Recording a payment. The clerk picks the student, the outstanding challans load with their balances, and a partial amount is allocated across them — the receipt and the ledger update in the same action.

  • The monthly salary run. A teacher is paid a percentage of the fees their courses collect, so each row carries the share percent, what has been paid, and whether the month is still open.

  • A teacher's monthly statement. The payable figure is built from the fees their courses actually collected that month, itemised student by student, and exports to Excel unchanged.

  • Recording a payout. This month's payable, anything carried from earlier months and what has already been paid resolve to one remaining figure — and a payment cannot exceed it.

  • The expense register. Every outgoing is one row — date, category, payee and amount — filterable by category and date range so a month's spending reconciles against the bank without a spreadsheet.

  • The expense summary. Spending is rolled up by category for the period, so the question an owner actually asks — where did the money go this month — is answered without exporting anything.

Scroll to zoom · drag to pan · ←/→ to browse · F to resize

Roles & permissions

Who can do what

Publishing this table is unusual. It is also the fastest way to show that the system was designed for a real deployment rather than for a demo.

Roles are enforced server-side on every endpoint, not by hiding buttons in the UI.

Capabilities by role. Each row is a capability; each column is a role.
Capability Owner / Principal Whole institute Admin Academics & records Teacher Own classes Accountant Fees & cash Parent Own child
Owner / Principal: Full Admin: View Teacher: — Accountant: View Parent: —
Owner / Principal: Full Admin: Full Teacher: Own Accountant: — Parent: Own
Owner / Principal: Full Admin: Full Teacher: — Accountant: — Parent: Own
Owner / Principal: Full Admin: Full Teacher: Own Accountant: — Parent: —
Owner / Principal: Full Admin: Full Teacher: Own Accountant: — Parent: —
Owner / Principal: Full Admin: Full Teacher: Own Accountant: — Parent: Own
Owner / Principal: Full Admin: Edit Teacher: — Accountant: — Parent: —
Owner / Principal: Full Admin: — Teacher: — Accountant: Full Parent: —
Owner / Principal: Full Admin: — Teacher: — Accountant: Full Parent: —
Owner / Principal: Full Admin: — Teacher: — Accountant: — Parent: —
Owner / Principal: Full Admin: — Teacher: — Accountant: Full Parent: Own
Owner / Principal: Full Admin: — Teacher: — Accountant: Edit Parent: —
Owner / Principal: Full Admin: — Teacher: — Accountant: — Parent: —
Owner / Principal: Full Admin: Full Teacher: — Accountant: — Parent: Own
Owner / Principal: Full Admin: Edit Teacher: — Accountant: — Parent: Own
Owner / Principal: Full Admin: Edit Teacher: — Accountant: — Parent: —
Owner / Principal: View Admin: View Teacher: — Accountant: — Parent: —
Owner / Principal: Full Admin: — Teacher: — Accountant: — Parent: —
  • Full: Create, edit, remove and correct
  • Edit: Create and update, with limits noted on each capability
  • View: Read only
  • Own: Only their own records (their own classes, or their own child)
  • No access

Demo access and customisation

See it running

A demo environment with seeded data is available on request during a call. It resets nightly, and every name, phone number and fee record in it is generated — no real student data exists in any demo or screenshot.

Deploy as-is, or fit it to your process

As-is
1 to 2 weeks
Customised
4 to 8 weeks

Most schools need the fee model adjusted — that is where every school differs, and it is deliberately the most configurable part of the system. If your fee rules fit what is already built, deployment is mostly data migration and training.

FAQ

School Management — questions we get asked

  • Can it handle more than one campus?

    Yes. Campuses share one deployment, with every user scoped to the campuses they are assigned to and the owner seeing consolidated reporting across all of them. Fee structures, concessions and grading schemes can be shared or set per campus.

  • What happens to our existing student and fee data?

    It gets migrated. We import from Excel or CSV as part of go-live, including outstanding balances, so the system starts with correct opening figures rather than a clean slate you have to reconcile against.

  • Do parents need to install an app?

    No. Notifications arrive on WhatsApp or SMS, and the parent portal is a web page that logs in with a phone-number OTP. Asking parents to install and maintain an app is the fastest way to make a parent portal go unused.

  • Can we keep using our biometric attendance machine?

    Usually. Most devices either expose an SDK or can export attendance logs to a folder, and we integrate with whichever your device supports. We confirm the exact model during discovery before committing to it.

  • Does it work for a coaching centre or academy as well as a school?

    It does, with groups configured as batches rather than fixed sections. The fee, attendance, exam and communication machinery is identical; what changes is how groups are defined and how often students move between them. We would want to know which model dominates before deployment, because it sets the defaults.

  • Who owns the data?

    Your data is yours, without qualification — exportable in standard formats at any time, with no exit fee and nothing held back.

    The deployment is yours to place. Run it on your own servers, or on ours, whichever your policy requires.

Under the hood — for your IT team

Technical architecture

How it is built

An ASP.NET Core API over Microsoft SQL Server, with a React admin console and a deliberately minimal parent portal. Scheduled work — challan generation, reminders, digests — runs on a background worker rather than in request threads, because fee-cycle runs are the one job that must complete whether or not anyone has the site open.

  1. Clients

    • Admin consoleReact SPA
    • Teacher mobile webAttendance & marks
    • Parent portalServer-rendered, OTP login
  2. Application

    • ASP.NET Core APIREST + OpenAPI
    • Auth & branch scopingIdentity + global query filter
  3. Async work

    • Fee cycle runnerHangfire, idempotent
    • Notification outboxRetry + delivery receipts
    • Report builderScheduled digests
  4. Data & integrations

    • SQL ServerStudents, fees, attendance, audit
    • WhatsApp / SMSBusiness API + gateway
    • Biometric devicesSDK or CSV drop
Scheduled fee runs and parent notifications go through a persistent job queue and an outbox, so a failed run is visible and re-runnable rather than silently lost.
Stack, layer by layer
  • API ASP.NET Core (C#), REST + OpenAPI

    The team's deepest language, and a runtime that handles the scheduled and transactional work here without ceremony.

  • Database Microsoft SQL Server, EF Core

    Money and attendance are relational problems. Transactional integrity matters more than schema flexibility.

  • Admin UI React + TypeScript, Vite, TanStack Query

    Dense data grids and fast filtering, which is 80% of what a school administrator does all day.

  • Parent portal Server-rendered, minimal JS

    Parents open it on old Android phones over patchy mobile data. It must load in under two seconds on a 3G connection.

  • Background jobs Hangfire with a SQL Server store

    Persistent, retryable, and inspectable. A failed fee run must be visible and re-runnable, not silently lost.

  • Messaging WhatsApp Business API, with an SMS gateway fallback

    WhatsApp is where parents actually read messages. SMS is the fallback when a number is not on WhatsApp.

  • Auth ASP.NET Core Identity, JWT, optional OTP login for parents

    Parents will not remember a password. Phone-number OTP is the only login they reliably complete.

Data model highlights
  • Student, Guardian and a StudentGuardian join carrying the relationship and notification preference
  • Section as the central entity — a Class plus a Class Teacher, a Room, a Timetable and a FeeStructure
  • Enrollment as a dated membership of a Student in a Section, so history survives transfers and promotions
  • FeeStructure → FeeHead → ChallanLine, keeping the definition separate from the generated document
  • Challan, Payment and Allocation as three tables, so one payment can settle several challans
  • AttendanceRecord keyed on (Session, Student) with a unique constraint that makes double-marking impossible
  • Exam → ExamSubject → Mark, with the grading scheme versioned so old report cards stay reproducible
  • AuditEntry on every write to a financial or result table
Integrations
  • WhatsApp Business API for parent notifications
  • Local SMS gateways (Telenor, Jazz, and similar aggregators)
  • Biometric attendance devices over their vendor SDK or a CSV drop folder
  • Fee collection via bank challan reconciliation, JazzCash and EasyPaisa
  • CSV and Excel export for any report, because the accountant will ask for it
Deployment topology

Single-tenant by default — one database per school, deployed to a small VM or a managed container host. School systems with several campuses run as one deployment with campus-scoped row-level access. Nightly encrypted backups with a documented restore drill.

Notable engineering decisions

The trade-offs we made, and why

This is the section that separates a system somebody built from a system somebody screenshotted.

Fee cycles are a date problem, not an arithmetic problem

The naive implementation of monthly fees is a scheduled job that inserts a challan for every active student on the first of the month. It survives about two weeks of real use.

The cases that break it are all ordinary: a student is admitted on the 18th; a student leaves mid-session and wants the unused portion back; a class’s fee changes in March but the student is on a concession agreed in January; a family pays three months in advance and then one sibling is withdrawn.

What we settled on is treating the fee structure as a dated, versioned agreement between a student and a section, not as a number on the class. Challan generation reads the version that was in force for the period being billed, which means:

  • Changing a class’s fee never rewrites history. Old challans keep their old basis.
  • Pro-rata is computed from the admission date against the billing period’s day count, and the calculation is stored on the challan line, not just its result. When a parent disputes an amount, the school office can show them the working.
  • Reversals are entries, never deletions. A refunded challan is settled by a credit note that is itself auditable.

That last point matters more than it sounds. The most common request from schools that have used other software is not a feature — it is the ability to explain why a number is what it is, two months after the fact, to a parent standing at the counter.

Multi-campus isolation, without a database per campus

School systems want consolidated reporting; campuses want their own data. Running a separate database per campus gives clean isolation and makes cross-campus reporting painful. Running one shared schema with a CampusId column gives easy reporting and one bad WHERE clause away from a data leak.

We use the shared schema, but the campus filter is not left to the developer writing the query. It is applied by a global query filter at the ORM level, driven by the campus claims on the authenticated user, so a query that forgets to filter returns nothing rather than everything. Bypassing it requires an explicit, named call that only the consolidated reporting layer uses — and that call is what the audit log watches most closely.

This is the pattern we would use again at this scale. Below roughly a hundred campuses, the operational simplicity of one database is worth more than the theoretical isolation of many, provided the filter is enforced somewhere a developer cannot forget it.

Notification delivery is a reliability problem, not a messaging feature

Sending a WhatsApp message is one API call. Being able to answer “did the parent get the fee reminder?” three weeks later is a different piece of engineering.

Every outbound message is a row in an outbox table before it is an API call. A worker picks it up, sends it, and writes the provider’s message ID back. Delivery webhooks update the same row. Failures retry with backoff, and messages that exhaust their retries land in a visible queue rather than disappearing.

The result is that a school office administrator can look at a student and see that the fee reminder was delivered on the 3rd, read on the 4th, and that the absence alert on the 11th failed because the number is not registered on WhatsApp — which is actionable, and which a fire-and-forget integration cannot tell them.

The same outbox also makes the system safe to re-run. If a fee-generation job partially completes and is retried, parents do not receive duplicate reminders, because the outbox row is keyed to the challan and the period rather than to the job run.

Book a walkthrough of School Management.

We will show you the working system, tell you honestly what would need changing for your operation, and give you a range before you commit to anything.

30 minutes · We reply within one business day.

WhatsApp Book a call