How to Import a Bank Statement into Odoo (UAE Guide)
Odoo has become one of the most common accounting systems in the UAE — priced for SMEs, VAT-ready, and increasingly the default for trading companies and the firms that keep their books. But Odoo's bank reconciliation is only as good as the transactions inside it, and for most Gulf accounts those transactions arrive the same way they always have: as a PDF statement downloaded from the bank portal.
Odoo cannot read that PDF. It imports structured files — CSV, Excel, OFX, CAMT.053 — which leaves a gap between the document the bank gives you and the rows Odoo needs. This guide closes that gap end to end: converting the statement PDF into a clean, balance-verified CSV or Excel file, importing it into the right bank journal, mapping the columns correctly, and proving afterwards that nothing was lost on the way.
Why the PDF-to-Odoo path hurts
The naive routes are all bad in their own way:
- Retyping. A three-hundred-line statement keyed by hand is hours of work, and every transposed digit or slipped decimal is a reconciliation that will not close later — in a system whose entire matching logic assumes the bank lines are true.
- Copy-pasting from the PDF. Statement PDFs are laid out for reading, not extraction. Pasted tables merge columns, split wrapped descriptions across rows, and scramble Arabic narration. The cleanup usually takes longer than typing.
- Uploading the PDF to a random online converter. This works mechanically, but the file — a client's complete transaction history, with their suppliers, customers, payroll and cash position — is now sitting on someone else's server under someone else's retention policy. For an accounting practice, that is a confidentiality decision being made by default, not on purpose.
There is a fourth failure mode that matters more than the other three: a conversion that is almost right. A dropped row or a debit that landed in the credit column looks fine in a spreadsheet and imports into Odoo without complaint — and then surfaces weeks later as a bank balance that disagrees with the statement, with no obvious culprit. Whatever tool you use for the conversion step, it has to be checkable, not just fast.
Step 1 — Get a clean CSV or Excel file from the PDF
Start from the bank's own PDF — downloaded from online banking or the mobile app, not a scan or a screenshot. A native PDF carries a text layer, which is what makes accurate extraction possible. If the file is password-protected, the covering email states the password formula; our guide to converting password-protected bank statements covers that step in detail.
Then convert it:
- Open the BayanSheet converter in your browser and load the PDF. The first 10 pages are free and no card is required.
- The tool extracts the transaction table — date, description, debit, credit, running balance. For Emirates NBD, FAB, ADCB and Dubai Islamic Bank it applies a hand-tuned template written for that bank's exact layout; for other banks it auto-detects the layout and applies the same checks.
- The reconciliation check runs automatically: opening balance plus total credits minus total debits must equal the printed closing balance, and every row's running balance must follow from the one before it. Anything that does not add up is flagged visibly — never exported silently.
- Download as CSV for the most dependable Odoo import, or Excel (.xlsx) if you want to review and adjust columns first. If your statement carries Arabic narration, the Excel file sidesteps CSV encoding problems entirely.
Nothing is uploaded at any point — the parsing runs as JavaScript inside the browser tab you already have open. You can prove that in fifteen seconds: disconnect your Wi-Fi and convert anyway. A tool that uploads will hang; a browser-based tool keeps working, because nothing needed to be sent.
That reconciliation result is what makes the rest of this guide safe. If the converted file ties to the statement's own printed balances, you are importing a complete, correct set of rows into Odoo — and any discrepancy you find later can only have been introduced by the import itself, which narrows the search enormously.
Step 2 — Shape the file the way Odoo expects
Odoo's bank import wants, at minimum, three things per line: a date, a label (the description), and an amount. Two adjustments make a Gulf statement export import cleanly:
| Column | What Odoo wants | What to do |
|---|---|---|
| Date | One unambiguous format | Safest is ISO YYYY-MM-DD. UAE statements are day-first (DD/MM/YYYY), which importers can misread as month-first — see the warning below |
| Label | One description per row | Keep the full narration, Arabic and English alike, in a single column — it is what you will match against invoices later |
| Amount | A single signed column | Money in positive, money out negative. If your export has separate debit and credit columns, add one column with a simple formula: credit − debit |
| Balance | Optional | Keep it in your working copy for verification even if you do not map it |
⚠️ The date trap that costs the most. In a day-first file,
05/03/2026is the 5th of March; read month-first it becomes May the 3rd — a valid date in the wrong VAT period, with no error raised. Every day of the month from 1 to 12 is silently importable both ways. Convert the column toYYYY-MM-DDbefore importing, or set the date format explicitly in the formatting options Odoo shows during import — and then check the first and last rows regardless.
One more UAE-specific note: if descriptions contain Arabic text and you are saving a CSV out of a spreadsheet editor, choose CSV UTF-8 explicitly. A plain CSV saved with the wrong encoding turns Arabic narration into question marks, and you will only notice after the import.
Step 3 — Import into the bank journal in Odoo
In Odoo, every bank account is a journal, shown as a card on the Accounting dashboard. Import into the journal for the account the statement belongs to — currency and all. For a UAE account that journal should be in AED; importing dirham transactions into a journal set to another currency is a mess to unwind.
The flow in current Odoo versions:
- Open Accounting and find the bank journal's card on the dashboard.
- Use the journal's import option — recent versions show an Import File action on the card itself or under the card's menu; you can also open the journal's transaction list and import records from there. Odoo accepts CSV and Excel through its import wizard, plus OFX and CAMT.053 files if your bank offers those downloads (in the Gulf, most do not for every account — which is why the CSV route is the one that always works).
- Select your file. Odoo reads the first rows and auto-maps columns to fields based on your headers — check every mapping rather than trusting the guess, especially date and amount.
- Open the formatting options if anything looks off: this is where you set the date format and the decimal separator explicitly.
- Use Odoo's test option before committing. It validates the file and reports problems — a malformed date, a non-numeric amount — while the fix still costs you nothing.
- Run the import. The lines land in the journal as bank transactions, ready for matching.
✅ Import one month first. Reconcile it before loading a whole quarter or year. If the column mapping or date format is wrong, you want to find out across 40 rows, not 500. Odoo remembers your mapping, so the second import is faster than the first.
Watch for duplicates on repeat imports: overlapping date ranges are the most common cause, usually created when a month is re-imported to fix a few rows. Import clean, non-overlapping periods and keep a note of the last date imported per account.
Step 4 — Verify the ending balance against the printed statement
This is the step that turns an import from "probably fine" into "known correct", and it takes two minutes.
After the import, open the bank journal and compare, against the PDF in front of you:
- Row count — the number of imported lines matches the number of transactions on the statement.
- Period totals — total money in and total money out agree with the statement's totals, if it prints them.
- Ending balance — the journal's balance in Odoo after the imported period equals the closing balance printed on the statement, to the fils.
The governing equation is the same one BayanSheet already checked at conversion time:
Opening balance + total credits − total debits = closing balance
Because the converted file was reconciled against the printed balances before import, a mismatch at this stage can only mean something went wrong in the import itself — a duplicated file, an overlapping range, a misread date format that pushed rows out of the period. That is a short list, and each item on it takes seconds to check. Without the earlier reconciliation you would be searching the extraction and the import at once, across every row.
For the broader method — the checks worth running on any converter's output before you trust it — see how to verify a bank statement converter.
Common mistakes
- Importing a file whose dates Odoo guessed month-first — check the first and last rows every time.
- Mapping a debit column as the amount and leaving credits behind, or importing amounts with the wrong sign convention.
- Importing into the wrong journal, or into a journal whose currency is not AED.
- Re-importing an overlapping date range and creating duplicates.
- Skipping the ending-balance check because the transaction list "looks complete".
- Keeping only the Excel file and deleting the bank's original PDF — the PDF stays the record of authority at a Federal Tax Authority audit; the spreadsheet is only the working copy.
Conclusion
Getting a UAE bank statement into Odoo is a two-stage job: convert the PDF into a clean, reconciled CSV or Excel file, then import it into the right bank journal with the date format and amount signs mapped deliberately. The conversion step decides everything downstream — which is why it should happen in your own browser, with the output checked against the statement's own printed balances before a single row reaches Odoo.
Try it on one statement: open the BayanSheet converter, load the PDF, and compare the reconciliation result to the closing balance on the page in front of you. The first 10 pages are free, no card required, paid credits never expire — and if your bank's layout gives the auto-detection trouble, the founder personally tunes layouts on request. For more guides, browse the BayanSheet blog.
Frequently asked questions
Can Odoo import a bank statement directly from a PDF?
No. Odoo's bank import reads structured files — CSV, Excel, OFX and CAMT.053 — not the PDF a UAE bank gives you. The PDF has to be converted into rows and columns first. BayanSheet does that conversion inside your browser, reconciles the extracted rows against the statement's own printed balances, and exports a CSV or Excel file that Odoo's import wizard can map in one pass.
What file format is best for importing bank transactions into Odoo?
CSV is the most dependable choice for a converted statement, and Odoo's import wizard also accepts Excel (.xlsx). Odoo additionally supports OFX and CAMT.053, but Gulf banks rarely offer those downloads for every account, so a clean CSV built from the PDF statement is the route that always works. If your descriptions contain Arabic text, make sure the CSV is saved as UTF-8, or use the Excel file to avoid encoding problems entirely.
Why did Odoo import my dates into the wrong month?
UAE statements print dates day-first (DD/MM/YYYY), and an importer that guesses month-first will silently turn 05/03 into May 3rd instead of March 5th — every day at or below 12 imports as a valid but wrong date. The safe fixes are to convert the date column to ISO format (YYYY-MM-DD) before importing, or to set the date format explicitly in the formatting options Odoo shows during import, then check the first and last rows after mapping.
How do I check the import into Odoo was complete and correct?
Compare three numbers against the printed statement: the row count, the total money in and out for the period, and the bank journal's ending balance in Odoo versus the closing balance printed on the PDF. If the ending balance matches the statement to the fils, no row was dropped and no amount was misread badly enough to matter — that is arithmetic, not a feeling. BayanSheet runs the same opening-plus-credits-minus-debits check on the converted file before you ever reach Odoo, so a discrepancy at the Odoo end points at the import step, not the extraction.
Is it safe to convert a client's bank statement before importing it into Odoo?
It depends entirely on where the conversion runs. A converter that uploads the PDF to its own server copies your client's full transaction history — suppliers, payroll, cash position — onto infrastructure you do not control. BayanSheet parses the PDF with JavaScript inside your own browser, so the file never leaves your device; you can prove it by switching off your Wi-Fi and converting anyway. For a practice bound by client confidentiality, that difference is the whole decision.