Two lists that should agree, and don't. See exactly where.

Drop the two CSV exports — bank against ledger, a statement against what you paid, a processor payout against your sales. This matches them on amount and date, then shows you what is only on one side, what is doubled, and which mismatches are a transposed digit rather than a genuinely missing transaction.

No server, no account, no network calls once this page has loaded. Both files are read and compared inside this tab, which matters when one of them is a bank export.

What it looks for, in order

1. Matches

Same amount, and a date within the window you set. Each row can only be used once, so a single $400 payment cannot silently absorb two $400 charges. When several candidates are equally valid it takes the closest date, then the most similar description.

2. Only on one side

The rows with no partner at all. This is usually the answer you came for: the payment that never cleared, the deposit that was never booked, the duplicate that was paid twice.

3. Near misses, which are the useful part

A row that almost matched is more informative than one that didn't, so these are separated out rather than dumped in with the rest:

Reading the columns

It finds your date, amount and description columns from the header row, so exports do not have to be reshaped first. Amounts may be plain, parenthesised for negatives, carry a currency symbol, or arrive as separate Debit and Credit columns, which are combined into one signed figure. Dates may be MM/DD/YYYY, YYYY-MM-DD, DD-MMM-YYYY or written out.

Every amount is held as whole cents from the moment it is read. Money that goes through a floating-point number comes back very slightly wrong, and in a reconciliation report a rounding artefact is indistinguishable from a real one-cent difference.

What it does not do

It never changes either file and there is nothing to save; it only reports. It will not match one row against several — a $1,000 invoice settled by two $500 payments shows as unmatched on both sides, because guessing at splits is how a reconciliation tool starts inventing agreement that isn't there.