Context
Community organisations run on schedules, membership lists and a constant stream of announcements. Each organisation is small, but there are many of them; they operate in different languages, and none has an IT department. That combination calls for multi-tenant SaaS rather than an installation per customer.
The decisions that matter are made early and are expensive to change later: how tenants are isolated, how billing maps onto tenants, and how notifications go out without a slow provider blocking the application.
What we built
The platform covers tenant management, subscription billing, multilingual content and outbound notifications.
- Multi-tenancy — every authenticated request resolves to an organisation, and every query is scoped to it, a rule enforced in code review and by an API test suite, because that is the class of bug you cannot ship in a shared database.
- Billing — subscriptions and plan state are tied to the tenant, with the billing provider treated as the source of truth for payment state and the application reacting to it.
- Multilingual support — the interface ships in English and Romanian with localised routes, and the translation setup is ready for more languages without touching the domain code.
- Queue-driven notifications — scheduled reminders (birthdays, upcoming events) run as repeatable jobs on a Redis-backed queue and are delivered by a separate worker process, so a slow email provider degrades delivery instead of the whole app.
- Domain modules — members, roles and permissions, events with programmes and public RSVP pages, a music library with arrangements and transposition, donations and expenses, attendance and PDF reports.
Stack
Next.js/TypeScript on Postgres with Drizzle, Better Auth for accounts and roles, Stripe for subscriptions with webhooks as the source of truth for plan state, BullMQ on Redis with a dedicated worker container, and S3 or local storage for files. Nothing exotic — the difficulty in multi-tenant SaaS is discipline about isolation and background work, not the choice of framework.
Status
Private engagement. Detailed metrics and client references are available on request under NDA.