SheetStatement
Accounting software

Import Bank Statement into Odoo: CSV, OFX and PDFs

Import bank statements into Odoo Accounting from CSV, Excel or OFX, convert PDF statements first, map columns correctly and avoid common import errors.

SheetStatement Team11 min read

On this page

TL;DR Odoo Accounting can import bank statements from files when a live bank connection isn't available or doesn't cover the dates you need. Depending on your Odoo version, edition and installed modules, supported formats typically include CSV and Excel through Odoo's import tool, and structured formats such as OFX, QIF or CAMT. If your bank only gives you PDFs, convert them to a clean CSV or Excel file first: one row per transaction, real dates, a single signed amount, and a description. Import one statement period at a time, check the starting and ending balances, then reconcile the lines against invoices, bills and payments.

Odoo is used by a wide range of businesses, from small shops to manufacturers, and its Accounting app is designed around bank statement lines: each line from the bank gets matched to an invoice, a bill, a payment or a journal entry. When bank synchronization works, those lines arrive automatically. When it doesn't, because your bank isn't supported, the connection broke, you're migrating from another system, or you need history from before the connection started, you import statements from files.

This guide explains how that import works in general terms, how to prepare files that import cleanly, how to get PDF statements into a usable format, and how to avoid the mistakes that cause failed imports or messy reconciliations. Odoo's screens and features differ between versions and between the Community and Enterprise editions, so we describe the process rather than exact menu paths. Check Odoo's documentation for your version.

When you'll need to import statements

  • No supported bank connection. Some banks and countries aren't covered by synchronization.
  • Gaps. The connection stopped for a period, or only pulls a limited window of history.
  • Migration. You're moving to Odoo from another accounting system and want the bank history in the new system.
  • Opening balances and history. You started using Odoo mid-year and want earlier months for reporting.
  • Accounts the bank feed doesn't see, such as some credit cards, loan accounts or foreign accounts.

Formats Odoo can usually read

CSV and Excel. Odoo's generic import tool can import statement lines from CSV or XLSX files, with a column mapping step. This is the most flexible route and works with almost any source, including converted PDFs.

OFX and QIF. Structured formats produced by many banks for personal finance software. Where supported, they carry dates, amounts and descriptions in a standard way, so there's no column mapping. Our guide to converting a bank statement PDF to OFX explains the format.

CAMT.053. An ISO 20022 XML statement format common with European banks. Availability depends on your version and modules.

Country-specific formats. Some localizations add formats used by banks in particular countries.

If your bank offers a structured format and your Odoo installation supports it, that's usually the least effort. If you only have PDFs, CSV or Excel is the practical route.

Prepare a clean file

Most import problems come from the file, not from Odoo. Aim for:

Date Label Partner Amount Reference
2026-08-01 INVOICE 1042 PAYMENT CUSTOMER LTD 4,200.00 1042
2026-08-02 OFFICE RENT AUGUST LANDLORD CO -2,500.00
2026-08-04 CARD SUPPLIES -184.36
2026-08-05 BANK FEE -12.00

The column names here are illustrative. You'll map them to Odoo's fields during the import, and the available fields can differ by version. Key rules:

  • Dates in one consistent format. ISO format (YYYY-MM-DD) avoids day/month confusion. If you must use another format, make sure the import options match it.
  • One signed amount. Money in positive, money out negative. If your source has separate debit and credit columns, combine them first. Our guide to separating debit and credit columns shows the formula in both directions.
  • Numbers, not text. No currency symbols, no thousands separators that conflict with your decimal setting, no trailing minus signs. Our guide to cleaning bank statement data covers the fixes.
  • One row per transaction. No subtotal lines, page headers or "balance carried forward" rows.
  • A meaningful label. The description is what you'll match on during reconciliation, so keep it intact.
  • Partner where you know it. If your file includes a customer or vendor name that matches a partner in Odoo, mapping it helps reconciliation suggestions. Leave it blank rather than guessing.

Converting PDF statements

If your bank only provides PDFs, convert them first.

Copy and paste is fine for a page or two, but expect to fix columns and amounts.

Power Query in Excel can extract tables from many PDFs. See our Power Query bank statement guide.

A statement converter is quickest for longer statements or many months. SheetStatement converts statement PDFs to CSV or Excel with real dates, signed amounts and a balance check against the statement's opening and closing balances, so you know the file is complete before it reaches Odoo. The free plan covers 3 pages a month, with Starter ($9), Pro ($19) and Business ($39) monthly plans for larger volumes.

