Medical Toxicology Platform
A production SaaS platform for a US-based medical toxicology company, combining a public landing page with five role-specific dashboards for content management, service delivery, and client engagement.
Overview
A production SaaS platform for a US-based medical toxicology company, combining a public landing page with five role-specific dashboards for content management, service delivery, and client engagement.
Problem
Medical Toxicology needed a production-grade multi-tenant platform to manage client relationships, deliver AI-powered toxicology services, support internal operations, and give different user types tailored experiences — all within a single cohesive system.
Solution
Built a microservices-based system where each domain (auth, core business logic, management, CMS, support) lives in its own independently deployable service. A public landing enables service discovery; five role-based dashboards surface the right data and actions to the right users.
Architecture
Microservices: Auth Service (JWT, session management), CoreLogic Service (user data, business rules), Management Service (admin operations), CMS Service (blog, case studies), Support Service (ticketing). All services consume Auth and CoreLogic via REST. Async jobs handled by Celery + Celery Beat scheduled tasks. Each service containerized and composed via Docker Compose.
Challenges
Designing an RBAC model (5 roles) that prevents cross-contamination without duplicating authorization logic across services.
Maintaining consistent auth state across independent microservices without a shared database.
Managing Celery Beat periodic task lifecycle in a containerized, multi-service deployment.
Outcomes
Production SaaS platform serving real medical clients with measurable uptime and reliability.
Independent service deployability — teams can ship changes to CMS or Support without touching Auth or CoreLogic.
Enabled rapid launch of new service offerings by composing existing microservice primitives.
Lessons Learned
Microservice boundaries must align with business capabilities, not technical layers.
Auth is a cross-cutting concern that justifies its own service from day one.
Celery Beat in Docker Compose requires explicit singleton patterns to avoid duplicate task firing.