Case study · SaaS product

EduPay

A payment management platform for tutoring centres. Founded and built end to end, now in production with 31 centres tracking 569 students.

EduPay shown on laptop and phone, alongside the first-place presentation at the University of Crete
EduPay took first place at the University of Crete, June 2026.
31 Tutoring centres
569 Students managed
1st UoC Startup Idea Pitch 2026

The problem

Tutoring centres run on cash, monthly instalments, and memory. The owner of a mid-sized centre is tracking who paid, who owes, and who needs reminding, across a few hundred students, in a spreadsheet.

I did not have to guess at this. It came from the first owner I spoke to, and he later put it in his own words: before EduPay, reconciling who still owed money was a weekend job. That is the actual product brief. Not "digitise payments", but give the owner back the hours they lose to admin every week.

The second half of the problem is the parents. Reminders were going out by hand over WhatsApp, one message at a time, which meant they went out late or not at all, which meant more money outstanding at the end of the month. And a parent who wants to check what they owe has to ask someone.

The goal

One screen where the owner sees every student's payment status, and a notification path to parents that runs without anyone remembering to trigger it. Everything else was scope to be resisted.

Two constraints shaped every decision. First, the users are not technical, so the system has to work on a phone at the front desk between classes, with no training. Second, this is financial data belonging to someone else's business, so losing it once ends the product.

What I built

  • Student database — records, classes, and payment history per student, per centre.
  • Payment status tracking — the core view: paid, pending, and overdue at a glance, updating in real time.
  • A parent view reached by QR code — months paid and outstanding, per subject, with no app to install and no account to create.
  • Automated parent notifications — payment reminders and confirmations through Firebase Cloud Messaging.
  • Announcements from the centre, surfaced on the same screen parents already check.
  • Class scheduling with timetable integration, so payments are tied to the classes a student actually attends.
  • Automated cloud backups — unattended, because no centre has an IT person.
  • Payment history reporting for end-of-month reconciliation.

Technical decisions

The three choices that mattered, and what each one cost.

Firestore over a relational database

Payment status is a live value, not a report. When the owner marks a payment at the desk, it should already be correct on the tablet in the other room, and on the parent's phone if they happen to be looking. Firestore's realtime listeners give that for free, with no polling and no socket layer to maintain — and as a one-person product, every piece of infrastructure I do not run is a piece that cannot wake me up.

Cost: no joins. Student, class, and payment data is denormalised, so writes have to keep several documents consistent, and reporting queries that a single SQL statement would answer are assembled in the client.

A QR code instead of an app

Parents are the second user, and the one you cannot train. Any solution that starts with "download this and create an account" loses most of them at step one. A QR code opens straight into their child's payment status in the browser: no install, no password, no support burden on the centre.

Cost: a link that needs no account is a link that can be forwarded. Access has to be scoped and revocable at the code level, which is work that an app with real logins would have handled for free.

Backups that nobody has to remember

The data is a business's receivables. A restore procedure that depends on the owner remembering to export a file is not a backup. A scheduled Cloud Function exports Firestore on its own timetable, server side, with no user-facing step and nothing for a centre to forget.

Cost: storage and scheduled execution add running cost per centre, which has to be priced into the product rather than absorbed. And a backup job that fails silently is worse than none, so the schedule needs watching too.

What was hard

Going from one centre to many changed the shape of the problem. A single centre is an app; 31 centres is a multi-tenant system, where the thing that matters most is that no centre can ever see another's students. That pushed the security model out of the client and into Firestore rules, where access is enforced per centre regardless of what the front end asks for.

The second lesson was that onboarding is part of the engineering. Every new centre arrives with an existing spreadsheet and a way of working that does not quite match the last one's, and the product has to absorb that difference without growing a setting for every centre.

Nothing has broken in production. I put that down less to cleverness than to keeping the surface small: the fewer things this system does, the fewer places a centre's data can end up where it should not be.

The result

EduPay is in production with 31 tutoring centres managing 569 students, and took first place at the University of Crete Startup Idea Pitch 2026.

The number I care about is not the student count, though. It is the one in the sentence below, from a centre owner who used to spend his weekends on this.

Before EduPay I tracked payments on spreadsheets and spent every weekend working out who still owed us. Now every student's payment status is on one screen and parents get notified automatically. It's given me back several hours a week I used to lose to admin.

Christos Papastylianou Tutoring centre owner · EduPay customer

Have a project in mind?

I take on client websites, web apps, and product builds across Cyprus and Greece.

Start a conversation