01 / Project overview
A multi-tenant CRM with organization boundaries, role-based workflows, reporting, bulk import, subscription lifecycle management, APIs, and webhooks.
02 / The challenge
A SaaS CRM needs more than screens and CRUD operations. Tenant boundaries, user roles, subscription state, imports, reporting, and external events all have to remain consistent as the application grows.
03 / Solution
The platform separates frontend product flows from a structured backend API and relational data model, with organizations acting as the tenancy boundary and Stripe events driving billing state.
04 / My role
Application architecture, tenant-aware workflows, dashboard UI, API design, relational data modeling, CSV import, reports, and Stripe subscription integration.
05 / Technical approach
Next.js provides the product interface, NestJS exposes modular API domains, Prisma manages typed database access to PostgreSQL, and Stripe webhooks reconcile trials and subscription lifecycle changes.
06 / Key features
- Multi-tenant organizations
- Users and role-based access
- Operational dashboards
- Reports
- CSV import
- Stripe subscriptions
- Trial system
- Structured APIs
- Webhook architecture
07 / Technical decisions
Organization-scoped access is enforced at the service and data layers rather than trusted to the UI. Billing updates arrive through verified webhook events, while import work is validated before it changes tenant data.
08 / Result
The platform gives each organization a clear operational workspace while keeping tenant data, permissions, reporting, imports, trials, and subscription state within defined system boundaries.
