Context
The academy needed one system for everything: marketing its courses in English and French, enrolling students into specific runs of a course, collecting payments in the way people actually pay locally, and giving staff a dashboard to manage it all. The original React dashboard was already in use when the product needed a rebuild.
My role
Independent freelancer and main developer, working directly with the client since March 2025. I’ve built across all four parts: the API, the public site, the original dashboard, and the new Next.js app.
Architecture
- A Next.js app serves the bilingual public site and the new dashboard. The original React dashboard runs alongside it during the rebuild.
- Both frontends use the same Laravel JSON API, authenticated with Sanctum tokens. Roles and permissions decide what each staff member can do.
- The API stores data in MySQL, handles uploads and email, and publishes an .ics feed so students and staff can subscribe to their schedule in any calendar app.
Design decisions & trade-offs
- Courses run as cohorts. Each run of a course is its own record, so past enrollments and feedback keep their history when a course runs again. Trade-off: every query has to know which run it’s about, and moving to this model needed a data migration.
- Staff-reviewed transfer receipts instead of a payment gateway. Students pay by transfer and upload a receipt; staff review it. That fits how people pay locally. Trade-off: manual staff work, which needed a review queue and “needs attention” alerts so nothing waits unnoticed.
- Backward-compatible API during the rebuild. The new app is built against the same API while the old dashboard is still live, so the live dashboard never breaks. Trade-off: old response shapes can’t be cleaned up until the switch is finished.
Stack
Laravel · Sanctum · Spatie Permission · MySQL · Next.js · React · TypeScript · Tailwind CSS · next-intl · Vercel