All projects
2024.11Finance & PublicNew Build

Fintech Settlement System

Reconciles payment processor and bank data so daily settlement closes automatically.

WebServer & Infra
Fintech Settlement System
Screen reconstructed from delivered work. Contains no client data.
Timeline
About 6 months
Team size
5 people
Platforms
Web · Server
Integrated systems
Payment processor and bank data

Background

Staff reconciled transaction records from payment processors against bank deposit records by hand in spreadsheets, every day. As transaction volume grew, reconciliation started taking more than a day, and delayed closings began affecting the next settlement cycle.

Scope

  • Data collection from payment processors and banks
  • Automated transaction reconciliation
  • Exception-handling screen for mismatched transactions
  • Daily settlement closing process
  • Settlement result report generation
  • Settlement history lookup

Technical decisions

What we chose, and why it fit

Did not auto-finalize reconciliation results; only exception cases required staff confirmation before closing

Since settlement involves real money, letting the system finalize automatically would delay catching errors. We split the flow so that transactions matching the rules were processed automatically, while anything outside the rules required a human to confirm and approve before closing.

Stored settlement history in PostgreSQL as immutable records

Settlement data needs to allow tracing back why an amount was what it was, for audit purposes. Closed settlement entries were never edited; corrections were added as new entries instead, so the previous state was never erased.

Engineering challenges

Problem

Each payment processor used a different file format and field naming, so a single reconciliation logic couldn't handle all of them.

Approach

We added an adapter layer that converted each processor's file into a common transaction model, and kept the reconciliation logic looking only at that common model.

Result

Adding a new payment processor now just means attaching a new adapter, with no need to touch the reconciliation logic itself.

Problem

Bank deposits sometimes slipped to the next business day, leaving some transactions each day where the settlement date and actual deposit date didn't match.

Approach

We added a pending-reconciliation state for settlement entries, and if a deposit remained unconfirmed past a set period, it was surfaced separately on staff's screen.

Result

Transactions with delayed settlement dates were tracked continuously instead of falling through the cracks, so nothing that still needed checking after closing got missed.

Handover and operations

We delivered an operations manual for settlement staff along with a document defining exception-handling criteria. We handed over the source code and infrastructure configuration, and agreed that integrating additional payment processors would fall under a separate maintenance scope.

Stack

.NET 8AzurePostgreSQL