Importing statements
Budvo reads the statements your bank and card issuers already give you: PDF statements, and CSV or OFX, QFX and QBO downloads. Drop in a year of them at once. Budvo works out which account each one belongs to, skips what's already there, and updates the account from the statement.
Everything happens on your own server. Budvo extracts the text of a PDF itself, with no outside service and no network request, and the original files stay in your encrypted database.
What it reads
| Statement | Notes | |
|---|---|---|
| Chase | Cards and checking | |
| Capital One | Cards and 360 checking | Two-date layout, "- $" credits |
| Discover | Cards | Merchant categories move to the memo |
| American Express | Cards | Descriptions over several lines |
| SoFi | Checking, savings and credit card | |
| Citi | Cards | Statements that span December and January get the right years |
| Bank of America | Checking and cards | Deposits and withdrawals sections |
| Wells Fargo | Checking | Separate deposit and withdrawal columns |
| Apple Card | Card | Daily Cash is left out of the amounts |
| Affirm, Klarna | Monthly statements | Purchases and payments |
Any other bank goes through a general reader that looks for lines with a date, a description and an amount, understands debit and credit columns and running balances, and checks the result against the statement's own opening and closing balances. When the lines don't add up, the preview says so.
CSV files from most banks work too: Budvo guesses the columns and remembers your choice for the next file with the same layout. OFX, QFX and QBO files carry their own ids, so the same download imported twice adds nothing.
Import
- Open Activity and choose the import button (the file icon).
- Choose one or more files. Each one is read and shown with what Budvo found: the bank, the last four digits, the statement period, and a summary like 12 new, 3 already in Budvo, 1 pays a bill.
- Check the account. Budvo matches statements by their last four digits, then by bank, then by name. A card it hasn't seen becomes a new account, already filled in with the statement's balance, due date, minimum, limit and APR.
- Choose Import. Everything is imported in one step: if anything fails, nothing is half done.
Open Lines under a statement to see each transaction: what's new, what's already in Budvo, which bill it pays, and anything Budvo couldn't read (those are skipped; add them by hand if they're real).
Already in Budvo
A line counts as already there when the same account has the same amount within three days and a payee that fits, a transfer, a bill Budvo booked, or something you typed in by hand that day. Overlapping statements are handled the same way. Budvo links those transactions to the statement instead of adding them again, and a line that pays a bill on your calendar marks that bill paid.
Updated from your statement
When the statement is newer than what Budvo knows, the account takes its closing balance (as of the statement date), and cards also take the statement balance, due day, minimum, credit limit and APR. Anything you changed yourself after the statement closed is kept, and the preview says which values it keeps. The account page shows what the last statement updated.
Password-protected statements
Some banks lock their PDFs. Budvo asks for the password and reads it on the spot; the password isn't stored. Statements locked only against printing or copying open without asking.
Your statements, kept
Each account has a Statements section with the original files, newest first. Transactions and paid bills show a small From statement link that opens the PDF. Deleting a statement keeps its transactions.
The files live inside your encrypted database, so your backups and the full server export carry them. Household exports leave them out.
Findings
With more of your history in Budvo, Subscriptions, Findings points out what's worth a look:
- Charged twice: the same merchant and amount within a few days, with no refund. Budvo writes the message to send, with the merchant, dates, amount and card.
- Fees and interest this year, per account, and a script to ask for a late or overdraft fee back.
- Trials that turned paid, yearly charges that aren't bills yet, and price increases.
- Card payments that didn't arrive: money that left checking for a card, with no payment on the card side within five days.
A double charge also shows as one line on Today.
Scanned statements
A scanned statement is a picture of text, with nothing to read. Budvo can read them with the optional OCR container, budvo-ocr, which runs next to Budvo on your own machine and never sends anything anywhere. Without it, Budvo says it can't read text from a scanned statement.
Add it to your compose file and point Budvo at it:
services:budvo: # ... your existing settings ... environment: BUDVO_OCR_URL: http://ocr:8080ocr: image: git.ronniie.com/nulldaily/budvo-ocr:latest restart: unless-stopped # Default bridge network, no ports: only Budvo talks to it.Then restart:
docker compose up -dBudvo only sends it statements with no text of their own, never regular PDFs, CSV or OFX files. Lines read this way are marked Read by OCR, check it in the preview, and more strongly when a page was hard to read.
Limits
- Up to 25 MB per file and 100 files per import.
- Uploads you don't import are deleted after a day.
- Budvo reads statement text; it doesn't rebuild buy now pay later plans from Affirm or Klarna statements (add the plan on its account).