• Home
  • Work
  • Experience
  • Writing
Let's Talk
Back to all work
Case Study 01Flagship

DHRUVIX

Multi-Tenant SaaS Platform - Six Products on One Foundation

RoleProduct Designer & Architect
TeamFounder-led · Dhruv Design Studio
StatusLive
ScopePlatform strategy, multi-tenant data modeling, design system & token architecture, SaaS-readiness code audits, identity & entitlements design, Turborepo foundation
Product Screens
DHRUVIX control plane dashboard
Control plane - pipeline, subscriptions and renewals in one view
Products and plans with per-tier entitlements
Plans & entitlements - every tier resolves to modules, limits and flags
Sales pipeline kanban board
Sales pipeline - a lead here becomes a provisioned tenant downstream
AplaFund bilingual Marathi and English dashboard
AplaFund - bilingual Marathi/English UI for a village savings group
01

Executive Summary

DHRUVIX is a multi-product B2B SaaS company: one brand, one design system, one identity layer - six products plus a platform control plane, each deploying independently.

I lead it as Product Designer & Architect, owning the platform strategy, the multi-tenant data model, the design system, and the engineering direction.

The core bet: instead of rebuilding authentication, billing, role-based access, and theming separately inside every product, collapse them into one shared foundation that all products consume.

This is a systems problem before it is a screens problem.

Designer's Note
Most portfolios show screens. DHRUVIX is the project I'm proudest of precisely because the hardest work is invisible: deciding that six products should share one spine instead of six. The screens are downstream of that one call.
02

The Problem: Per-Product Rebuild Doesn’t Scale

Each vertical product - Axion (studio & agency invoicing), Aurix (jewellery retail), and the ones after them - needs the same platform plumbing: who can log in, what plan they’re on, what they’re allowed to see, and how they’re billed.

Building that per product means six auth systems, six billing integrations, six permission models, and six design languages - and six places for a security or tenant-isolation bug to hide.

  • Duplicated auth & billing inside every product
  • Inconsistent design language across the suite
  • Each product re-solving multi-tenancy from scratch
  • No single place to onboard, entitle, or bill a customer
Designer's Note
The temptation was to ship the first product fast and 'add the platform later'. I've seen where that ends - six half-built auth systems and six subtly different permission models. Building the foundation first felt slow, but it's the only version that survives the sixth product.
03

Platform Architecture

I structured DHRUVIX as three layers: a platform control plane, the tenant-facing products, and a shared foundation they all build on.

Control Plane (app.dhruvix.in)

Leads & CRM (demo → close), plans & entitlements (who gets what), auth & identity (SSO + magic link), and onboarding & billing - provision access, send credentials, charge the customer, redirect to the entitled product.

Products (per-subdomain)

Axion, Aurix, Nexora, Dwello, ShutterHQ and AplaFund - each a thin, tenant-facing app that trusts the platform for identity and entitlements rather than reimplementing them.

Shared Foundation (Turborepo monorepo)

Packages for ui (design system), auth (identity), and db (Prisma + row-level security), plus api-types, emails and config - shared across the website, the platform, and all six products.

04

Multi-Tenancy Model

Tenant isolation is a rule, not a convention. Every tenant-scoped query filters by organization_id, with Postgres row-level security as the database-level backstop - so a single forgotten filter can’t leak one customer’s data to another.

The hierarchy is Organization → Workspace/Shop → User, and plan entitlements decide which products and features each organization can reach.

  • organization_id on every tenant-scoped row
  • Row-level security as the backstop, not app logic alone
  • Entitlements gate product + feature access
  • Identity centralized - products never re-implement auth
05

The DHRUVIX Design System

One design system gives six products a coherent feel while letting each keep its own identity.

It’s a three-layer token architecture: primitives (Layer 1) → semantic tokens (Layer 2) → components. App code reads semantic tokens only, never raw hex - so a product can re-skin by swapping its accent without touching component code.

  • 3-layer token architecture (primitive → semantic → component)
  • Per-module accent over a shared neutral base (“Axion Coral” anchor)
  • shadcn components built entirely from tokens
  • No raw hex in product code - enforced by convention + lint
06

SaaS-Readiness Audits - Engineering Rigor

Before migrating two existing products (Axion on Firebase, Aurix on Postgres/Prisma) onto the platform, I audited their codebases for SaaS readiness - not as a designer reviewing screens, but reading the actual data layer, auth flow, and security rules.

I graded nine areas - multi-tenancy, identity/SSO, subscriptions, feature flags, usage limits, billing, RBAC, audit logs and admin separation - each with status, affected files, effort sizing, and a prioritised top-five fix order.

The audit surfaced production-grade risks early: world-readable/writable database rules and query-level tenant-leak paths - caught before any second customer was onboarded.

Designer's Note
Auditing the codebases myself - reading the Firestore rules and Prisma queries, not just the UI - is the part people don't expect from a designer. But you can't architect multi-tenancy you can't read. Finding a world-writable database rule before a second customer signs up is design work too.
07

AplaFund - Designing for a Village Bachat-Gat

