← Blog
12 min read
Build in Public #1: Tech Stack Decisions for a Fintech Startup
September 1, 2025·
  • build in public
  • fintech
  • architecture

Build in Public #1: Tech Stack Decisions for a Fintech Startup

Honest analysis of each choice, performance benchmarks, financial context, detailed tradeoffs, and migration strategies for a fintech MVP.

You'll find honest analysis of each choice, performance benchmarks, financial context, detailed tradeoffs, and migration strategies. Nothing is set in stone, these are decisions for today that will evolve as we learn and grow.


Why These Choices? (Technical Analysis from a Fullstack Dev)

I'll be completely transparent here. I'm a dev with 4+ years of experience, but this is my first rodeo with such a big responsability at a fintech. These decisions came from a lot of trial and error, probably not the best choices but the intention is to give a start, and mainly understanding that in a startup you need to balance speed vs robustness. Let me break down the decisions(Probably gonna change somehing soon):

Runtime: Bun vs Node.js vs Deno

Why Bun?

Performance Deep Dive:

Technical Architecture:

Financial Operations Context:

Tradeoffs:

Why NOT Node.js:

Why NOT Deno:

Backend: Elysia vs Fastify vs Express

Why Elysia?

Type System Deep Dive:

Performance Architecture:

Financial API Requirements:

Tradeoffs:

Why NOT Express:

Why NOT Fastify:

Database: PostgreSQL vs MongoDB vs MySQL

Why PostgreSQL?

Financial Data Integrity:

Advanced Features for Fintech:

Performance Characteristics:

Regulatory Compliance:

-- Immutable audit trail
CREATE TABLE transactions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  amount DECIMAL(19,4) NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  -- Never allow updates to financial data
  updated_at TIMESTAMPTZ GENERATED ALWAYS AS (created_at) STORED
);

Tradeoffs:

Why NOT MongoDB:

Why NOT MySQL:

ORM: Prisma vs TypeORM vs Sequelize

Why Prisma?

Type Generation Deep Dive:

// This is fully type-safe, autocompleted
const transaction = await prisma.transaction.findUnique({
  where: { id: transactionId },
  include: {
    user: { select: { email: true } },
    splits: { include: { investor: true } }
  }
})
// transaction.user.email is typed and autocompleted
// transaction.splits[0].investor.name is typed

Query Engine Architecture:

Financial Data Patterns:

Developer Experience:

Tradeoffs:

Why NOT TypeORM:

Why NOT Sequelize:

Cache/Queue: Redis + BullMQ vs RabbitMQ vs AWS SQS

Why Redis + BullMQ?

Unified Architecture Benefits:

BullMQ Advanced Features:

// Financial job with retry logic
await paymentQueue.add('processPayment', {
  transactionId: '123',
  amount: 1000.00
}, {
  attempts: 5,
  backoff: {
    type: 'exponential',
    delay: 2000
  },
  removeOnComplete: 100, // Keep for auditing
  removeOnFail: 50
})

Performance Characteristics:

Financial Use Cases:

High Availability Setup:

Tradeoffs:

Why NOT RabbitMQ:

Why NOT AWS SQS:

Payments: Stripe Connect vs MercadoPago vs Native PIX

Why Stripe Connect?

Marketplace Architecture Deep Dive:

// Multi-party payment with automatic splits
const payment = await stripe.paymentIntents.create({
  amount: 10000, // R$100.00
  currency: 'brl',
  on_behalf_of: businessAccount.id,
  transfer_data: {
    destination: businessAccount.id,
  },
  application_fee_amount: 500, // R$5.00 platform fee
})

Compliance & Security:

Technical Integration Benefits:

Financial Operations:

Brazilian Market Considerations:

Tradeoffs:

Why NOT MercadoPago(For now):

Why NOT Native PIX(For now):

Migration Strategy:

// Gradual rollout plan
if (monthlyVolume > 25000 && user.country === 'BR') {
  // Use PIX for domestic transactions
  return processWithPIX(payment)
} else {
  // Use Stripe for international + low volume
  return processWithStripe(payment)
}

Deploy: DigitalOcean vs AWS vs Railway

Why DigitalOcean App Platform?

Startup-Optimized Architecture:

Financial Application Requirements:

Developer Experience:

Scaling Characteristics:

Tradeoffs:

Why NOT AWS:

Why NOT Railway:

Migration Strategy:


Decisions

IMPORTANT: Nothing is Set in Stone

These are decisions for today, not permanent commitments.

Every choice here comes with exit strategies and migration paths. We're optimizing for learning fast and changing direction quickly when data proves us wrong.

Current Priorities (subject to change as we grow):

  1. Velocity: Ship fast, iterate faster - because market validation trumps technical perfection
  2. Type Safety: Reduce production bugs (critical for fintech) - because money mistakes are expensive
  3. Cost Control: Runway is limited, every dollar matters - because runway determines how many pivots we can afford
  4. Team Scalability: Fast onboarding of junior/mid devs - because we can't afford senior-only hiring

These technical choices will evolve as our business model solidifies, team grows, and we get real user feedback. The goal isn't to be right—it's to be wrong quickly and cheaply.

The Build-in-Public Journey

This is just the beginning. We're building our fintech transparently, sharing our technical decisions, challenges, and learnings along the way.

What's Next

Why Share This

The Brazilian fintech ecosystem is rapidly evolving, and we believe in contributing back to the community. Whether you're building similar platforms, evaluating technology choices, or just curious about fintech development—our journey might provide useful insights.

tech


Notes

For the past few weeks, I've been reading some content from Matheus Fidelis, a Brazilian Site Reliability Engineer who's worked at some of the largest companies in the Brazilian market. His blog is an absolute goldmine for system design, infrastructure, and scalability insights.

As someone navigating the complexities of fintech infrastructure decisions, his insights on solution architecture and best practices have been incredibly helpful. If you're interested in system design, cloud architecture, or just want to learn from someone who's been in the trenches of high-scale Brazilian tech, definitely check out his blog at fidelissauro.dev.

Social Media

Building in public means building with the community. If you're interested in fintech, startup architecture decisions, or just want to follow along as we build this from zero:

Questions, feedback, or just want to chat about anything? Feel free to reach out on any platform. To be honest, there's nothing big on my social media presence, kinda lowprofile 😅.