Whichever method you use, check the totals before importing:

=ROUND(OpeningBalance + SUM(Amount) - ClosingBalance, 2)

Zero means every transaction is there with the right sign. The free balance checker does the same check without formulas. Importing a file that doesn't balance just moves the problem into Odoo, where it's harder to find.

The import, step by step

The broad sequence is the same across versions:

  1. Pick the right journal. In Odoo, each bank account is a journal. Import into the journal for the account the statement belongs to. Importing into the wrong journal is one of the most common and most annoying mistakes.
  2. Start the import from the bank journal and choose your file.
  3. Map columns if you're importing CSV or Excel. Match your date, label, amount and partner columns to the corresponding fields. Odoo usually remembers mappings, which helps next month.
  4. Set formatting options: separator, date format, decimal and thousands separators. These must match the file.
  5. Test if your version offers it. A test run shows errors without importing anything.
  6. Import, then open the resulting statement or lines and check the count and totals.
  7. Check balances. Where your version tracks statement balances, confirm the starting balance matches the previous closing balance and the ending balance matches the bank statement.

Do one statement period at a time. It's much easier to verify a month than a year, and it keeps reconciliation manageable.

Reconciling imported lines

Importing gets the bank's view into Odoo. Reconciliation connects it with your books.

  • Customer payments: match each incoming line to the open invoice or invoices it pays. A single deposit may pay several invoices; Odoo lets you select multiple.
  • Vendor payments: match outgoing lines to bills.
  • Fees, interest and small recurring items: create entries directly from the line, or set up reconciliation models so recurring items are suggested or handled automatically.
  • Transfers between your own accounts: match against an internal transfer so the money isn't counted as income or expense.
  • Card processor payouts: record gross sales and fees so the net matches the deposit. Our guide to reconciling Stripe payouts shows the pattern.

Good labels and partner names make Odoo's suggestions far more accurate, which is another reason to keep descriptions intact during conversion.

Common import errors and fixes

Dates rejected or swapped. The date format in the import options doesn't match the file, or the file mixes formats. Convert dates to ISO format in Excel before exporting to CSV. See fixing bank statement dates in Excel.

Amounts imported as zero or rejected. Usually text values, currency symbols, or a decimal separator mismatch (comma vs point). Clean the column and set the separators correctly.

Encoding problems with accented characters. Save the CSV as UTF-8.

Everything lands in the wrong account. You imported into the wrong journal. Delete the imported lines (if not yet reconciled) and import again into the correct one.

Duplicates. The same period was imported twice, or an import overlaps with lines from bank synchronization. Check the date range covered by synchronization before importing, and only import missing dates. Odoo may detect some duplicates for structured formats, but don't rely on it for CSV.

Balances don't chain. The starting balance of the imported statement doesn't match the previous ending balance. A statement is missing, duplicated, or a line was dropped during conversion. Go back to the balance check.

A worked example

A small distribution company is moving from spreadsheets and an older accounting package to Odoo at the start of its financial year. Its bank has a connection in Odoo, but history only goes back a few months, and the company wants the full year in Odoo for comparison.

  1. Collect statements. The finance manager downloads twelve monthly PDFs for the operating account and twelve for the reserve account.
  2. Convert. Each statement becomes a CSV with ISO dates, label, partner where obvious, and a signed amount. Every file passes the balance check.
  3. Check overlap. Bank synchronization has already pulled lines from 1 June onward. She only imports January to May.
  4. Import. One month at a time into the operating journal, using a saved column mapping, then the same for the reserve journal.
  5. Reconcile. Customer receipts are matched to invoices imported from the old system. Bank fees and the monthly loan interest get reconciliation models. Transfers between operating and reserve are matched as internal transfers.
  6. Review. For each month, the ending balance in Odoo matches the statement's closing balance.

The company now has a full year of reconciled bank activity in Odoo, and the reconciliation models make the live months faster too.

Opening balances when you migrate

When you move to Odoo, the bank journal needs a starting point. If the first imported statement starts on 1 January with an opening balance of 18,240.55, the journal's balance before that statement should be 18,240.55 too, or the statement balances won't chain.

