Payment Reconciliation Tool — Match Bank Statements to Invoices

Drop your bank statement CSV and accounts receivable CSV to auto-match payments to outstanding invoices. Fuzzy name matching handles typos and abbreviations. Download the reconciled result. All processing happens in your browser — no data is ever uploaded.

Step 1 — Upload your two CSV files

Bank Statement

🏦
Drop CSV or click to browse

Invoice / AR Ledger

🧾
Drop CSV or click to browse
🔒 All data is processed entirely in this browser tab. Nothing is sent to any server.

How it works

1. Parse both CSVs PapaParse reads your files in-browser, auto-detecting delimiters and quoted fields. You pick which column is date, amount, and name.
2. Fuzzy name matching Each bank payment name is compared to every invoice customer name using Levenshtein edit-distance, normalized to a 0–1 similarity score.
3. Amount-weighted scoring Name similarity (60%) and amount proximity (40%) are combined. An exact amount match boosts the score significantly — a £1,000 payment finds a £1,000 invoice even with a slightly different name.
4. One-click confirm / exclude Suggested matches are shown ranked by score. You confirm good matches or exclude false positives. Your decisions write a reconciled_status flag column in the output CSV.

The scoring formula is: score = 0.6 × nameSim + 0.4 × amountSim. Amount similarity uses a tolerance band: within 1% of invoice value → 1.0, falling off linearly to 0 at 50%+ difference.

Frequently asked questions

What CSV format does my bank statement need to be in?
Any standard CSV export from your bank works — most banks let you export transactions as CSV from the online portal or your accounting software. Your file needs at least three columns: a date, a credit/payment amount, and a payer name or reference. Common exports from Barclays, HSBC, Lloyds, Xero, QuickBooks, and Sage all work. After uploading you pick which column maps to which field, so column order and exact header names do not matter.
What is fuzzy matching and why does it matter for reconciliation?
When a customer pays by bank transfer they type their company name themselves. "Smith & Sons Ltd" might arrive as "SMITHANDSONS", "Smith and Sons", or "SMITH SONS LTD". Fuzzy matching uses Levenshtein edit-distance — the minimum number of character insertions, deletions, or substitutions needed to turn one string into another — so these variants still match your invoice for Smith & Sons Ltd. This eliminates most of the manual lookup work that makes reconciliation slow.
Is my financial data safe? Does it get uploaded anywhere?
No data leaves your browser. The entire matching algorithm runs in JavaScript on your own device — there is no server, no login, and no file upload. You can verify this by disconnecting from the internet and reloading the page: it will still work. Only the PapaParse library is loaded from a CDN on first use.
What does the reconciled CSV output contain?
The output contains every row from your bank statement CSV with extra columns appended: matched_invoice_ref (the invoice number of the matched invoice), matched_customer (customer name from the invoice), matched_amount (invoice amount), match_score (0–1 confidence), and reconciled_status which is one of CONFIRMED, EXCLUDED, or UNMATCHED. The unmatched-only download filters to rows where reconciled_status is not CONFIRMED.
Can I reconcile payments where one bank payment covers multiple invoices?
This tool matches one bank row to one invoice (1:1 matching), which covers the vast majority of reconciliation cases. If a customer bundles several invoices into one payment, confirm the best match for the total amount and note the remaining invoices manually. A future version may support split-payment matching.