Case Study · 01 · Multi-product SaaS
LiveOne codebase, three products: an advisory SaaS, a finance tracker and the console that runs them.
Position Wise is a multi-tenant Next.js and Supabase platform. Investment advisory firms each get their own subdomain with live markets, trade and invest broadcasts, subscription plans and a full admin control center. Wise Track, a sibling product on its own host, is a free personal ledger for expenses, income, transfers and credit cards. It started as a single advisory app, grew into org multi-tenancy, and was then split into separate product hosts so each product could grow independently while still sharing a single login.
Subdomain multi-tenancy
Every advisory firm runs on its own subdomain with scoped members, plans, billing and admin, all from one deployment.
Live advisory desk
A live market board plus trade and invest broadcasts with P/L feedback and tier-gated tips.
Wise Track
A sibling finance app with a wallet-style card carousel, activity-flow analytics and privacy masking.
Deep Dive
Try it · Pick a host
Same path, different productAcme Advisory
Live market board, broadcasts and plans scoped to the acme org.
01One Brand, Many Tenants
proxy.ts reads the subdomain and tags each request with x-subdomain and x-product (tenant, track or owner), then refreshes the session and enforces auth gates before a page renders.
track, owner and www can never become org slugs, so new products get their own hosts instead of being bolted into a tenant.
One Supabase user and a parent-domain auth cookie keep OAuth working as users hop between hosts, while org-scoped subscriptions mean billing never leaks between tenants.
What I Learned
Multi-tenancy is mostly a routing and identity problem before it is a data problem. Centralising access in one resolver (getCurrentUserAccess → route) made every new host and waiting state cheap to add.
02The Advisory Desk
Admin-managed symbols feed a live quote board alongside trade and invest broadcast tabs.
Admins publish calls, members report P/L, and non-private calls get a public share link.
Plan tiers cap trade usage, and admins can see it per member in the roster.
What I Learned
Power-user dashboards need hierarchy more than features. Splitting trade and invest into tabs made the board scannable.
Step 1 · Choose a plan
Membership Plans
Step 2 · Upload proof
Admin · Review
03Membership That Pays
Members choose a plan and upload proof of payment to Supabase Storage.
Admins review proofs in a viewer dialog and approve or cancel from one table.
/waiting (no org yet) and /wait-approval (paid, pending review) are deliberately separate, so users always know what is blocking them.
What I Learned
Manual payment flows are fine if every state has a clear screen. Splitting the two waiting states noticeably reduced confusion.
Try it · Wise Track
04Wise Track Comes Alive
Cash, bank and credit cards in a carousel with card networks and shared credit-limit pools.
Day and month calendar views and a custom activity-flow chart built with Recharts.
Privacy mode masks every amount, and theme presets and washes are saved per user.
What I Learned
Shipping Track as a separate product host rather than a tenant feature let it have its own shell, branding and nav without touching the advisory code.
The Hardest Part
ProblemThe app had grown from a single advisory product into several, and the code needed to move into separate web, advisory and track folders while real users kept using the same public URLs.
SolutionNext.js rewrites (mapToProduct) map every stable public path onto its new product folder, so /dashboard, /admin and /app never changed while the code moved underneath.
Before
Single advisory app
After
Multi-product hosts
Roadmap
Budgets
Per-category monthly budgets in Wise Track. The screen already exists as a placeholder.
Like What You See?