Reconcile bank statement and ledger CSVs

Paste a statement CSV and a ledger CSV, choose the date, amount, and memo columns, and get matched, suggested, and unmatched transactions with fuzzy memo scoring.

Try:
Reconciliation report

About this tool

Bank Statement Reconcile compares a bank-statement CSV with a bookkeeping ledger CSV. It matches transactions by signed amount and date window, then uses a fuzzy token score on the memo/description fields to separate confident matches from suggested matches that need review.

Use it when exported bank transactions and accounting rows use slightly different memos such as COFFEE SHOP versus Coffee Shop downtown, or when ledger entries land a few days away from the bank posting date.

Worked example

Statement CSV:

date,amount,memo
2024-01-02,-42.50,COFFEE SHOP
2024-01-05,-1200.00,RENT PAYMENT

Ledger CSV:

date,amount,memo
2024-01-02,-42.50,Coffee Shop downtown
2024-01-05,-1200.00,January rent

With a three-day date tolerance and a moderate memo threshold, the tool lists the coffee row as a match and the rent row as a lower-scoring suggested match for human review.

Limits & edge cases

FAQ

Do amounts need to be signed the same way on both files?

Yes. The matcher compares signed amounts. If the statement exports debits as negative values but your ledger stores expenses as positive values, normalize one file first or use a CSV calculation tool before reconciling.

What is the difference between matched and suggested matches?

Both pass the amount and date tolerance gates. A matched row also reaches the memo similarity threshold. A suggested match has the right amount and date but a weaker memo score, so it is listed separately for manual review.

Can I use column numbers instead of header names?

Yes. Every date, amount, and memo column field accepts a header name or a 1-based index such as 1, 2, or 3. Header names are usually clearer for saved URLs and CLI commands.

Why did one obvious match remain unmatched?

A ledger row can only be claimed once. If duplicate amounts and dates exist, the greedy pass picks the best memo score in statement order. Tighten the date window, review the suggested matches, or split duplicate-heavy periods into smaller batches.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool bank-statement-reconcile "date,amount,memo
2024-01-02,-42.50,COFFEE SHOP
2024-01-05,-1200.00,RENT PAYMENT" 'ledger_csv=date,amount,memo
2024-01-02,-42.50,Coffee Shop downtown
2024-01-05,-1200.00,January rent'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/bank-statement-reconcile/?statement_csv=date%2Camount%2Cmemo%0A2024-01-02%2C-42.50%2CCOFFEE%20SHOP%0A2024-01-05%2C-1200.00%2CRENT%20PAYMENT&ledger_csv=date%2Camount%2Cmemo%0A2024-01-02%2C-42.50%2CCoffee%20Shop%20downtown%0A2024-01-05%2C-1200.00%2CJanuary%20rent&stmt_date=date&stmt_amount=amount&stmt_memo=memo&ledger_date=date&ledger_amount=amount&ledger_memo=memo&date_tolerance_days=3&amount_tolerance=0.01&memo_threshold=70&delimiter=comma&output=markdown

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.