Technical Lab · 0014

Odoo Accounting setup for Bangladesh — chart of accounts & fiscal positions.

How to configure Odoo's accounting engine for Bangladesh: COA structure, fiscal positions for domestic and export, bank journals, payment terms, and the NBR VAT compliance hooks every deployment needs.

Accounting configuration is the most consequential setup decision in any Odoo deployment — and the one most often rushed. In Bangladesh, the stakes are higher than most: a wrong fiscal position means VAT is miscalculated on every transaction. A wrong COA account code means your tax return doesn't reconcile with the system. A wrong costing method (set here, at the accounting layer) means inventory values are untrustworthy from day one.

This guide follows the setup sequence I use in every Bangladesh deployment: install, COA, taxes, fiscal positions, journals, payment terms, opening balances — in that order. Do not skip ahead.

Accounting configuration errors compound silently. One wrong account code produces thousands of wrong journal entries before anyone notices.

Why accounting setup must come first

Every other Odoo module posts journal entries. Inventory movements create stock valuation entries. Manufacturing Orders move costs from raw materials through WIP to finished goods. Sales orders create receivables. Purchase orders create payables. None of these work correctly unless the accounts they post to exist and are correctly typed.

The consequence of setting up inventory before accounting: you will need to reverse stock valuation entries, correct account assignments on product categories, and reconcile opening balances — work that takes days. Set up accounting first, and every other module flows into a correctly structured financial ledger from the first transaction.

Installing the Accounting module

Apps → Accounting → Install. This also installs Invoicing. If you also need multi-currency (required for exporters), go to Settings → Accounting → Currencies and activate the currencies you trade in (USD, EUR, GBP are most common for Bangladesh exporters). Set BDT as the company currency.

Under Settings → Accounting, configure:

Chart of Accounts for Bangladesh

Odoo installs a generic COA when you activate Accounting. You must customise it for Bangladesh. The standard Bangladesh COA structure follows this grouping:

CodeAccount NameNotes
1000AssetsCurrent + fixed assets
1100Cash & BankOne account per bank account
1200Accounts ReceivableTrade debtors — link to AR reconciliation
1300Advance to SuppliersCommon in Bangladesh — vendor advances
1400Inventory / StockSet per product category costing method
1500VAT Creditable InputInput VAT on purchases — reconciled monthly
1600AIT Receivable (TDS)Tax deducted at source on receipts
2000LiabilitiesCurrent + long-term liabilities
2100Accounts PayableTrade creditors — link to AP reconciliation
2200VAT Payable (Output)15% VAT collected on sales — remitted to NBR
2300TDS PayableAIT deducted from vendor payments
2400Salaries & Benefits PayableAccrued payroll — HR module posts here
3000EquityShare capital + retained earnings
4000RevenueSales by category (domestic, export)
4100Domestic SalesVATable sales in Bangladesh
4200Export SalesZero-rated; separate for tax return
5000Cost of Goods SoldManufacturing & inventory COGS
6000Operating ExpensesAdmin, selling, finance charges
Key accounts to add

Odoo's generic COA misses three accounts that Bangladesh businesses need: Advance to Suppliers (vendor advances paid before delivery — very common in local procurement), AIT Receivable (TDS withheld from your receipts by customers), and TDS Payable (AIT you must deduct from vendor payments). Add all three before go-live.

Tax configuration

Accounting → Configuration → Taxes → New. Bangladesh requires the following tax records at minimum:

Tax NameRateTypeAccount
VAT 15% (Sales) 15% Sales 2200 — VAT Payable
VAT 15% (Purchase) 15% Purchase 1500 — VAT Creditable Input
VAT 0% Export (Sales) 0% Sales None (zero-rated)
AIT 3% (Purchase) 3% Purchase (withholding) 2300 — TDS Payable
AIT 5% (Service — Purchase) 5% Purchase (withholding) 2300 — TDS Payable

For each tax, ensure the tax computation is "Percentage of Price" and the tax account is correctly mapped. Odoo posts one journal entry line per tax on every invoice. If the account is wrong, VAT reconciliation with NBR returns will not work.

NBR compliance link

For the full Mushak form setup and VAT reporting workflow in Odoo, see my detailed guide on NBR VAT compliance in Odoo Bangladesh. That guide covers Mushak 6.1, 6.2, 6.3, and 9.1 — the most commonly required forms for Bangladesh businesses.

Fiscal positions

Fiscal Positions are Odoo's mechanism for automatically applying the right taxes and account mappings based on who you're selling to or buying from. They are the most underused configuration feature in Bangladesh deployments — and the source of most tax errors.

Create at least these three fiscal positions:

Default

Domestic — VATable

  • Tax mapping: VAT 15% Sales → VAT 15% Sales (no change)
  • Assign to all Bangladesh-registered customers
  • Revenue account: 4100 Domestic Sales
  • Triggers Mushak 6.3 (delivery challan) on outgoing shipments
Export / Zero-rated

Export — Zero VAT

  • Tax mapping: VAT 15% Sales → VAT 0% Export
  • Assign to all foreign customers and EPZ entities
  • Revenue account: 4200 Export Sales
  • No Mushak 6.3 — export documentation applies instead
Special

VAT-exempt

  • Tax mapping: VAT 15% → None (removes tax line)
  • Assign to NBR-exempt counterparties (e.g., agricultural cooperatives)
  • Keep account on main revenue code — exemption is on tax only
  • Document the NBR exemption certificate number on the contact record

Assign fiscal positions on the contact (customer/supplier) record — Accounting tab → Fiscal Position. Odoo applies the correct tax automatically on every invoice and purchase order for that partner. If a customer sometimes buys domestically and sometimes exports, create separate contact records or set the fiscal position per order.

