← Blog · June 30, 2026 · 9 min read
Original research

Bank statement upload that actually works in 2026: I tested 11 banks

I took the same bank statements, in CSV and PDF, and pushed them through five money apps to settle one question: in 2026, when you upload a statement, does the thing actually read it? The answer is messier than any marketing page admits. Some apps want a clean spreadsheet you do not have. Some will not take a file at all. One reads a PDF or a photo without complaint. Here is what parsed, what broke, and which tool is right for the bank you actually use.

I spent years inside banks watching people fight their own statements, so this is a test I wanted run honestly rather than as a sales pitch. I uploaded statements from eleven banks, mostly Brazilian and Latin American, plus a few US exports, and I logged what each tool did with the raw file. No conversions, no cleanup. Just the file your bank gives you and the question of whether the app can turn it into a budget. I name where the rivals win, because for a lot of readers one of them will be the better answer.

What is the best way to upload a bank statement to a budget app in 2026?

The best method is the one that matches the file your bank gives you. If your bank connects through Plaid, a live sync in Monarch or YNAB means you barely touch a file. If your bank only hands you a PDF or a CSV, you need a tool that parses it, and most do not. Capi reads CSV, PDF and a photo inside Telegram, which is the widest net in this test.

That framing matters because the marketing flattens it. Every app says "import your transactions," but import means four different things. It can mean a live data feed, a clean CSV you map by hand, an OFX or QFX file the app reads without mapping, or a raw PDF a parser has to interpret. The further your bank is from a tidy CSV, the fewer tools survive. I sorted the field by exactly that, because the gap between "supports import" and "reads the file I have" is where most people quietly give up.

Which budget apps actually let you upload a bank statement?

Of the five I tested, four accept some kind of file and one accepts none. Monarch and YNAB take CSV and other structured files but no PDF. Mobills takes OFX, common in Brazil. Copilot takes no file at all and relies entirely on its bank connection. Capi is the only one that reads a CSV, a PDF and a photo of a statement directly. The table below is the honest shape of it.

Tool CSV upload PDF statement Photo of statement Live bank sync Price
Capi Yes Yes Yes No, by design Free, then $69.90/yr
Monarch Money Yes, with mapping No No Yes, many banks $99.99/yr
YNAB Yes, plus OFX/QFX No No Yes, many banks $109/yr
Mobills OFX import No No Some BR banks R$199.90/yr
Copilot Money No file import No No Yes, US banks $95/yr

Read that table by your own bank, not by the brand names. If you bank in the US with a big institution, Monarch and YNAB will likely sync without you ever opening a file, and that automatic feed is genuinely better than uploading anything. If your bank is Nubank, Inter, Mercado Pago or any account Plaid never reached, the live sync column is empty for you and the only thing that matters is whether the tool can read the file in your downloads folder. I write more about that split in the best money tracker guide.

Can you upload a PDF bank statement instead of a CSV?

On most apps, no. YNAB, Monarch and Copilot do not read a raw PDF, so if your bank only gives you a PDF you must convert it to a CSV first or connect the bank live. In this test only Capi read a PDF statement directly, by forwarding it into a Telegram chat. PDF upload is possible in 2026, but only on tools built to parse the file.

This is a bigger deal than it sounds, because a large share of the world's bank statements arrive as PDFs and nothing else. Credit card invoices in Brazil, the fatura, are a classic case: a PDF with installments, IOF and a rotating-interest line, not a clean spreadsheet. Asking a US-built importer to read that is asking the wrong tool. The workaround everyone reaches for is a PDF-to-CSV converter, which adds a step, sometimes scrambles the columns, and gives the importer one more chance to create duplicates. I walk through reading one of those PDFs line by line in turning a bank statement PDF into a budget.

Why do CSV imports break, and how does a parser fix it?

CSV imports break because a CSV has no standard. Every bank labels its columns differently, writes dates in its own order, and signs amounts its own way, so the importer has to guess or make you map fields by hand. A schema-inference parser fixes this by reading a new bank's layout once, then parsing every later file from that bank deterministically. The guessing happens a single time, not on every upload.

That is the core of how Capi handles new banks. The first time it sees a layout it has never met, it infers a parse specification, the column roles, the date format, the sign convention, whether the file is a credit card statement, and caches it by a fingerprint of the file. Every later statement from that bank runs against the cached spec with no model call, which keeps it fast and reproducible. It also runs a sanity check after each parse, comparing the sum of the rows to the printed total, so a silent column error surfaces instead of poisoning your budget. The other failure mode, duplicate rows, deserves its own note: most importers match on date and amount, so two identical charges collapse or double. The durable fix is a hash of each row, which is the approach I cover in why budget apps duplicate transactions and test in the same-file-twice duplicate test.

What happened when I uploaded statements from 11 banks to Capi?

Nine of the eleven parsed cleanly on the first try, one needed a single correction, and one landed in a review queue with a low-confidence flag. The eleven covered Nubank, Inter, Mercado Pago, Genial, XP, Bradesco, Itau, Banco do Brasil, C6, BRB and a generic credit card fatura. The clean nine produced categorized transactions with no manual mapping. The two stragglers were a scanned PDF and an unusual date format.

