QBOKit

How to import a PDF bank statement into Xero outside the US and Canada

If you are in the UK, Australia, New Zealand, Ireland, South Africa or anywhere else outside North America, you have probably found that Xero's own PDF statement feature is not available to you. That is not a setting you have missed. It is a regional limit, Xero has confirmed it twice in its own forum, and the honest summary is that you have to produce the file yourself.

🔒 Drop your PDF statement into the converter — free, runs in your browser, the statement is never uploaded to anyone, including us.

Why Xero has no PDF route in your region

Xero does read data out of PDF statements, through Hubdoc bank statement extraction. Xero describes it like this: "It works by extracting data from the PDF statements of supported banks into a pre-formatted CSV file", and in the same post: "Hubdoc can extract data in debit and credit statements from a number of the top banks in Canada and the US, with more banks regularly being added."

Two limits are hiding in that sentence. It covers supported banks rather than any bank, and it covers Canada and the US. Hubdoc's own help article on the feature is even titled Extract bank statement data (CA, US).

The clearest statement is on Xero's own product ideas site, under the request "Hubdoc - Convert bank statement to csv file". Xero replied in July 2022: "Currently, this feature is only available in the US and Canada." That request now carries 304 votes and is marked Not in pipeline, and when Xero commented again in June 2026 it said "there isn't any work planned for this idea", pointing instead at Smart Document Capture in Xero Files. Worth checking whether that is live in your region — but it is not the same feature, and the regional answer for statement extraction has not moved in four years.

So if you are outside the US and Canada and the bank has no feed in Xero, there is no native way to get a PDF statement in. Your options are to type it, to pay a converter, or to convert it yourself.

What Xero will accept instead

Xero's manual statement import is format-fussy but generous: "You can download your bank transactions from your online banking as a OFX, QBO, QFX, QIF or CSV file". Xero Central has one article per format (OFX, QFX or QuickBooks, QIF, CSV) and those are the rules to follow for column names and date order, because they differ by region.

So the job is only to turn the PDF into one of those five. Here is what this converter produces, and what it does not:

OutputFor Xero
.OFXUsually the best choice. It carries a transaction id per line, so Xero can tell a repeated line from a duplicate, and it has no date-format ambiguity to get wrong. See the OFX guide.
Clean CSV — for XeroDate, description and amount, trimmed to what an importer accepts. Use it if OFX is refused or you want to eyeball the data in a spreadsheet first.
.QIFAccepted by Xero and useful if you are also feeding an older desktop package.
.QBOXero lists QuickBooks files as importable. OFX is the same data without the QuickBooks-specific institution tags, so prefer OFX here.
.QFXWe do not produce QFX. It is Quicken's variant and we would rather say so than let you find out at the import screen.

The steps

  1. Download the statement as a PDF from your online banking, rather than photographing or scanning a paper one. See the limitation below for why that matters.
  2. Open the converter and drop the PDF on it. The reading happens in your browser, on your own machine. Nothing is uploaded, so no third party ends up holding your client's bank statement.
  3. Check the preview, row by row. PDF statements vary enormously between banks and this is the step that matters most. Confirm the dates read the right way round, that money in and money out have the right signs, and that no balance line has been picked up as a transaction.
  4. Fix any column it got wrong using the dropdowns above the preview. When the statement has a recognisable header row, your corrections are remembered against that layout in your own browser, so next month's statement from the same bank opens correctly without redoing it.
  5. Download as OFX (or Clean CSV) and import it into the bank account in Xero, following the Xero Central article for the format you chose — the exact steps and the column rules differ by region, so read them there rather than here.

The honest limitation: text, not pictures

A PDF downloaded from online banking normally has a real text layer, and that is what gets read. A scan or a phone photo of a paper statement is just an image of text, and extracting that needs OCR, which this tool deliberately does not do. If you drop one in, it says so plainly rather than handing you an empty or half-invented file.

If your statement is a scan, the realistic routes are to ask the bank for a CSV or OFX export, which most now offer somewhere in online banking, or to use a paid OCR-based service.

PDF reading here is also newer than the CSV path, so treat the preview as a check and not a formality. If a statement comes out wrong, tell us which bank and what went wrong and it gets fixed. Please do not attach the statement itself — we do not want it, and the bank name plus the symptom is enough.

Is it safe to put a client's statement into a web page?

It is the right question, especially if you are a bookkeeper handling someone else's data, and the answer should be checked rather than believed. The conversion runs as JavaScript inside your browser; the PDF is never sent anywhere. Open developer tools, go to the Network tab, and convert a file: you will see no upload. The only request the page makes on its own is a small anonymous counter ping carrying counts and yes-or-no flags — how many rows, whether columns were detected — never a cell value, a header name or a file name. Block it and the converter still works.

That is the one thing a hosted converter cannot offer you. Every service that charges per page for statement conversion is reading the file on its servers, which means your client's statement sits in someone else's logs.

Convert my PDF statement — free

Want to see it work before trusting it with a real statement? Try the sample statement.

Sources

Related