Building a Fintech Platform Solo: 185 Tables, 69 APIs, 7 Systems
Most engineers work on one service at a time. I built an entire ecosystem.
The Nexural platform started as a simple idea: a dashboard for my trading community. It became a full fintech platform with 185 database tables, 69 API endpoints, Stripe billing, an AI-powered Discord bot, a research engine, a newsletter studio, and a real-time alert system.
I designed and built all of it. Here's what I learned.
The Scope
Seven interconnected systems:
- Trading Dashboard — real-time market data, charts, portfolio tracking
- Discord AI Engine — 30+ commands, GPT-4o integration, auto-moderation
- Research Engine — 71+ metrics, strategy analysis, CSV import
- Alert System — NinjaTrader 8 integration, .NET backend, real-time notifications
- Newsletter Studio — automated content generation and distribution
- Strategy Tracker — performance monitoring across trading systems
- Automation Suite — 61 test suites, CI/CD, quality gates
Database Design at Scale
185 tables sounds intimidating. The key was phased design:
- Phase 1 (Core): Users, auth, subscriptions — 20 tables
- Phase 2 (Trading): Instruments, positions, signals — 35 tables
- Phase 3 (Community): Discord integration, moderation logs — 25 tables
- Phase 4 (Analytics): Metrics, reports, telemetry — 30 tables
- Phase 5-7: Research, alerts, newsletter — 75 tables
Each phase had its own migration, its own test suite, and its own rollback plan. I never modified more than one domain at a time.
Schema Decisions That Mattered
Normalized where it counts: User → Subscription → Plan is fully normalized. No denormalization shortcuts that would create billing bugs.
Denormalized where speed matters: Trading dashboards query denormalized views. A trader doesn't care about 3NF — they care about sub-50ms load times.
Row-level security everywhere: Supabase RLS policies on every table. A user can never see another user's data, even if the API has a bug.
API Architecture
69 endpoints following consistent patterns:
GET /api/v1/instruments — list with pagination
GET /api/v1/instruments/:id — detail
POST /api/v1/instruments — create (admin)
PATCH /api/v1/instruments/:id — update (admin)
DELETE /api/v1/instruments/:id — soft delete (admin)
Every endpoint has:
- Zod schema validation on input
- Rate limiting (per-user, per-endpoint)
- Structured error responses
- Full test coverage
Stripe Integration
Billing is where fintech gets real. I implemented:
- Subscription lifecycle (create, upgrade, downgrade, cancel)
- Webhook handling for payment events
- Dunning for failed payments
- Prorated billing on plan changes
- Invoice generation
The Stripe webhook handler alone is 400 lines of carefully tested code. Payment bugs are the kind that lose customers permanently.
What I'd Do Differently
- Start with a monorepo. I split services too early. A monorepo with shared types would have saved weeks of type synchronization.
- API versioning from day one. I added /v1/ after breaking two integrations. Should have been there from the start.
- Less custom, more conventions. I built custom auth middleware when NextAuth would have been fine for v1.
The Real Lesson
Building a platform solo teaches you something that team environments don't: every decision compounds. Good architecture decisions save you hundreds of hours later. Bad ones haunt you at 2am.
The Nexural ecosystem works because I spent more time designing than coding. The schema document was 40 pages before I wrote the first migration.
If you're building something ambitious alone, invest in architecture first. The code is the easy part.