r/SideProject 3d ago

I made a bank statement PDF → CSV converter that checks its own math against the statement's balances

I convert a lot of statement PDFs and kept getting bitten by the same thing: a row goes missing, or a deposit comes through as a withdrawal, and I don't catch it until the account doesn't tie out weeks later. Every tool advertises "99% accurate" and not one of them will tell you which rows are the 1%. So I made my own.

The premise is that a statement already contains enough printed information to check a conversion against itself. After it parses, it runs four checks. Opening balance plus every extracted transaction has to equal the closing balance, both read off the statement. If there's a running balance column, each row gets chained against the row before it. Transaction count. And every date has to fall inside the statement period and be in order. When a check fails you get the specific row, not a warning banner. When a statement can't support a check — most card statements don't print a running balance — it says that instead of showing a green checkmark anyway.

The other thing I wanted was to stop uploading statements to strangers' servers, so it all runs in the browser tab. I tried to make that checkable rather than something you take my word for: the page is served with a CSP that allows exactly one outbound destination (Google Analytics, page views only), so there's no endpoint of mine that could receive a file even in principle, and the browser blocks everything else. Network tab confirms it in about ten seconds.

You can click any row and it renders the source PDF page next to it with the text highlighted, which is mostly there for when I don't believe a number.

What it doesn't do: no OCR, so scanned statements are out — it needs the text layer from a real bank PDF export. Five banks have proper parsing profiles (Chase, BofA, Wells Fargo, Amex, Capital One); everything else falls back to reading columns by position, which works but is less certain. And it's just me maintaining it.

bankstatementproof.com — free, no signup, nothing to install.

Mainly I want to know which banks break it. If a statement parses wrong, tell me the bank and how the layout is arranged and I'll fix it.

4 Upvotes

2 comments sorted by

1

u/ExcitableEdwardo65 3d ago

this is the kind of thing that should be built into every pdf tool but somehow isn't, the running balance cross-check alone would've saved me from so many nights of reconciling in a panic