Tickvouch free, in your browser ยท how we compare

Convert a PDF bank statement to a Xero CSV

Drop the PDF statement into the converter below and choose the Xero export. You get a CSV with four columns: Date, Amount, Payee, Description. Dates are written YYYY/MM/DD, money out carries a minus sign in the same column as money in, and there are no balance columns, because Xero works the balance out from the transactions itself.

The PDF is read on your own machine and is not uploaded. Every conversion runs a reconciliation check first: opening balance plus every transaction must equal the closing balance, shown as PASS or FAIL with the arithmetic.

Columns Tickvouch writes
Date, Amount, Payee, Description
Date format
YYYY/MM/DD
Amounts
one signed column, money out negative
Balance columns
none, as Xero requires
Fields Xero needs
Date and Amount
Xero row limit
100,000 rows per CSV

Checked against Xero's own documentation on 14 August 2026: Import a CSV bank statement. What we could not verify there is left out, not hedged.

Convert your statement to a Xero CSV here

This is the whole tool, running on this page. The PDF is read on your machine; nothing is uploaded. Turn your internet off and convert anyway. That is the test.

Drop a PDF statement here

or click to choose one. One file in, one checked spreadsheet out.

Text-based e-statements from online banking, not scans or phone photos.

The statement does not leave this tab. The PDF is read here by pdf.js, Mozilla's PDF library, and the rows are parsed on your own machine. Nothing is uploaded, because there is nowhere to upload it to.

Everything this page loads, it loads from tickvouch.com: the stylesheet, the converter, pdf.js, and the spreadsheet writer. Once loaded, a conversion makes no network request at all. The page also sets a Content-Security-Policy of default-src 'self', so the browser itself refuses a request to any other host, whatever we might write on this page.

Check it rather than take it: turn your wi-fi off and convert anyway, or open the network panel in your browser and watch while you do. No account, no card, no sign-up.

What Xero asks a CSV to contain

Xero accepts a bank statement as a CSV file. It also accepts OFX, QFX, QuickBooks files and QIF. Where your bank offers OFX or QFX, Xero recommends those over QIF.

Two fields carry the import. In Xero's own words:

"You only need the Date and Amount fields to create bank statement lines, but reconciling your transactions is easier if you include more detail."

Xero Central, Import a CSV bank statement, read 14 August 2026

The optional fields are Payee, which Xero marks as recommended, plus Description, Reference and Cheque number. Two further columns hold an analysis code and a transaction type.

Amounts have one rule and it is strict. Xero writes: "Both income and expense amounts must be in the same column. Show income as positive amounts and expenses as negative amounts using a negative sign in front of the amount or with brackets, for example -30.00 or (30.00)." There is no separate debit and credit column option. Xero also says: "Don't use commas to show decimal places."

Xero accepts dates as DD/MM/YYYY, MM/DD/YYYY, YYYY/MM/DD, DD/MM/YY, MM/DD/YY, DD/MMM/YY, DD/MMM/YYYY, DD MM YY with spaces, DD-MM-YYYY with hyphens, DD.MM.YYYY with periods, and DDMMYYYY with no separator at all.

A CSV can be imported without headings, but headings make the column mapping easier. Xero requires that "The header row must be in row 1 and each column name should be unique." A file may not hold more than 100,000 rows: "You can't import a CSV file with more than 100,000 rows."

Three things must be deleted before the import: any column holding an opening or closing balance, because Xero calculates the balance from the transactions; the bank account number if the file carries one; and empty rows.

The columns Tickvouch writes for Xero

ColumnWhat it holdsWhy
Date The transaction date as YYYY/MM/DD. One of the formats Xero lists, and the one order that cannot be read the wrong way round.
Amount One signed number. Money out is negative. No thousands commas. Xero requires income and expenses in the same column, expenses negative, and no commas in the number.
Payee The bank's own narrative for the row. Xero marks Payee as recommended, and the narrative is what you match against when you reconcile.
Description Tickvouch's row flags, when a row carries any. A row the parser was unsure about stays visible after the import instead of arriving looking like every other row.

No opening or closing balance column is written, because Xero calculates the balance from the transactions and asks you to delete balance columns. No account number column is written either. Every header sits in row 1 and every name is different from the others.

The first time you import, Xero asks you to assign each column to one of its bank statement fields. That assignment carries over to later CSV imports, unless the new file has extra columns or different headers. Because Tickvouch writes the same four headers every time, the assignment you make once holds for the next statement.

The failure that does not announce itself

