Skip to content
Education Built by us

Coaching Center Management System

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

Owner dashboard — collections against target, attendance by batch, and the defaulter queue, all as of this morning.

Who it's for

Built for a specific kind of business

Tuition academies, test-prep centres and subject institutes running multiple batches across one or more branches. The point where this stops being an Excel problem is usually around 150 students, three teachers, and the first month you cannot say with confidence who has paid.

Business type
Tuition academy, test-prep centre, subject institute
Size
100–2,000 active students
Branches
1–8, with shared or separate fee policies
Runs today on
Paper registers, Excel, and a WhatsApp group per batch
Decision maker
Owner or centre 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 discounts 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

    Registers are marked in class 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.

  • Result 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 payouts are recalculated from scratch each month

    Per-session, per-student, and fixed-salary teachers all get computed differently, usually by the owner, usually late at night, usually with a disagreement afterwards.

  • No visibility into which batches actually make money

    Revenue per batch is knowable in principle. In practice, with teacher cost, room utilisation and discounts spread across different records, almost no centre can tell you which of its batches 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.

Student enrollment and profiles

Admin

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

  • Admission form with document upload and guardian details
  • Sibling linking, so family discounts apply automatically
  • Batch transfers that preserve fee and attendance history
  • Status lifecycle — enquiry, enrolled, on-hold, dropped, alumni
  • Bulk import from your existing spreadsheet at go-live

Batch and timetable scheduling

Admin

Batches are the unit everything else hangs off — fees, attendance, teachers, rooms and results all resolve through the batch.

  • Recurring weekly timetables with room and teacher assignment
  • Clash detection across teacher, room and batch
  • Capacity limits with a waitlist
  • Session cancellation and make-up class tracking
  • Term and academic-year 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 centres that have one
  • Late / excused / absent distinction, not just a tick
  • Automatic parent alert on absence, sent the same morning
  • Per-student, per-batch and per-month attendance reports

Fees, invoices, receipts and defaulters

Accountant

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

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

Exams, marks and result 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 branch or per programme
  • Weighted aggregate across tests, assignments and finals
  • Rank and percentile within batch
  • Printable result cards, and the same data pushed to the parent portal
  • Progress trend per student across terms

Teachers and payroll inputs

Owner

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

  • Fixed salary, per-session and per-student compensation models
  • Sessions actually delivered, derived from attendance records
  • Leave and substitution tracking
  • Payout statement per teacher with the underlying session 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 front desk.

  • 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 batch, a branch, or everyone

Dashboards and reporting

Owner

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

  • Collections against target, today / this month / this term
  • Outstanding receivables with ageing
  • Batch profitability — revenue against teacher and room cost
  • Enrollment trend, and drop-off by batch
  • Attendance rate by batch and by teacher
  • Multi-branch comparison for owners running more than one centre

Screenshots

The actual interface

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

  • A student ledger with a partial payment and a carried-forward balance. Every line is traceable to a receipt — this is the screen that ends the "but I paid last month" conversation.

  • Roll call as a teacher sees it on a phone. Three states rather than a tick, because "late" and "absent" have different consequences for the parent alert.

  • Ageing defaulter report. The 90-day bucket is the one that matters — those are the students who have usually already stopped attending.

  • A generated result card. The weighting rules that produce the aggregate are configuration, not a spreadsheet formula, so they are identical for every student in the batch.

  • Batch profitability. Most centres discover at least one batch running at a loss the first time they see this view.

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. In multi-branch deployments every role is additionally scoped to the branches the user is assigned to.

Capabilities by role. Each row is a capability; each column is a role.
Capability Owner All branches Admin Assigned branch Teacher Own batches Accountant Assigned branch Parent Own children
Student records Owner: Full Admin: Full Teacher: View Accountant: View Parent: Own
Enrollment and batch transfer Owner: Full Admin: Full Teacher: Accountant: Parent:
Timetable and batch setup Owner: Full Admin: Edit Teacher: View Accountant: Parent: View
Mark attendance Owner: Full Admin: Edit Teacher: Own Accountant: Parent:
Fee structure and discounts Owner: Full Admin: View Teacher: Accountant: Edit Parent:
Record payments and issue receipts Owner: Full Admin: Edit Teacher: Accountant: Full Parent:
Waive or write off a balance Owner: Approve Admin: Teacher: Accountant: Parent:
Enter exam marks Owner: Full Admin: Edit Teacher: Own Accountant: Parent:
Publish results Owner: Full Admin: Approve Teacher: Accountant: Parent:
Teacher payout statements Owner: Full Admin: Teacher: Own Accountant: View Parent:
Financial reports Owner: Full Admin: View Teacher: Accountant: Full Parent:
Send bulk announcements Owner: Full Admin: Edit Teacher: Accountant: Parent:
User and role management Owner: Full Admin: Teacher: Accountant: Parent:
Audit log Owner: View Admin: Teacher: Accountant: Parent:
  • Full Full access
  • Edit Create and edit
  • View View only
  • Own Own records only
  • Approve Requires approval
  • No access
  • Enforced server-side, not by hiding UI

Technical architecture

How it is built

Skip this section if you are not technical — nothing later depends on it.

An ASP.NET Core API over PostgreSQL, with a React admin console and a deliberately minimal parent portal. Scheduled work — invoice 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

    • PostgreSQLStudents, 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 8 (C#), REST + OpenAPI

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

  • Database PostgreSQL 16, EF Core

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

  • Admin UI React 19 + TypeScript, Vite, TanStack Query

    Dense data grids and fast filtering, which is 80% of what an 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 PostgreSQL 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
  • Batch as the central entity — a Programme plus a Teacher, a Room, a Timetable and a FeeStructure
  • Enrollment as a dated membership of a Student in a Batch, so history survives transfers
  • FeeStructure → FeeHead → InvoiceLine, keeping the definition separate from the generated document
  • Invoice, Payment and Allocation as three tables, so one payment can settle several invoices
  • AttendanceRecord keyed on (Session, Student) with a unique constraint that makes double-marking impossible
  • Exam → ExamSubject → Mark, with the grading scheme versioned so old result 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
  • Payment collection via bank transfer 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 centre, deployed to a small VM or a managed container host. Multi-branch chains run as one deployment with branch-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 an invoice 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 joins on the 18th; a student leaves mid-cycle and wants the unused portion back; a batch’s fee changes in March but the student is on a discount agreed in January; a family pays three months in advance and then one sibling drops out.

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

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

That last point matters more than it sounds. The most common request from centres 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-branch isolation, without a database per branch

Chains want consolidated reporting; branches want their own data. Running a separate database per branch gives clean isolation and makes cross-branch reporting painful. Running one shared schema with a BranchId column gives easy reporting and one bad WHERE clause away from a data leak.

We use the shared schema, but the branch 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 branch 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 branches, 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 front-desk 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 invoice and the period rather than to the job run.

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
3–4 weeks
Customised
8–12 weeks

Most centres need the fee model adjusted — that is where every academy 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

Coaching Center — questions we get asked

  • Can it handle more than one branch?

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

  • 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.

  • Who owns the code?

    You do. Full source, in your repository, with deployment documentation. There is no licence that expires and no vendor lock-in on the data.

Book a walkthrough of Coaching Center.

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