Note · Export-oriented trading companyDiscovered in a VAT review
A trading company came to me after their accounts team noticed the VAT Payable balance climbing on sales that should have been zero-rated. The cause was a single missed step: foreign buyers had been created as contacts with no fiscal position assigned, so Odoo fell back to the default 15% domestic VAT on every export invoice. Nothing in the workflow flagged it — the invoices looked normal. Assigning the Export fiscal position is not optional cleanup; it is the control that keeps your VAT return reconcilable. We corrected the contacts, re-issued the affected invoices, and built a master-data checklist so no new buyer is saved without a fiscal position.

Bank & cash journals

Accounting → Configuration → Journals. Create one journal per physical bank account. Bangladesh businesses typically have:

  1. BDT current account — main operating account. Journal type: Bank. Currency: BDT. Set the bank account number and bank name. Connect to bank statement import if you do bank reconciliation in Odoo (recommended for all businesses with >50 transactions/month).
  2. USD / foreign currency account — for exporters receiving payments in USD, EUR, or GBP. Journal type: Bank. Currency: USD (or the relevant foreign currency). Odoo auto-converts to BDT at the transaction rate. Exchange gain/loss posts automatically to the accounts you configure.
  3. Petty Cash — Journal type: Cash. Set a maximum float and a responsible user. Petty cash transactions should be entered daily and reconciled weekly in Bangladesh operations — cash leakage is a common audit finding.
  4. LC (Letter of Credit) journal — for businesses using LCs, create a separate bank journal to track LC utilisation. This makes it straightforward to report total LC exposure to the bank at month-end.
Multi-currency note

If you maintain a foreign currency bank account, enable Settings → Accounting → Multi-Currencies → Automatic Currency Rate Update. Link to the Bangladesh Bank official rate feed or update manually monthly. Exchange rate differences are a significant line item in export-oriented Bangladesh P&Ls — don't let Odoo use a stale rate.

Payment terms

Accounting → Configuration → Payment Terms. Create the terms that match your actual contracts. Bangladesh-specific terms to configure:

Term NameStructureCommon use
Immediate 100% on invoice date Cash sales, advance payments
Net 30 100% due 30 days after invoice Domestic B2B credit sales
Net 60 100% due 60 days after invoice Large domestic distributor terms
LC at Sight 100% on document presentation Export LC — payment on presentation of shipping docs
LC 90 Days DP 100% due 90 days after LC date Deferred payment LC for export buyers
50% Advance + 50% on Delivery 50% on invoice date + 50% on delivery Local custom manufacturing orders

Setting payment terms correctly means Odoo's Aged Receivables and Aged Payables reports become accurate — essential for cash flow management and banking relationships in Bangladesh.

Opening balances

Before you go live, import opening balances from your previous accounting system. In Odoo, this is done by posting a journal entry dated the day before go-live, with the closing balances of every account in your old system as the opening figures.

  1. Extract trial balance from your old system as of the go-live date minus one day. Every account with a non-zero balance must be included.
  2. Create a journal entry in Odoo — Accounting → Journal Entries → New. Date: go-live date minus 1 day. Reference: "Opening Balances — [Date]". Add one line per account.
  3. Validate the entry — the entry must balance (debits = credits). If it doesn't, one account is missing. The most common missing account is "Opening Retained Earnings" — the cumulative net of all prior years.
  4. Reconcile open items — for Accounts Receivable and Payable, mark the individual open invoices and bills in Odoo (or import them as draft documents) and reconcile against the opening balance entry. This makes the Aged Receivables accurate from day one.

The opening balance step typically takes 3–5 days for a mid-size Bangladesh company. For the full cost and effort breakdown, see my Odoo ERP cost guide — data migration and opening balances account for a larger share of the project budget than most clients expect. To put a number on your own project, try the Odoo cost estimator.

Next step

Accounting setup for Bangladesh is part of every implementation I scope. If you're unsure whether your COA structure is correct for NBR compliance or your fiscal positions are mapped correctly, let's run a 30-minute configuration review →

Frequently asked questions

Does Odoo have a Bangladesh Chart of Accounts template?

No — Odoo does not ship a pre-built Bangladesh COA. The generic COA installed with the Accounting module needs customisation: add NBR-specific VAT and AIT accounts, split revenue into domestic and export, and add the advance-to-supplier and TDS accounts that Bangladesh operations require. The setup takes 4–8 hours for a standard Bangladesh SME.

How do I configure VAT for Bangladesh in Odoo?

Create Tax records for 15% Sales VAT (posting to VAT Payable), 15% Purchase VAT (posting to VAT Creditable Input), and 0% Export VAT. Then create Fiscal Positions that map the correct tax to each customer type — domestic gets 15%, export gets 0%, VAT-exempt gets no tax. Assign fiscal positions to customer records, and Odoo applies the correct tax automatically on every invoice.

What fiscal positions should I create for Bangladesh?

Minimum three: Domestic (standard 15% VAT), Export (zero-rated, triggers different documentation flow), and VAT-exempt (removes VAT entirely for NBR-exempt counterparties). Exporters with EPZ customers need a fourth position for EPZ-specific treatment. Assign the correct position to each customer and supplier record during master data setup — this is one step you cannot skip.

How do I handle AIT (Tax Deducted at Source) in Odoo?

Configure AIT as Purchase withholding taxes at the rates applicable to your procurement categories (typically 3% for goods, 5% for services). On vendor bills, Odoo deducts the AIT and posts to your TDS Payable account automatically. At month-end, pay the TDS Payable amount to the revenue authority. For income received with AIT deducted by customers, create a separate AIT Receivable account and reconcile against your tax certificates.