AccelLearn Invoices & Receipts
A desktop app that runs a tuition centre's whole termly billing, straight from the spreadsheet they already use.
The problem
The week before term starts, there are 90 invoices to send.
Each one is typed by hand: name, lessons, fee, save as PDF, next. Then all over again for every receipt.
And when a parent asks whether they've paid, nobody knows without digging through bank transfers.
That was billing at AccelLearn, a tuition centre in Singapore, every term.
What I built
A desktop app that turns the centre's own Excel spreadsheet into a finished invoice or receipt for every student, in one click.
Edit the spreadsheet → generate invoices → send them → parent pays → mark Paid → generate the receipt → mark as sent
Features
- PDPA compliant. Student data never leaves the centre's own computer and Drive.
- Mac and Windows. One app, on any of their computers.
- Synced across devices. Everyone works off the same sheet.
- Paid or unpaid, at a glance. For every student.
- Send dates logged automatically. Nobody has to remember.
- Safe to run twice. No duplicate invoices, ever.
- Excel stays in charge. Edit the sheet, hit refresh, the app follows.
Under the hood
- Electron, Next.js, TypeScript. A Next.js and React app bundled as a standalone build inside an Electron shell, so it runs entirely on the client's machine.
- Excel as the database. ExcelJS and SheetJS read the workbook and write status back into the same cells. There is no second copy of the data to drift.
- PDFs as components. Invoices and receipts are React components rendered with react-pdf, so the layout is versioned like the rest of the code.
- Idempotent exports. A billing state model works out what each student needs next, so re-running a term is safe even after mid-term edits.
- Shipped as installers. Packaged with electron-builder for Windows and Mac, with a test suite over the roster logic.
The result
It runs the centre's billing every term, for 80 to 100 students.
It was my first paid client, and I handled all of it: the first conversation, scoping, build and handover.
- Client
- AccelLearn, tuition centre, Singapore
- My role
- Everything: consult, design, build, handover
- Built with
- Electron, Next.js, React, TypeScript, ExcelJS, react-pdf