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
Async processing in a worker thread
Fuzzy matching (Fuse.js) runs in a Node worker thread, off the server's main thread.
- 2
Progress that survives a reload
The computation lives on the server: reloading the page loses neither the job nor its progress.
- 3
Explainable scoring
Every match carries its type and a 0 to 100 score, which makes each decision verifiable.
- 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.