All projects
DataFrontend

Assisted bank reconciliation

Bank statements matched to invoices automatically, each with a confidence score.

Key figures

to ship v1 and v2
15 days
lines of code
~9,400

Context

Manually matching incoming payments to issued invoices is slow and error-prone: references are incomplete and names rarely match exactly. The business needed a tool that suggests matches and leaves the final call to a person.

My role

From design to operations, fully autonomously.

Solution

Users import a bank statement and an invoice export. Processing runs server-side in a worker thread, and its progress survives a page reload.

The fuzzy matching engine combines four approaches: by reference, by amount, by approximate name, and combined. Every suggestion gets a confidence score from 0 to 100. A review editor lets users approve, reject and resolve ambiguous multi-match cases.

Key features

  • Four matching strategies

    Reference, amount, approximate name or combined matching, to cover real-world cases.

  • Confidence score from 0 to 100

    Each suggestion shows how reliable it is, so review effort goes to the doubtful cases.

  • Guided human review

    Approve, reject and resolve multi-match cases in a dedicated editor.

  • Statistics and Excel export

    Results are clear at a glance and export to Excel.

Engineering challenges

  1. 1

    Async processing in a worker thread

    Fuzzy matching (Fuse.js) runs in a Node worker thread, off the server's main thread.

  2. 2

    Progress that survives a reload

    The computation lives on the server: reloading the page loses neither the job nor its progress.

  3. 3

    Explainable scoring

    Every match carries its type and a 0 to 100 score, which makes each decision verifiable.

  4. 4

    End-to-end typed data

    TypeScript and Zod keep data in check, while SheetJS handles spreadsheet files and the Excel export.

Tech stack

Frontend
Next.js 15React 19TypeScriptTailwind 4Flowbite
Backend
Node worker_threadsFuse.jsZod
Data
SheetJS

A project of this scale?

Let's talk about your context: I'll tell you frankly what is feasible, and how long it takes.