AplaFund is the sixth product and the one that tested the platform hardest. It manages a co-operative savings group: eleven members, monthly share deposits, small loans, and a meeting where the register is read out loud.

The users are not SaaS users. They are members of a fund in a village, and the thing I was replacing was a paper register that everyone already trusted. A screen has to earn that trust back.

So the interface is bilingual end to end - Marathi and English on every label, not a translation layer bolted on. The month runs as a four-step cycle the group already recognises: payment window, tally, meeting, lock. I did not invent that sequence; I found it and stopped fighting it.

  • Bilingual by construction - no fixed-width labels anywhere
  • Amounts stay in Latin numerals; translating digits helps nobody
  • Language toggle is A/अ, not a flag - one village, not two countries
  • The month locks. An immutable record is what a register is for.
08

What I'd Fix

Three things in the shipped product are wrong, and I know why each one is there.

The plan editor exposes raw feature keys - auditLog, removeBranding, loansPerMonth - straight from the entitlements schema into the admin UI. It was fast to build and I was the only user. The moment a non-engineer prices a plan, it breaks.

The sales board has ten deals stacked in Won and nothing in Lost. A kanban column that only grows is a list wearing a board's clothes. Won should archive into Subscriptions, not sit there.

The empty states carry more design attention than the full ones. A studio with two hundred bookings has never been in front of me, so I have designed for the first day and not the thousandth.

09

Decisions & Trade-offs

Shared Foundation Over First-Product Speed

Building the foundation first is slower to the first product but compounds across all five. The sixth product becomes mostly configuration, not a rebuild.

Centralized Identity Over Convenience

Auth lives once in the shared package; products never re-implement it. One place to secure, one place to reason about.

Honest Sequencing

Ship the design system and control-plane data model first; platform identity and billing follow. I sequenced by dependency and risk, not by what demos best.

10

Where It Stands

Axion and Aurix are live products; the unified DHRUVIX platform is rolling out - design system and control-plane data model shipped, with identity and billing in progress.

Because the foundation is shared, adding the next product is closer to configuration than construction.

Impact

Measured Results

6ProductsUnified on one shared foundation
Auth · Billing · RBACBuilt OnceShared platform, not rebuilt per product
3-LayerDesign TokensPrimitive → semantic → component
9 areas × 2 appsAudit CoverageSaaS-readiness graded before migration
Ownership

Core Contributions

Platform & product strategy
Multi-tenant data modeling (org_id + RLS)
Design system & 3-layer token architecture
SaaS-readiness code audits
Identity & entitlements design
Turborepo monorepo foundation
Design-engineering direction
PreviousStreamlineNextTechVault
Back to all work
Control Plane · app.dhruvix.in
Leads & CRM
Entitlements
Auth & Identity
Billing
identity · entitlements
Axion
Aurix
Nexora
Dwello
ShutterHQ
AplaFund
built on
Shared Foundation · Turborepo monorepo
@dhruvix/ui@dhruvix/auth@dhruvix/db@dhruvix/api-types@dhruvix/emails@dhruvix/config

One control plane · six products · one shared foundation

Starter
₹499
2 users
5 modules
branded
Pro
₹1,499
8 users
6 modules
branded
Enterprise
₹3,999
Unlimited users
6 modules
no branding
resolves to
Entitlement gates · evaluated per request
modulesSidebar items appear or disappear
limitsCounters block the create action
flagsFeatures hide, or the badge stays

Pricing is a design surface · the plan decides the UI

01

Primitives

Raw values - color ramps, spacing, radii. Never used directly in product code.

coral-500neutral-900space-4radius-lg
02

Semantic Tokens

Meaning, not value - bg, surface, accent, border. The only layer components read.

--bg--surface--accent--border
03

Components

shadcn/ui built entirely from semantic tokens. Re-skin by swapping the accent.

ButtonCardTableDialog
One base · per-module accent
Axion
Aurix
Nexora
Dwello
ShutterHQ

Three-layer tokens - no raw hex in product code

AreaStatusEffort
Multi-tenancy isolationPartialL
Identity / SSOPartialM
Subscriptions & plansMissingL
Feature flagsMissingS
Usage limitsMissingM
Billing integrationMissingL
Role-based access (RBAC)PartialM
Audit logsMissingS
Admin / tenant separationPartialM
MissingPartialReady

Read the codebase, not the screens - graded before migration

1
Payment window
भरणा विंडो
→
2
Tally
पडताळणी
→
3
Meeting
मिटिंग
→
4
Lock
महिना बंद
What bilingual actually costs
  • · Every label carries two strings, so no component can be width-fixed.
  • · Devanagari sits taller than Latin, so line-height is set by the script, not the font size.
  • · Numbers stay Latin. ₹98,490 reads the same to both audiences; translating digits helps nobody.
  • · The toggle is A/अ, not a flag. This is one village, not two countries.

The members are the users. The register was the competitor.

New→
Contacted→
Demo→
Negotiating→
Won→
Onboarding→
Subscription→
Renewal
Follow-ups due

A deal going cold before it closes. Surfaced on the control-plane dashboard.

Renewals in 14 days

A tenant going cold after it closed. Same card pattern, same urgency.

Churn and a lost deal are the same failure, one period apart