A rejected import is the good outcome. Xero tells you, you fix the file, you move on. The expensive case is the import that succeeds while quietly leaving something out, because nothing asks you to look.

Xero's own page names one such case: "Transactions matching those already in Xero will be treated as duplicates and won't be imported." That rule is correct and useful, and it also means a statement overlapping one you imported before goes in short, without an error.

There is a second. If the dates in your file could be read more than one way, Xero asks you to choose the format, and then, in its words, "Xero applies the chosen format to the entire statement and all future CSV bank statements". One answer, given once and at speed, carries forward.

Both are why this export writes the year first. A date written 2026/01/05 cannot be read as anything else, so the prompt does not appear and there is no choice to get wrong. And before the file is written at all, the totals are checked against the statement's own closing balance, so a statement that arrives short is short on this page, in front of you, rather than inside your ledger a month later.

None of that removes your judgement, and it is not meant to. It removes the two silent failures Xero itself documents, and it tells you where the total stands before you commit the rows. What you do with a FAIL is still yours to decide.

This is the check Xero users keep asking for

We did not invent this idea. It has been posted on Xero's own product-ideas forum more than once, by people describing exactly the moment they want covered.

"When importing a bank statement, it would be great if just before completing the import, Xero could show the end bank statement balance based on the existing bank balance and the transactions that are about to be imported. This could then be checked with the actual bank statement to make sure it matches."

Mihaela Andronic, Xero Product Ideas, 15 June 2024 โ€” productideas.xero.com

"Importing Bank Feeds - When importing bank feeds, before confirming the import it would be useful to see what the new statement balance in Xero will be once the transactions have imported so you can reconcile it to the statement balance before hitting confirm."

Amey Hook, Xero Product Ideas, 21 July 2026 โ€” productideas.xero.com

The first is about importing a statement and the second about bank feeds, so they are not the same request. What they share is the moment: both want the total checked before the rows are committed, rather than chased afterwards through a reconciliation report. Two years apart, people asked for the same point in the process.

That is what happens here, one step earlier: the totals are checked against the statement while the data is still a file on your machine, before Xero is involved at all. It is not a replacement for reconciling in Xero, and we are not claiming it is. It means the file you import has already been added up.

If the Xero import fails

Work through these in order. Each one is a rule from Xero's own page.

  • Rows appear with the wrong sign. Income must be positive and expenses negative, in the same column. Xero accepts a minus sign or brackets, so -30.00 and (30.00) both mean the same thing.
  • Amounts import as text or as the wrong number. Check for commas. Xero's instruction is to not use commas to show decimal places.
  • Dates land in the wrong month. Check the date column against Xero's accepted list above. Tickvouch writes YYYY/MM/DD, which is on that list.
  • Xero rejects the balance. Delete any opening or closing balance column. Xero calculates the balance from the transactions.
  • Xero objects to an extra column. Delete the bank account number column if the file has one, and delete empty rows.
  • The column mapping step looks wrong. The header row must be in row 1, and each column name must be unique.
  • The file is too big. A CSV cannot hold more than 100,000 rows. Split the statement and import the parts.
  • Rows are missing after the import. Transactions that match ones already in Xero are treated as duplicates and are not imported. Check whether the period overlaps an import you already ran.
  • The downloaded Xero template does not look like ours. Xero's import template is regional. Its file name and its column headings differ by region, chosen from your browser language and defaulting to New Zealand English.

What Tickvouch cannot do

Text-layer PDF e-statements only. These are the files you download from online banking.

There is no OCR. A scanned statement or a photograph of one has no machine-readable text, so the page declines it rather than guessing numbers from an image.

Amounts need two decimals to be read as amounts.

The reconciliation check runs before any export. If it says FAIL, the arithmetic is shown and the download stays available. Find the difference before you import the file into your ledger.

Go to the converter above

Questions

Which fields does Xero actually need?

Date and Amount. Xero says those two create the bank statement lines, and that more detail makes reconciling easier. Tickvouch writes Payee and Description as well.

Can I use separate debit and credit columns?

Not for a Xero CSV. Xero requires both income and expense amounts in the same column, income positive and expenses negative.

Why is there no balance column?

Xero asks you to delete columns containing opening and closing balances, because it calculates the balance from the transactions. Tickvouch never writes them into the Xero file.

Does Xero read QIF?

Yes, alongside CSV, OFX, QFX and QuickBooks files. Xero recommends OFX or QFX over QIF where your bank offers them. See the QIF page.

Is my statement uploaded to a server?

No. The conversion runs in your browser and the file never leaves your machine. Disconnect your internet and convert to prove it.