Wealth Management

LexPars: Multi-Tenant Investment & Fund Management Platform

LexPars  ·  2024

Unified platform covering listed securities, unlisted funds, direct assets, and bank account management in one interface

LexPars project screenshot

Background

Investment managers were managing fund positions, capital calls, and distributions across disconnected spreadsheets and legacy tools. LexPars needed a single platform covering all asset classes with strict tenant isolation, serving multiple fund managers (including Oisin Capital and Secco Capital) who each needed to trust that their positions and bank data were invisible to every other tenant on the same platform.

What We Built

A NestJS + Angular monorepo. The API handles multi-tenant data access with JWT auth and RBAC; the Angular frontend uses Kendo UI data grids for portfolio views, transaction history, and reporting. MongoDB stores fund, portfolio, and transaction data with tenant-scoped queries throughout. Key integrations:

EODHD
ISIN-to-ticker resolution and end-of-day pricing pulled on scheduled crons
Refinitiv (LSEG)
live securities pricing with token-based auth and 24-hour token expiry management
HSBC SFTP
bank transaction and position feed ingested via SFTP, CSV parsed per HSBC format
Goldman Sachs SFTP
bank transaction feed with a GS-specific CSV format processor
Stonehage Fleming SFTP
position and transaction feed
AWS SES
transactional email via nodemailer SMTP transport pointed at SES eu-west-2
AWS S3
scheduled MongoDB backups using mongodump and zstd compression

Architecture

API
NestJS, MongoDB, JWT and RBAC, multi-tenant query scoping
Frontend
Angular SPA, Kendo UI, tenant-based routing
Auth
JWT with role-based guards (admin, fund manager, read-only)
Deployment
Northflank (3-replica MongoDB cluster, NVMe storage), Docker
Jobs
scheduled per-tenant pipeline: bank feeds, bank balances, Refinitiv prices, EODHD prices

Results

Before

Fund positions, capital calls, and distributions tracked across disconnected spreadsheets

After

One platform spanning listed securities, unlisted funds, direct assets, and bank accounts

Before

Bank feeds from each institution reconciled manually, per tenant

After

Automated SFTP ingestion with a dedicated CSV processor per bank

Outcomes & Lessons Learned

  • Unified platform covering listed securities, unlisted funds, direct assets, and bank account management in one interface
  • Live securities pricing via EODHD and Refinitiv pulled on scheduled crons, keeping portfolio valuations current without manual data entry
  • Automated bank transaction ingestion via SFTP feeds from HSBC, Goldman Sachs, and Stonehage Fleming, with per-tenant bank config and dedicated CSV processors per institution
  • Full multi-tenancy with RBAC: each fund manager sees only their own data
  • Capital call and distribution tracking with audit trail per transaction
  • Monorepo with shared domain models between API and frontend, reducing type drift

The RBAC backfill was a key operational challenge: retroactively assigning roles to existing data without disrupting live users required a carefully staged migration. The monorepo's shared schema layer meant type changes in the API propagated immediately to the frontend, catching breakages at build time rather than at runtime.

FAQs

Questions, answered.

The things people ask us about this project. If yours isn't here, ask us directly, we reply like humans.

Ask us anything→

How does the platform keep portfolio valuations current?

Live securities pricing is pulled on scheduled crons from EODHD and Refinitiv, so valuations update automatically rather than relying on manual data entry from spreadsheets.

How are bank transactions imported from HSBC, Goldman Sachs, and Stonehage Fleming?

Each institution's feed arrives via SFTP and is parsed by a dedicated CSV processor built for that bank's specific format, since each bank exports data differently.

How does the platform make sure one fund manager can't see another's data?

Full multi-tenancy with role-based access control, enforced through tenant-scoped queries throughout the API, so each fund manager, including Oisin Capital and Secco Capital, only ever sees their own positions and bank data.

What was the benefit of building the API and frontend as a monorepo?

Shared domain models between the two meant a type change in the API propagated immediately to the frontend, catching breakages at build time rather than at runtime.

How is data backed up and where does it live?

Scheduled MongoDB backups using mongodump with zstd compression are stored in AWS S3, deployed on a Northflank 3-replica MongoDB cluster with NVMe storage.

Let's make things happen

Ready to craft tomorrow, today?

Where innovation meets execution, and ideas evolve into impactful solutions. Book a free consultation, no strings attached.