There are two common approaches, and your accountant should choose between them:

  • Import from the very first transaction of the account's life. Rarely practical for older businesses.
  • Post an opening balance as of the migration date, usually as part of the opening balance entry for the whole ledger, and import statements from that date forward.

Either way, the test is simple: the balance Odoo shows for the bank journal at the end of each imported month should equal the statement's closing balance. If it doesn't, the difference is either in the opening balance or in the lines you imported.

Outstanding items at the migration date need care too. Checks you've written that haven't cleared, and deposits recorded but not yet on the statement, should come across as open items so they can be reconciled when they appear on the next statement. Our guide to outstanding checks and deposits in transit explains why they matter.

Credit cards and foreign currency accounts

Credit cards. In Odoo, a company credit card is typically set up as its own bank-type journal. Import its statements the same way. Watch the signs: on a card statement, purchases increase the amount owed. For the import, purchases should usually be negative (money out of the card account) and payments to the card positive. Paying the card from your bank account is then an internal transfer between two journals. Our credit card statement converter page explains how SheetStatement handles card statements.

Foreign currency accounts. If you hold an account in another currency, its journal is set to that currency and you import amounts in the account's own currency, not converted. Odoo handles conversion to your company currency based on its rate settings. Don't mix currencies in one file.

Building a repeatable monthly process

Once the first import works, make the next one boring:

  1. Download the statement PDF on the same day each month.
  2. Convert it and confirm the balance check is zero.
  3. Save the CSV with the standard name in the same folder.
  4. Import into the correct journal with the saved mapping.
  5. Confirm the ending balance in Odoo matches the statement.
  6. Reconcile the lines, adding reconciliation models for anything new and recurring.

A ten-minute routine each month beats a two-day catch-up each quarter. If you've already fallen behind, our guide to catch-up bookkeeping suggests an order to work in.

Tips for ongoing use

  • Keep the PDFs. Store the original statement PDFs alongside the imports for audit and reference.
  • Use one naming convention for files, such as operating-2026-08.csv, so you can see at a glance what's been imported.
  • Reconcile monthly. Leaving lines unreconciled for months makes matching much harder, especially when amounts repeat.
  • Review reconciliation models occasionally. A model that was right last year may be wrong after a price change.

If you're comparing systems or helping clients on several platforms, our guides to importing into Zoho Books and importing into QuickBooks Online cover the equivalent steps elsewhere, and the integrations page lists the export formats SheetStatement supports.

Convert statements for Odoo

Upload a bank statement PDF to SheetStatement, confirm the balance check, and download a CSV or Excel file ready to map in Odoo's import. The free plan covers 3 pages a month, enough to test with a real statement.

FAQ

Which file formats can Odoo import for bank statements?

It depends on your version, edition and installed modules. CSV and Excel through the import tool are widely available, and structured formats such as OFX, QIF and CAMT are often supported. Check Odoo's documentation for your version.

Can I import a PDF bank statement into Odoo?

Not directly in most setups. Convert the PDF to CSV or Excel first, with one row per transaction, real dates and a signed amount, then import that file.

Why does Odoo reject my dates?

The date format in the file doesn't match the import options, or the file mixes formats. Convert all dates to YYYY-MM-DD before saving the CSV.

How do I avoid duplicates with bank synchronization?

Find the earliest date synchronization pulled, and import only statements for dates before it. Import one period at a time and check totals after each.

Should amounts be in one column or two?

One signed column (positive in, negative out) is simplest. If you have debit and credit columns, combine them before import.

What if the imported statement doesn't balance?

Go back to the source file and run the balance check. A missing, duplicated or sign-flipped line in the file is the usual cause.

Can I import several months in one file?

You can, but it's harder to verify and to fix if something goes wrong. One statement period per import makes balance checks and reconciliation much simpler.

Do I need to fill in the partner column?

No. It helps Odoo suggest matches, but a wrong partner is worse than none. Fill it in only where you're confident, and leave the rest blank.

How should I import a credit card statement?

Set the card up as its own bank-type journal and import its statements there, with purchases negative and payments positive. Payments from your bank account to the card are internal transfers.

Is it safe to upload statements to a converter?

See the security page for how SheetStatement processes and stores statements, and review any service's policy before uploading.

How much does SheetStatement cost?

The free plan includes 3 pages a month. Starter is $9 a month, Pro $19 and Business $39.

Related articles

Convert your first statement free

3 pages a month on the free plan. No credit card.