02 — Case Study
Yug.

Position Wise

All Projects

Case Study · 01 · Multi-product SaaS

Live

Position Wise

One 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.

Position Wise
PWA
Dashboard
Positions
Advisory
Watchlist
Reports
Settings
Search for companies, insights...
Position Wise Advisory
Personalised advisory across every position in your portfolio
Last 30 days ▾Download
Total Positions
12
Active Advisory
8
Success Rate
78%
Total Return
+12.4%
Performance Overview
1M3M6M1Y
30%20%10%0%
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
01

Subdomain multi-tenancy

Every advisory firm runs on its own subdomain with scoped members, plans, billing and admin, all from one deployment.

02

Live advisory desk

A live market board plus trade and invest broadcasts with P/L feedback and tier-gated tips.

03

Wise Track

A sibling finance app with a wallet-style card carousel, activity-flow analytics and privacy masking.

~112
Commits
7
Build phases
4
Product hosts
~35
Distinct screens

Deep Dive

How It Works & What I Learned

Try it · Pick a host

Same path, different product
https://acme.domain.com/
  1. 1proxy.tsx-subdomain: acmex-product: tenant
  2. 2Auth gateOrg member session
  3. 3Rewrite/ → /advisory
Resolves to

Acme Advisory

Live market board, broadcasts and plans scoped to the acme org.

01One Brand, Many Tenants

Host-aware edge proxy

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.

Reserved product hosts

track, owner and www can never become org slugs, so new products get their own hosts instead of being bolted into a tenant.

Shared login across subdomains

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.

Live market board and broadcast workspace
PWA
Dashboard
Positions
Advisory
Watchlist
Reports
Settings
Search for companies, insights...
Position Wise Advisory
Personalised advisory across every position in your portfolio
Last 30 days ▾Download
Total Positions
12
Active Advisory
8
Success Rate
78%
Total Return
+12.4%
Performance Overview
1M3M6M1Y
30%20%10%0%
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug

02The Advisory Desk

Live market board

Admin-managed symbols feed a live quote board alongside trade and invest broadcast tabs.

Broadcasts with feedback

Admins publish calls, members report P/L, and non-private calls get a public share link.

Weekly trade limits

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.

Plan picker with payment-proof upload

Step 1 · Choose a plan

Membership Plans

Basic5 trades / week
Pro15 trades / week
EliteUnlimited trades

Step 2 · Upload proof

payment-proof.jpgUploaded to Supabase Storage

Admin · Review

Pro · new memberApproveCancel
/wait-approval

03Membership That Pays

Payment-proof onboarding

Members choose a plan and upload proof of payment to Supabase Storage.

Admin approval loop

Admins review proofs in a viewer dialog and approve or cancel from one table.

Honest waiting states

/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

  • GroceriesCash · Today− ₹ 1,240
  • SalarySavings · 1 Sep+ ₹ 65,000
  • Card paymentTransfer · 28 Aug− ₹ 12,500

04Wise Track Comes Alive

Wallet-style accounts

Cash, bank and credit cards in a carousel with card networks and shared credit-limit pools.

Month-centric analytics

Day and month calendar views and a custom activity-flow chart built with Recharts.

Personal touches

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

Splitting a live app without breaking a URL

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

  • /dashboard
  • /admin
  • /app
  • One shell, one brand

After

Multi-product hosts

  • web/ — marketing site
  • advisory/ — tenant subdomains
  • track/ — Wise Track
  • owner/ — platform console

Roadmap

What's Next

  1. 01

    Budgets

    Per-category monthly budgets in Wise Track. The screen already exists as a placeholder.

Like What You See?

Let's build something great together.

Start a Conversation