Why OFX
OFX (Open Financial Exchange) is what online banking produces when you choose "download transactions". Budgeting and accounting apps treat it as a first-class import: YNAB, GnuCash, Moneydance and Actual Budget all read it. When the bank's download window has closed — last year's statements, an account you have since closed — the PDF is often all that is left, and this turns it back into the file the bank would have given you.
Every transaction in the file carries a stable ID derived from the statement, so importing the same file twice does not create duplicates, and the file includes the statement's closing balance when it has one, which lets the app show whether it agrees.
What is and is not in the file
The file is OFX 1.02, the version with the widest support. Each transaction has its date, a signed amount, a short name (OFX limits it to 32 characters) and the full description as a memo. Card and loan statements are written as credit card accounts.
It is not a QFX or QBO file. Those are Intuit's variants for Quicken and QuickBooks, and they require an Intuit-registered bank ID that cannot honestly be invented. For QuickBooks, use the CSV; for Quicken, try QIF.
As with QIF, every transaction needs an exact date. If the statement leaves one ambiguous, the download is refused before any charge and the Excel file keeps the date as printed.
What this tool does
Upload a bank statement — the PDF your bank emailed, a scan, or phone photos of the pages — and every transaction comes back as a row: date, description, money out, money in, a signed amount and the running balance. Transactions from every page land in one table, so a twelve-page statement is one list, not twelve fragments to stitch together.
Then comes the part that matters: the tool checks its own work. It adds up what it read and compares the result with the balances printed on the statement. When they agree to the cent, you know no transaction was skipped, doubled or misread. When they do not, it tells you by how much and flags the rows where the running balance breaks, so you check three lines instead of three hundred.
How the balance check works
Two independent checks run on every statement.
- Opening + money in − money out = closing. The opening and closing balances are read from the statement's summary or its first and last lines. If the transactions read in between do not produce the closing balance exactly, something is missing or wrong, and the difference is shown.
- Row by row. Where the statement prints a running balance, each one must equal the previous balance plus that line's money in minus its money out. A break points straight at the problem: the flagged row, or the one just above it.
The arithmetic is done in whole cents, never in floating point, so a check cannot pass by rounding. Statements listed newest-first are recognised, and so are card and loan statements, where the balance is money owed and runs the other way.
A passing check proves the amounts are complete. It does not prove every description was read perfectly — a misspelt merchant name does not change a balance — so skim the descriptions before you rely on them.
What you get in the spreadsheet
The Excel workbook has three sheets:
- Transactions — one row per transaction, in the order printed, with the page it came from and a Check column that says why a row was flagged.
- Balance checks — each check, whether it passed, and the numbers behind it.
- Statement summary — bank, the last four digits of the account, period, currency, opening and closing balances, totals, and whether it reconciles.
Amounts are stored as numbers, not text, so SUM works straight away. Dates are written as year-month-day when the statement makes the year clear, which sorts correctly everywhere. The CSV holds only the Transactions table, one rectangular sheet, because that is what accounting software expects to import.
Upload several PDFs at once — twelve monthly statements, say — and they come back in one workbook with a Statement column, plus a summary row for each.
Text PDFs, scans and photos
A PDF downloaded from online banking already contains its text. That text is read in place, with each amount kept in the column it was printed in, which is why this path is the most accurate: the tool never has to guess whether 42.35 was money in or money out.
A scanned statement, or photos of printed pages, is read from the image. That works well on a flat, straight, well-lit page. It struggles with faint thermal-style printing, pages shot at an angle, and folds across the amount columns. The balance check is your safety net here: if a digit was misread, the running balance breaks at that row.
Photos uploaded together are treated as the pages of one statement, in the order you chose them. Each PDF is its own statement.
What it supports, and what it does not
It is built for current, checking and savings account statements, and reads card and loan statements too. It is not built for investment or brokerage statements, where a row is a holding rather than a movement of cash. Password-protected PDFs need the password removed first — the tool will not try to get around it.
It has not been tested against a named list of banks, and this page will not pretend otherwise. Statement layouts vary enormously; what the tool offers instead is a result you can verify. If the checks pass, the numbers are complete. If they fail on your bank's layout, the job tells you so plainly.
Privacy
Statements are sensitive, so here is exactly what happens. The uploaded file is sent to the reading model and deleted from storage when the job ends, whether it succeeded or not. Only the last four digits of an account number are kept. The transactions you see are stored with your job so the download still works if you come back later; email hello@sonomir.com to have a job deleted. Nothing you upload is ever published.
How the free tier works
The first 2 pages a day are free, with the balance checks, and you can copy every row you see. That is enough to see whether the tool reads your bank's layout correctly before you pay anything.
Past that, pages are 5 credits each — about 19 to 25 cents, depending on the pack — and the Excel download is 4 credits once per job. A six-page statement is 20 credits for the four pages past the free two, plus 4 for the workbook: 24 credits, roughly a dollar. Credits never expire, there is no subscription, and a job that fails is not charged.
Example result
Page 1 of a current-account statement (PDF from online banking) Opening balance 1,250.00 02 Mar CARD PAYMENT CITY GROCER 42.35 1,207.65 03 Mar SALARY ACME LTD 2,100.00 3,307.65 05 Mar STANDING ORDER RENT 950.00 2,357.65 Closing balance 2,357.65
Date Description Money out Money in Amount Balance 2026-03-02 CARD PAYMENT CITY GROCER 42.35 -42.35 1207.65 2026-03-03 SALARY ACME LTD 2100.00 2100.00 3307.65 2026-03-05 STANDING ORDER RENT 950.00 -950.00 2357.65 Reconciles to the cent: 1,250.00 + 2,100.00 in − 992.35 out = 2,357.65. Running balance: all 3 printed balances follow from the row before.
Cost: free — one page, inside the daily 2. The workbook download would be 4 credits.
How this compares
Where another tool is the better choice, it says so.
DocuClipper
BETTER THEREBuilt for accounting firms: bulk conversion, reconciliation workflows and connections into accounting software. If you convert statements every day, a dedicated platform is the better fit.
BETTER HERENo subscription. Try your own statement free, see the checked result before paying, and pay per page when you need it — suited to a few statements a month rather than a practice's whole workload.
Your bank's own CSV or OFX download
BETTER THEREFree and exact, straight from the bank's system. If online banking offers a download for the period you need, use that — nothing beats the source.
BETTER HEREWorks when all you have is the PDF: old statements beyond the download window, closed accounts, and statements a client or lender sent you.
Excel's Get Data from PDF
BETTER THEREBuilt into Microsoft 365 Excel on Windows, free if you already have it, and fine for a clean PDF with one tidy table per page.
BETTER HEREIt returns each page's tables separately and does nothing with scans or photos. This joins every page into one list, reads scans, and checks the balances.
Your questions, answered.
- Will YNAB import this file?
- YNAB's file import accepts OFX. Import into the matching account, then compare the cleared balance with the statement's closing balance — the file carries that balance so you can check.
- What happens if I import the same statement twice?
- Each transaction has a stable ID built from the statement, the date, the amount and the description, so apps that honour OFX transaction IDs skip the ones they already have.
- Is it free?
- The first 2 pages a day are free, with no account, including the balance checks, and you can copy every row. Longer statements are 5 credits a page, and the Excel and CSV downloads cost 4 and 2 credits once per job.
- Which banks does it work with?
- It reads the layout rather than matching a list of banks, so it is not limited to particular ones — but it has not been tested against a named list either. Try the first two pages free: if the balance checks pass, your bank's layout was read completely.
- What does it mean if the balance check fails?
- The transactions read do not add up to the balances on the statement. The difference is shown, and rows where the running balance breaks are flagged; the problem is almost always on that row or the one above it. Common causes are a faint or folded scan, or a statement layout the tool does not read well yet.
- Can it convert a credit card statement?
- Yes. On a card statement the balance is what you owe, so purchases increase it and payments reduce it. The check recognises that and reconciles it the right way round.
- Does it work with scanned or photographed statements?
- Yes, read from the image. Flat, straight, well-lit pages work best. The balance check is what tells you whether a scan was read correctly, so a scan that passes can be trusted as much as a PDF.
- Can I import the result into QuickBooks, Xero or another accounting app?
- Download the CSV: it has a date, a description and a signed amount on every row, which is what bank-statement imports ask for. There is no direct connection to accounting software; you map the columns once in the import screen.
- Is my statement stored?
- The uploaded file is deleted when the job ends. The transactions are kept with the job so you can download them later, with only the last four digits of the account number. Email hello@sonomir.com to have a job deleted.
- Can you convert a batch for me?
- Yes. For a large batch, or statements that fail the check, email hello@sonomir.com with how many statements and pages there are. You get a price before anything is done, and every statement comes back either reconciled to the cent or with the difference explained.