The honest detail is in those two failures. A statement that is really a scan, an image inside a PDF, has no text rows to read, so it falls back to the photo path with its own accuracy limits. The date-format case was a file where days and months were ambiguous, the kind of thing that quietly flips a March charge into a January one, and the sanity check caught it before it reached the budget. I would rather a tool stop and flag than confidently file the wrong month, because a wrong month is harder to notice later than a missing row. If you want to see how Capi stacks up against a live-sync rival on the same data, the Capi vs YNAB comparison lays out the trade directly.

When is live bank sync better than uploading a statement?

Live sync wins whenever your bank supports it and you want zero ongoing effort. A Plaid connection in Monarch, YNAB or Copilot pulls new transactions automatically, so you are never downloading a file. For a US user with a mainstream bank, that automatic feed is simply better than any upload flow, including Capi's. Uploading only wins when no aggregator reaches your bank, or you would rather not hand your login to a third party.

I want to be clear about this because it is the place Capi loses on purpose. Capi has no live bank link, so there is no automatic feed, and if your bank is on Plaid you are giving up genuine convenience to use it. The reasons to choose upload anyway are specific: your bank is in a country aggregators ignore, your account is a type they never added, or you simply do not want a continuous connection between your bank and an app. If none of those is you, a sync-first tool is the right call, and the Capi vs Monarch comparison is the honest place to weigh it. Capi is the answer for the file in your downloads folder, not a replacement for a feed you are happy with.

How do you upload a bank statement to Capi?

You send the file to the Capi bot in Telegram and it does the parsing. There is no dashboard to configure and no column mapping screen. The steps are short: open the chat, attach the statement, and confirm the transactions it reads back to you. A photo, a CSV and a PDF all go through the same chat, which is the whole point of keeping it inside a messaging app you already have open.

  1. Open the Capi bot in Telegram and start a chat.
  2. Attach your statement as a CSV or PDF, or send a clear photo of a paper statement or screen.
  3. Wait a moment while Capi reads the rows and categorizes them.
  4. Review the parsed transactions it shows you, and deselect anything you do not want kept.
  5. Confirm, and the history lands in your monthly view with a pace bar and a 50/30/20 read.

The whole test in one breath. Live sync wins if your bank is on Plaid, and Monarch or YNAB will serve you better there. If your bank only gives you a PDF, or it is a Latin American account aggregators skip, you need a parser, and Capi was the only tool here that read a CSV, a PDF and a photo directly. Nine of eleven banks parsed on the first try. The right tool is the one that reads the file you actually have.


Upload a statement and see it become a budget.

Capi reads CSV, PDF and photo statements inside Telegram, with native parsing for eleven Latin American banks.
Free to start, Core is $9.90 a month or $69.90 a year.

Try Capi free on Telegram →

Frequently asked questions about bank statement uploads

Can I upload a PDF bank statement to a budget app?

With most apps, not directly. YNAB, Monarch and Copilot do not read a raw PDF statement, so you either connect the bank live or convert the PDF to a CSV first. Capi is the exception in this test: you forward the PDF into a Telegram chat and a parser reads the rows. So the honest answer is that PDF upload works in 2026, but only on tools built to parse the file rather than expecting a clean spreadsheet.

Which budgeting app is best for importing bank statements?

It depends on your bank. If your bank connects through Plaid, Monarch and YNAB sync automatically and you rarely touch a file. If your bank is in Latin America or only gives you a PDF, a file parser matters more, which is where Capi and the OFX import in Mobills do better. There is no single winner. The best tool is the one that reads the format your bank actually gives you.

Does Capi support CSV and PDF statement uploads?

Yes. Capi reads CSV and PDF statements, and it can also read a photo of a paper receipt or a statement screenshot, all inside Telegram. It has native parsing for eleven common Brazilian and Latin American banks and a schema-inference step that learns a new bank's layout on first sighting. It does not connect to your bank live, so you upload or forward the file yourself, which is the trade for working with banks Plaid does not reach.

Why does my CSV import create duplicate transactions?

Usually because you imported an overlapping date range twice, or a manual entry collided with the same row from a file. Most importers match on date and amount, so two coffees of the same price on the same day look identical and either both survive or one is wrongly merged. The durable fix is a row hash that fingerprints each line, which is how Capi skips a file you already uploaded instead of doubling it.

Do I need a bank connection to use Capi?

No. Capi has no live bank link by design. You add spending by typing it, sending a voice note, snapping a photo, or uploading a CSV or PDF statement, all inside Telegram. That means it works with banks no aggregator supports and keeps your login out of a third party, but it also means there is no automatic feed, so you upload statements yourself when you want the full history.

Written by Daniil Kozin, founder of Capi. More in this series: The best money tracker in 2026 · Bank statement PDF to budget · The same-statement reupload test · Why budget apps duplicate transactions · Capi vs YNAB · Capi vs Monarch.