On this page

Back to blog
·3 min read

Building for Speed: Our Tech Stack

Building for Speed: Our Tech Stack

How we built a financial platform that processes millions of transactions while maintaining sub-100ms response times.

By Yvan Yomba
461 words
3 min read
January 5, 2025
TechnicalInfrastructurePerformance
Share

The Goal

Financial operations need to be fast. When you're processing invoices, generating reports, or reconciling transactions, every second counts. We set an ambitious goal: sub-100ms response times for 99% of requests.

The Stack

We chose our stack based on three principles:

  1. Type Safety - Catch errors at compile time, not in production
  2. Performance - Handle millions of transactions without breaking a sweat
  3. Developer Experience - Ship features quickly without sacrificing quality

Frontend

We use Next.js 15 with React for our web application:

  • Server Components reduce bundle size and improve performance
  • TypeScript catches errors before they reach production
  • Tailwind CSS enables rapid UI development

Backend

Our API is built with Node.js and Golang:

  • Node.js for business logic and API endpoints
  • Golang for high-performance data processing
  • PostgreSQL for transactional data
  • Redis for caching and rate limiting

Performance Optimizations

Database Indexing

We use strategic indexes to keep queries fast:

-- Optimize invoice lookups
CREATE INDEX idx_invoices_customer_date
ON invoices(customer_id, created_at DESC);

-- Speed up reconciliation
CREATE INDEX idx_transactions_status_date
ON transactions(status, processed_at)
WHERE status = 'pending';

Caching Strategy

We implement multi-layer caching:

  1. Browser Cache - Static assets and API responses
  2. CDN Cache - Edge caching for global performance
  3. Application Cache - Redis for frequently accessed data
  4. Database Cache - PostgreSQL query cache

Async Processing

Heavy operations run in the background:

// Example: Process large reconciliation asynchronously
async function reconcileTransactions(accountId: string) {
  // Queue the job
  await queue.add("reconciliation", {
    accountId,
    priority: "high",
  });

  // Return immediately
  return { status: "queued" };
}

The Results

Our approach delivers:

  • 50ms average API response time
  • 99.9% uptime over the last 6 months
  • 1M+ transactions processed daily

Benchmarks

| Operation | Response Time | Throughput | | --------------------- | ------------- | ---------- | | Create Invoice | 45ms | 2000/sec | | Generate Report | 120ms | 500/sec | | Reconcile Transaction | 35ms | 5000/sec |

Monitoring and Observability

We use Datadog for comprehensive monitoring:

  • Real-time performance metrics
  • Distributed tracing for debugging
  • Custom dashboards for business metrics

Lessons Learned

What Worked

  • Progressive Enhancement - Start simple, add complexity only when needed
  • Automated Testing - Catch regressions before they hit production
  • Feature Flags - Roll out changes gradually

What Didn't

  • Premature Optimization - Focus on shipping first, optimize later
  • Over-engineering - Simple solutions often outperform complex ones

What's Next

We're working on:

  • GraphQL API for more flexible data fetching
  • Webhooks for real-time event streaming
  • Multi-region deployment for global performance

Want to build with us? We're hiring – check out oppulence.app/company for open positions.

Y

Yvan Yomba

Contributor

Contributing to Oppulence's mission of building financial infrastructure that stays in the background.

Stay Updated

Get notified when we publish new posts about financial infrastructure, developer tools, and building for scale.

No spam. Unsubscribe anytime.

Related Posts