Home · Free tools · Reconcile two tables
Reconcile two tables
Drop the two tables — a bank statement and your ledger, invoices and payments, a supplier statement and your purchase list. Pick the column that identifies a transaction on each side and, if there is one, the amount column. Every row is paired by that reference, the amounts are compared within a tolerance you choose, and you get four lists back: matched, amount mismatches, only in the first table, only in the second. Leading zeros are ignored, because the ledger stores 12345 and the bank prints 00012345.
First table
Bank statement, payments received… — .xlsx or .csv
Second table
Ledger, invoices issued… — .xlsx or .csv
Nothing is uploaded. The file is read by JavaScript in this tab and never leaves your computer — no server sees it, and closing the tab throws it away.
How to reconcile two tables
- Drop both tables. One side is usually a statement you received (bank, supplier, marketplace payout); the other is what you recorded. Both stay in your browser.
- Confirm the reference and amount columns. They are guessed from the header names — invoice, reference, cheque, amount — and can be changed from the dropdowns.
- Set the tolerance. A cent or two covers rounding; a larger amount covers bank fees taken out of a payment. Anything above it is listed as a mismatch, not hidden.
- Work the two leftover lists. "Only in the first table" and "only in the second table" are the rows to chase. Download the report as .xlsx with one sheet per category, or as one CSV.
Why the VLOOKUP version keeps lying to you
The usual way to reconcile in Excel is a VLOOKUP from one sheet into the other, then a filter on
#N/A. It answers one question — "is this reference over there" — and quietly gets three
things wrong. It matches the first row it finds and ignores any repeat, so a payment that was split in
two comes back as a single match with the wrong amount. It compares text to text, so
00012345 in the statement and 12345 in the ledger never meet. And it has no
idea whether the amounts agree; that is a second formula, and a third for the reverse direction.
This page does the four passes at once: pairs by reference (with the zeros folded, and full-width digits treated as digits), compares amounts on the pairs it found, and lists what is left on each side. The "repeated references" switch decides whether a second row with the same reference is added to the first — instalments, part-payments — or listed as an extra that needs a look.
The four lists, and what each one usually means
- Matched. Same reference on both sides, amounts within tolerance. Nothing to do; the report keeps them so the totals add up.
- Amount mismatches. Same reference, amounts further apart than your tolerance. Bank fees deducted from a transfer, a short payment, a typo in the ledger. The difference is shown per row and totalled.
- Only in the first table. On the statement, not in your records: a payment you have not booked yet, a customer who paid twice, a direct debit nobody entered.
- Only in the second table. In your records, not on the statement: an invoice still unpaid, a cheque not yet cleared, or a payment that arrived under a different reference — that last one is the case for fuzzy matching on the description column.
Rows with an empty reference are set aside and counted rather than silently matched to each other; an empty key matching an empty key is how reconciliations come out "clean" and wrong.
Tolerance is a decision, not a default
A one-cent tolerance catches rounding between systems that store two decimals and systems that store four. Setting it to the size of a typical card fee lets those pairs count as matched, which is convenient and also hides the fees — so the report shows the total difference across mismatched rows separately, and you can run the same two files twice with different tolerances in a few seconds. What the page will not do is guess: a pair is either within the number you chose or it is listed.
Bank statements that arrive as PDF
If the statement is a PDF rather than a spreadsheet, run it through the bank statement converter first; it reads the text layer, rebuilds the columns and checks that the running balance adds up, then gives you a CSV to drop here. A scanned image needs OCR, which this site does not do in the browser.
Every month, not just this once
A one-off reconciliation is exactly what this page is for. Doing the same one every month — same bank export, same ledger, same three reasons rows fail to match — is the job the TableDI desktop app is built around: the reference and amount columns, the tolerance and the fixes you added last month are kept as a job, next month's files are dropped in, and the exceptions come back as a list with a reason next to each one.
Nothing leaves this tab
Bank statements and ledgers are the files least suited to a free website with an upload button. Both tables are parsed by JavaScript in your browser, the matching runs there, and the reports are built there; no request carrying your data appears in the network tab while you work.
Questions people ask
How do I reconcile two Excel sheets?
Drop each sheet (or the same workbook twice and pick a different sheet on each side), confirm which column holds the reference and which holds the amount, and read the four lists: matched, amount mismatches, only in the first, only in the second. The report download has one sheet per list.
The references match but nothing pairs up. Why?
Nine times out of ten one side has leading zeros and the other does not, or one side stored the number as text with a trailing space. Both are handled here by default. The remaining case is a reference that is genuinely written differently — INV-1001 against 1001 — which is a job for the fuzzy matcher, or for a clean-up column in the sheet before you export.
Can it handle one payment covering several invoices?
Yes, in one direction: set "repeated references in the second table" to add them up, and the instalments with the same reference are summed before the amount is compared. One row on the statement covering several different invoice numbers cannot be paired by reference at all; those rows land in "only in the first table" for you to allocate by hand.
Does it work for supplier statements and marketplace payouts?
Any two tables that share a reference column: supplier statement against your purchase ledger, a marketplace or card-processor payout against your order list, payroll against the bank run. The page does not care what the reference is, only that it appears on both sides.
Are my files uploaded anywhere?
No. The file is read by JavaScript running in this tab, using the browser's own
DecompressionStream to unzip .xlsx and a parser that runs on your machine. There is no
server call in the page — you can watch the network tab while you use it. Close the tab and the data is gone.
Does it work with old .xls files?
Not directly. The .xls format is a different, binary format from Excel 97. Open it in Excel, LibreOffice or Numbers and save as .xlsx or .csv, then come back. The tool tells you this rather than failing silently.
Related
Do this on your own machine instead
TableDI is a desktop spreadsheet workspace that runs entirely on your machine. Import the file, fix it, chart it — nothing is uploaded, and there is no account to create.
Free forever, not a trial — no account, no card. macOS today; a Windows build is in progress. What the paid tier adds.
Last reviewed 2026-09-01 by the TableDI team. Something wrong on this page? Tell us — it is one inbox, read by the people who build TableDI.