Client: MR CAPI — a financial capital management firm.
Industry: FinTech / Wealth Management.
Scope: Custom portfolio management platform, admin dashboard, client portal, mobile view.
Timeline: 4 months from kickoff to production.
Outcome: Live platform managing ₹650 Cr+ across 2,300+ accounts.
The challenge
MR CAPI's team was managing portfolios in Excel. Two problems with that:
- Portfolio data lived in 40+ sheets across multiple departments
- Clients had no visibility — every query was a manual email back-and-forth
- Compliance reporting took 3 days of manual work each month
They needed a platform that could ingest positions from multiple brokers, compute performance metrics in real time, and give both internal teams and clients a single source of truth.
What we built
1. Unified position ingestion
We connected 6 broker APIs plus 2 custodian feeds. Every position (equities, mutual funds, fixed income, AIFs) flows into a normalized ledger table within 90 seconds of execution.
2. Real-time analytics engine
Portfolio value, XIRR, TWRR, benchmark comparisons, and risk metrics — all computed on the fly. No batch jobs, no waiting until morning.
3. Role-based dashboards
- Advisors — view all clients, cohort analytics, allocation drift alerts
- Clients — personal portfolio, holdings, transactions, statements (PDF export)
- Compliance — audit trail, rebalancing history, regulatory reports
4. Automated reporting
Monthly statements, tax P&L, and regulatory reports auto-generate as PDFs. What used to take 3 days now runs in 4 minutes.
Architecture
| Layer | Technology | Why |
|---|---|---|
| Frontend | Next.js 14 (App Router) + TypeScript | Server components for fast dashboards, client components for interactivity |
| Backend | Node.js + Fastify | High-throughput APIs, minimal overhead |
| Database | PostgreSQL 16 + TimescaleDB | Time-series positions, historical queries |
| Cache | Redis | Computed metric cache, session, queue |
| Queue | BullMQ | Broker sync jobs, report generation |
| Storage | S3 + CloudFront | Statements, audit archives |
| Deployment | AWS Mumbai (ap-south-1) | Data residency + low latency for Indian users |
Real challenges we hit
Broker APIs vary wildly
Six brokers, six different schemas, six different rate limits. We built a broker adapter layer so each integration normalizes to a single internal model. Adding a new broker now takes 2–3 days, not 2 weeks.
Performance for real-time XIRR
XIRR over 5,000 transactions is expensive. We cache results per portfolio for 60 seconds and invalidate on any new transaction. First call: 320ms. Cached: 8ms.
Regulatory reporting correctness
Every calculation had to match the client's existing auditor-verified Excel model to the rupee. We spent 2 weeks building a test harness comparing our engine output against 6 months of historical statements.
FinTech lesson: Do not trust your own math. Always reconcile against an independent source before going live. We caught 4 rounding bugs and 1 timezone bug only because we did this.
Results
| Metric | Before | After |
|---|---|---|
| Portfolio data update | Manual, next-day | Within 90 seconds |
| Monthly compliance report | 3 days | 4 minutes |
| Client query response time | 24–48 hours (email) | Instant (portal) |
| Advisor onboarding of new client | ~2 hours | ~15 minutes |
| Data errors per quarter | 12–18 | 0–2 |
Stack cost at scale
Running 2,300 accounts on this platform costs ~$420/month all-in:
- AWS EC2 + RDS: $280
- S3 + CloudFront: $35
- Redis (ElastiCache): $55
- Monitoring (Sentry + Better Stack): $50
Compare that to a "wealth management SaaS" license at $4–8 per account/month — which would be $9,200–$18,400/month for the same base.
What we learned
- Reconcile against a human — audits reveal bugs that unit tests miss
- Design the adapter layer early — you'll always add more data sources
- Time-series data belongs in TimescaleDB, not flat Postgres
- Server components change SaaS dashboards — cut our initial JS payload by 62%
- PDF generation is a real product feature, not an afterthought
Key takeaways
1. Normalize broker data into one internal model — the adapter pattern pays off.
2. Cache expensive calculations (XIRR, TWRR) with short TTLs.
3. Reconcile math against an external source before launch.
4. Time-series databases (TimescaleDB) are essential for portfolio data.
5. Server-side rendering cut our frontend payload by 62%.
6. ~$420/month for 2,300+ accounts is achievable.
If you're building a financial platform — portfolio management, lending, payments, or analytics — see our custom software practice or tell us about your build. We usually reply within 6 hours.