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.
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.
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.
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:
1,234.00 against 1,243.00 — it is flagged as a transposition
rather than a $9 discrepancy. The old rule is that a difference divisible by 9 suggests
transposed digits; that alone gives false positives, so this checks the digits themselves as
well.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.
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.