Result: one live system in daily use. Families register and check in from their phones, the registrar works from one ledger, and seat counts, payments, and attendance all come from the same records. There are no longer separate spreadsheets to keep in agreement.
The Problem
Registration ran on a spreadsheet tracker and an outside form service. The form couldn't see live seat counts, so families kept choosing classes that were already full, and someone had to sort it out by hand afterward.
The spreadsheet was the bigger risk. Over one season it silently lost payment checkmarks seven times. Once, a whole batch of payment records disappeared and nobody noticed for three weeks. Getting them back meant digging through months of daily backups and thousands of change-log entries. After a failure like that, a small team stops trusting its own records.
What We Built
One web app with a separate area for each group of people. Leadership gets a dashboard for families, classes, money, tasks, scheduling, printing, and meetings. The registrar gets a registration ledger for review and approval. Parents and teachers share one portal: parents see their schedule, documents, and check-in, and teachers see rosters, class details, and attendance. The forms on the public website feed straight into it.
There are no passwords anywhere. Parents and teachers sign in with an emailed link or a six-digit code. Leadership sign-in sits behind a separate access layer, with an extra check before sensitive actions.
Registration and Seats
Registration runs in clear steps. A family applies, then gets a one-time link to read and sign the family guidelines in the portal. Each signature is tied to the exact version of the policy text that was signed. Once approved, they register each child for classes.
A submission holds the family's seats against live capacity right away. The capacity check and the hold happen in one step, so two families can't both get the last seat. Whoever comes second is offered the waitlist. The registrar records payment, and a registration can't be approved while payment is still outstanding.
Check-In Day
On class day, parents check their children in from their own phones, and teachers mark attendance with a tap. A tablet at the door can also be set up as a check-in station.
Printed badges come from the same records, sorted by role. Student badges carry allergy and emergency contact details on the back, so that information stays with the child instead of in a binder.
The Engineering
It runs on Cloudflare with a real database (more than a hundred tables), file storage, and scheduled jobs. Every night it backs up the data, checks the money and backup records for anything that doesn't add up, scans for duplicates, applies data-retention rules, and sends an email summary of anything that needs a look. Every run is logged, and an outside monitor raises an alert if the nightly run doesn't report in.
Every change leaves an audit record of who did what, and most actions can be undone. The code has more than 1,800 automated tests, and every change goes through a staging copy before it goes live. The move off the old tools happened in stages, and the system still writes a nightly backup copy to a spreadsheet as a safety net.
Why It Transfers
The app was shaped around how this organization runs, but none of the hard parts are specific to education: one source of truth, capacity limits that can't be oversold, sign-in without passwords, audit logs, nightly checks, and check-in from a phone.
Any business running on spreadsheets and forms that don't talk to each other has the same problem. We build around how you work, and the parts that are already proven carry over, so you aren't starting from zero.