M

Mentcape

B2B2C
live

Therapy and coaching SaaS, my step up from junior to senior.

Full-stack engineer2022 – 2026Core team, with a senior mentorAuribises TechnologiesHealth / coaching SaaS
Angular
Firebase Functions
Node.js
pdfmake
Client product. Source is private.

Overview

My first product owned end-to-end, over about four years. A platform where therapists run paid coaching programs for patients. I learned cloud functions and system design here through close design review with a senior engineer, then carried those patterns into every backend I built afterward.

I owned the admin app (50+ modules) and the document and communications backend: PDF invoices, multilingual email, calendar invites, and text-to-speech. The core payments integration was a senior teammate's, and a lot of my early growth came from his design reviews.

Engineering challenges

01Sending every document and message in two languages

Problem. The platform served German and English users, and every touchpoint had to come out right in both: invoices, session confirmations, reminders, password resets, as email and as PDF. Doing that with a copy-pasted template per language would have been a nightmare to keep in sync.

Approach. I built one PDF service for the invoices and an email system with shared layout pieces, then put the wording behind a small translation layer so a new language is mostly a data change rather than new code. Subjects, body text, and the bits in between all resolve from the same place. Calendar invites and a text-to-speech feature for lesson content went through the same backend.

Outcome. Every customer-facing document and email shipped correctly in both languages from one set of templates, instead of two copies that slowly drift apart.

02Building the backend foundation I reused everywhere after

Problem. This was my first real backend, not just CRUD. The hard part wasn't any single feature; it was setting up patterns, config, logging, structure, how triggers fire, that would survive four years of changes and that I could take to later projects, all while learning the platform as I went.

Approach. I settled on a few habits that stuck: collection names and config kept in one place instead of scattered through the code, tagged logging so I could trace a single job, a reusable PDF service, and config I could change without a deploy. None of it was designed up front. It came out of reviewing each decision with a senior engineer who kept asking why, which is how I learned to weigh trade-offs out loud.

Outcome. The same structure became the starting point for my later backends on Hero and Coupaso, so the lessons compounded instead of being thrown away.

What I'd do differently

  • The oldest part of this codebase is one very large functions file I never went back to break up. The newer code is split sensibly, and I'd give the legacy the same treatment.
  • There are no automated tests. I'd start with the document generation, since a wrong invoice is the kind of bug a user notices immediately.