
A client platform for an online Japanese - English conversation school. Three distinct user types - students, teachers and administrators - need genuinely different interfaces over the same scheduling and lesson data, and the entire product has to work equally well in Japanese and English. Neither localisation nor timezone handling is a feature here; both are structural constraints that shape the data model. In active development.
Conversation schools live and die on scheduling. Teachers set availability in their local time, students book in theirs, and a one-hour error means a missed lesson and a refund. Running that on shared calendars and messaging does not survive growth: teachers double-book, students cannot self-serve reschedules, and administrators have no reliable view of delivery. Doing it bilingually adds a requirement most scheduling tools handle poorly - every date, time and notification has to be correct in both languages and locales.
The brief, before any technology was chosen.
Described in layers, because that is how the design decisions actually separate.
One authentication system with role-based authorisation. Student, teacher and admin capabilities are distinct permission sets over shared entities rather than three separate applications.
All instants stored in UTC; every display converts to the viewer's timezone. Availability is modelled as recurring rules plus explicit exceptions, not as pre-generated slot rows, which keeps the data tractable as teachers change their patterns.
Availability, existing bookings, notice periods, student credits and cancellation policy are evaluated atomically, so two students cannot take the same slot.
Message catalogues plus locale-aware date, time and number formatting. Locale is a user property that flows through the UI and every outbound notification.
Postgres via Supabase with row-level security: a student reads only their own lessons, a teacher only their own schedule.
Reminder and confirmation messages rendered in the recipient's locale and timezone, scheduled relative to the lesson instant.
Browse teachers, book and reschedule lessons, track remaining credits and lesson history.
Manage recurring availability and exceptions, view the schedule, record lesson outcomes.
Manage users, packages and policies; view delivery, attendance and utilisation reporting.
UTC storage with per-viewer conversion so both parties see the same moment in their own time.
Full Japanese and English coverage including locale-correct dates and times.
Notice periods, cancellation windows and credit rules applied in code rather than by staff judgement.
Package purchase, consumption and expiry tracked per student.
Sent in the recipient's language and timezone ahead of each lesson.
The problems worth writing down, and how each one was handled.
Store UTC, convert at display, and store recurring availability as rules against an IANA timezone rather than fixed offsets. Japan has no DST but students do, and a rule stored as an offset breaks silently twice a year.
Availability, conflicts, notice period and credits are validated inside a single transaction with the slot locked. Checking then writing leaves a race that will eventually be hit.
Japanese date conventions, name ordering and text length all differ. Locale is threaded through formatting and layout rather than handled by swapping strings into an English-shaped UI.
Row-level security in the database so authorisation is structural. Three portals filtering in application code is three chances to leak.
Policy is encoded - notice period, remaining reschedules, credit treatment - so students self-serve within the rules instead of negotiating each case with an administrator.
Sequence matters. Each step was chosen because it de-risked the next one.
Scheduling conflicts per term
Pending measurement
Double-bookings and timezone errors recorded per academic term
Self-served reschedules
Pending measurement
Share of reschedules completed without administrator involvement
Lesson attendance rate
Pending measurement
Completed lessons as a share of booked lessons
Administrative hours per week
Pending measurement
Staff time on scheduling, baselined against the previous process
Generic booking tools handle one-to-one appointments well. They do not handle lesson credits, package expiry, bilingual notifications, reschedule policy and three-role reporting over shared data. The school had already assembled four tools to approximate it, which is usually the signal that one system is cheaper.
The scheduling core and role model transfer to any tutoring, coaching or consultation business with recurring availability and package-based billing. The localisation depth is specific to this client's bilingual requirement.
Describe the system you have in mind. We will tell you what it takes, what we would do differently, and whether we are the right team for it.