elliot nah Resume
← All work

Paid client project · Shipped July 2026

AccelLearn Invoices & Receipts

A desktop app that runs a tuition centre's whole termly billing, straight from the spreadsheet they already use.

The AccelLearn app home screen: connected to the spreadsheet, with three steps to import the sheet, generate invoices, then review and approve
The app on launch: connected, students loaded, three steps to a batch of invoices.

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