A Custom LMS for a 2,000-Student Coaching Brand: Why We Skipped Moodle
A 2,000-student NEET/JEE coaching brand outgrew Moodle in 8 months. We built a custom LMS in 14 weeks — cohort engine, test scoring, parent dashboards, video DRM. The full build rationale and ₹ numbers.
Vivek Kumar
June 5, 202513 min read
0%
A Jaipur-based NEET and JEE coaching brand ran 2,000 enrolled students across 6 batches on a self-hosted Moodle instance. Eight months in, three things broke at once: the test engine couldn't handle 800 students submitting a mock at the same minute, parents had no way to see attendance or scores, and recorded lecture links kept leaking to a Telegram piracy group. The founder gave us 14 weeks and ₹18 lakh. We built a custom LMS from scratch instead of patching Moodle. Here's exactly why, and what it cost.
2,000
Enrolled Students
14 weeks
Discovery to Launch
800
Peak Concurrent Test-Takers
₹18 lakh
Total Build Cost
## What's the short answer: build or buy an LMS?
For a coaching brand under 500 students with standard needs, buy. Use Moodle, Teachmint, or Classplus and live with the constraints. Above roughly 1,500 students with custom test scoring, parent dashboards, and anti-piracy needs, a custom build pays back inside 18 months. We chose custom for this client because three requirements — concurrent timed tests, granular parent visibility, and video DRM — each broke Moodle in a way that plugins couldn't fix cleanly.
## Why this decision came up now (May 2026)
Indian coaching went online-first after 2020 and stayed there. The market is crowded with white-label platforms — Classplus, Teachmint, Graphy — that charge per-student or take a revenue cut. For a brand doing ₹6 crore a year in fees, a 2% platform cut is ₹12 lakh annually, every year. That recurring number is what tips larger brands toward owning the software. Our client had already paid ₹4 lakh in Moodle hosting and developer patches in eight months and was looking at the same again. The math stopped favouring rental.
## The 5 reasons we didn't use Moodle
We don't reach for "build custom" by default. Moodle is genuinely good — it powers universities worldwide and the plugin ecosystem is enormous. But each of these five requirements fought it.
⏱️
Concurrent Timed Tests
Moodle's quiz module locks rows hard under load. At 800 students submitting a 180-question mock in the same 60 seconds, the test brand's old instance threw gateway timeouts. Tuning helped to ~300; past that, the architecture was the wall.
👨👩👧
Parent Dashboards
Indian coaching sells to parents, not students. Moodle has no first-class parent role — you bolt it on with the "Parents" plugin and it shows the Moodle UI, which parents found impossible. We needed a separate, simple parent app.
🔒
Video DRM
Recorded lectures were being ripped and resold on Telegram. Moodle just embeds a video URL. We needed encrypted HLS with per-user watermarking and signed, expiring URLs — not a plugin Moodle ships.
📊
Cohort Analytics
The academic head wanted rank-vs-batch, topic-level weakness heatmaps, and predicted-score trends. Moodle reports are gradebook-centric. The custom analytics the brand sold to parents needed its own data model.
The honest counter-point: if you only need one of these, patch Moodle. We've done exactly that for a Kota physics tutor who needed parent visibility and nothing else — a Moodle plugin plus a thin parent view shipped in three weeks for ₹2.4 lakh. Custom only won here because all four landed at once.
## The architecture we shipped
We built on Next.js for the web app, React Native for the parent mobile app, and PostgreSQL for the core data. This is the same stack our team uses across edtech work — our in-house exam-prep product PenLeap runs a similar real-time scoring engine, so we reused hard-won patterns for question banking and rubric-anchored grading. For the deeper engineering story on that, see how PenLeap grades 12,000 essays a day.
The single most important design call: the test engine does not hit PostgreSQL on every answer. A student's in-progress attempt lives entirely in Redis. Answers are buffered and flushed to PostgreSQL in batches. Only on submit — or every 30 seconds as a safety net — does the durable write happen. That one decision is why 800 concurrent submissions don't melt the database.
## How we built it: the 14-week plan you can copy
1
Weeks 1–2: Discovery and data modelling
Map every role (student, parent, faculty, academic head, admin, accounts). Model cohorts, batches, subjects, chapters, question banks, and the attempt lifecycle. We wrote 41 user stories and 9 core tables before a line of feature code. Verify: the academic head signs off on the data model in a 90-minute walkthrough.
2
Weeks 3–5: The cohort and enrolment engine
Build batch creation, bulk student import from the brand's existing Excel sheets, fee-status linkage, and role-based access. Verify: import all 2,000 students from the old system; reconcile the count and one spot-check per batch.
3
Weeks 5–8: The test engine (the hard part)
Question bank with topic tagging, timed-attempt state in Redis, auto-submit on timeout, negative marking, and section locking. Then load-test it. We ran a synthetic 1,000-student submission storm with k6 before we trusted it. Verify: 1,000 simulated submissions in a 60-second window with zero failed writes and p95 latency under 400ms.
4
Weeks 8–10: Video DRM pipeline
Encrypted HLS through Bunny Stream, signed expiring URLs tied to the logged-in user, and a faint per-user watermark (student ID + timestamp) burned into the player overlay. A ripped video now traces back to one account. Verify: attempt to play a signed URL in an incognito session without auth — it must 403.
5
Weeks 10–12: Parent app and analytics
A deliberately simple React Native app: attendance, latest scores, rank trend, fee status, and one-tap call to the batch coordinator. Plus the cohort analytics the academic head wanted. Verify: five real parents test it; if any can't find their child's last mock score in under 15 seconds, simplify.
6
Weeks 12–14: Migration, UAT, and phased rollout
Move historical scores and recorded content. Run one batch live for a week before all six. Verify: a full mock test conducted on the new system for one batch of 340 students, with the old Moodle on standby for rollback.
Mid-build tip: we shipped the parent app two weeks before the student-facing test engine was fully load-tested. Parents seeing scores early bought us political goodwill with the founder while we did the slow, careful work on the test engine. Sequence visible wins early.
Don't custom-build if you're under 800 students or your tests aren't timed and concurrent. The whole justification here is the test engine under load plus DRM plus parent visibility, all at once. Without the concurrency problem, Moodle or Teachmint will serve you for years at a fraction of the cost. We've talked two coaching clients out of custom builds in the last year because the buy option was genuinely better for them.
Three more pitfalls we see coaching brands walk into:
Building your own video infrastructure. Don't. We used Bunny Stream for encrypted delivery rather than rolling our own. Building a video CDN with DRM from scratch is a multi-crore project on its own, and you will lose to specialists. Buy the video layer; build the LMS around it.
Over-featuring the parent app. Our first parent-app mockup had 11 screens. Parents wanted four numbers: is my child attending, how are the scores, what's the rank, are fees paid. We cut it to one screen. Engagement tripled.
Skipping the load test. The single most expensive failure mode in coaching LMS work is a mock test crashing on result day. We ran k6 against the test engine until it stopped breaking. If you build this and don't load-test, you're shipping a time bomb that detonates in front of 800 anxious students and their parents.
## The numbers that mattered
Option
Year-1 cost
Year-3 total
Ceiling hit?
Moodle (self-hosted + patches)
₹6 lakh
₹14 lakh
Yes — test concurrency, no real parent role
White-label SaaS (per-student / rev-share)
₹12 lakh
₹38 lakh
No, but recurring forever + no data ownership
Custom build (what we shipped)
₹18 lakh
₹26 lakh
No — owned, extensible, no per-student fee
By year three, custom is the cheapest option here and the brand owns the software outright. That's the curve coaching founders need to see before they decide. For a different angle on the same build-vs-buy math in enterprise software, our team wrote up why we said no to Zoho People for a 400-person manufacturer — the reasoning rhymes.
## A pre-build checklist before you commit to custom
You have more than ~1,500 active students (or a clear path there in 12 months)
Your tests are timed and taken concurrently by hundreds at once
You sell parent visibility as part of the product, not as an afterthought
Content piracy is costing you real revenue and you can quantify it
You're paying a per-student or revenue-share fee that exceeds ₹8 lakh/year
You have an in-house person who can own product decisions during the build
You've costed the buy option honestly and it still loses by year three
If you tick five or more, a custom LMS is worth a serious conversation. Fewer than five, and you should buy. Our web application development team runs this exact triage on the first call, and we'll tell you to buy if buying is right — we've done it more than once.
## The outcome
Result day on the new system: a full-batch mock for 1,950 students ran with zero downtime and results published 11 minutes after the window closed. Parent-app weekly active users hit 71% of enrolled families inside a month — Moodle's parent plugin had never crossed single digits. And the Telegram piracy group went quiet, because a ripped lecture now carried a visible watermark pointing straight back to the account that leaked it. As Hrishikesh, our CTO, put it in the retro: "We didn't beat Moodle on features. We beat it on the three things this specific brand actually needed."
We crosschecked our test-engine approach against r/edtech discussions where engineers compared concurrent-quiz architectures — the buffer-in-Redis pattern is the consensus answer for high-concurrency timed tests.
## Frequently asked questions
### How long does a custom LMS take to build?
For a coaching brand of this size, plan 12–16 weeks for a focused v1 covering enrolment, a load-tested test engine, parent dashboards, and DRM video. Adding live classes, a payment gateway, and a question-authoring tool for faculty pushes it to 20+ weeks. We ship in phases so the brand uses real features by week 10.
### Is Moodle ever the right choice for Indian coaching?
Yes, often. Under 500–800 students with standard quizzes and no anti-piracy or parent-role needs, Moodle is excellent and free. We've patched Moodle for clients where a full custom build would have been a waste of their money. The decision turns on concurrency, parent visibility, and DRM — not on Moodle being bad.
### How do you stop students from pirating recorded lectures?
Three layers: encrypted HLS streaming so the raw file is never downloadable, signed URLs that expire and are tied to the logged-in account, and a faint per-user watermark burned into the video showing the student ID. You can't make piracy impossible, but you make every leak traceable to one account, which changes behaviour fast.
### What does a custom LMS cost in India?
A focused v1 for a mid-size coaching brand typically runs ₹15–25 lakh depending on scope. The recurring cost after that is hosting and maintenance — for this client, roughly ₹2 lakh a year — with no per-student fee. Compare that against white-label platforms that charge per student or take a revenue cut every single year.
### Can parents use a custom LMS without training?
They should be able to, if you design for it. We cut the parent app to one screen showing attendance, scores, rank, and fees. The test: a parent finds their child's latest mock score in under 15 seconds with no instructions. If they can't, the design is wrong, not the parent.
### Do you handle migration from an existing platform?
Yes. We migrate student records, historical scores, and recorded content, and we run the old system in parallel for at least a week as a rollback path. For this client we kept Moodle on standby through the first live mock test on the new platform before fully cutting over.
### What stack do you build coaching LMS platforms on?
Next.js for the web app, React Native for mobile, PostgreSQL for core data, Redis for the live test-session cache, and a specialist video provider (Bunny Stream here) for encrypted delivery. It's the same foundation behind our in-house edtech product PenLeap, so the question-banking and scoring patterns are battle-tested.
Need a Custom LMS Your Students and Parents Will Actually Use?
We build coaching and edtech platforms for Indian brands — load-tested test engines, parent dashboards, and DRM video. Typical v1: 12–16 weeks, ₹15–25 lakh. Suitable if you're past ~1,500 students and your current platform is buckling. First call is with the engineer who'd lead your build, and we'll tell you to buy off-the-shelf if that's genuinely cheaper for you.