I built this for the meditation service I run, Sakin Zihin. Registration, payments, daily practice and one-to-one meetings had become too many separate things to track. I used to spend roughly two to three hours a day on student follow-up and messaging; with the portal handling the routine, I now spend about ten minutes a day on that work. Those are my own estimates from running the service.
The portal has sent 1,502 messages. Seven students have logged 296 practice check-ins, covering both completed and skipped sessions. The 242 completed sessions add up to 4,215 minutes of meditation. These totals exclude test and demo profiles.
Students register through WhatsApp or Telegram and receive reminders, meditations and readings. I manage membership periods, meeting credits and recurring appointments synced with Google Calendar and Meet. Practice plans are versioned, so changing a student’s routine preserves the earlier history.
A changed session can leave an old reminder in the queue. I made the worker check the current plan, messaging preferences and expiry immediately before sending. A transactional outbox saves background work with the change that triggered it; conditional claims keep two workers from sending the same pending job.
Weekly and monthly reports compare practice, minutes and reflections with the previous period. I edit and approve them before sharing through a link I can expire or revoke. Students can also send voice reflections: with consent, the recording is encrypted, linked to its session and optionally transcribed. I can still listen to the original.
The admin and public sites use Next.js, with a NestJS API, PostgreSQL and background workers. Sensitive student fields and messages are encrypted; admin access uses a password and one-time authentication code. AI supports summaries and suggested replies, while I handle payments and personal support. The repository and this workflow example show the implementation and analysis approach. Dashboard images use demo data.

