Phase 2 — GraphQL

Multi-Tenant Client Portal

A digital marketing agency manages 20 clients. Each client needs to see their project status, deliverables, and communicate with the team. Currently everything is scattered across email, Drive, and Slack. The agency wants one portal where each client logs in and sees only their stuff.

Multi-tenancy is the architectural challenge. Client A must never see Client B's data. GraphQL makes data isolation more interesting — you enforce tenant scoping in every resolver, not just every route. Harder than the booking platform because of three distinct roles, organizational hierarchy, and the deliverable review workflow.

What to Build

Decisions You'll Make

How to enforce tenant isolation in GraphQL resolvers (middleware? wrapper function? check in every resolver?). How to design the schema so a single query can fetch a project with its deliverables, messages, and assigned staff. How to model the deliverable review workflow as mutations (submitForReview, approve, requestRevision). Whether to use GraphQL subscriptions for real-time message updates or polling.

Stack

GraphQL Apollo Server Apollo Client React Node.js MongoDB Mongoose JWT React Router useContext Custom Hooks Vitest Playwright Material UI