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:
- Fiscal Year — Bangladesh fiscal year is July 1 to June 30. Set this before creating any journal entries.
- Tax Calculation — "Tax included in price" or "Tax excluded from price". Bangladesh invoices typically show tax separately (exclusive). Confirm with your finance team.
- Lock Date — once a period is closed, set a lock date so nobody can post back to it. Critical for audit compliance.
- Default Accounts — set the default income, expense, receivable, and payable accounts. These become the fallback when no specific account is set on a product or contact.
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:
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 Name | Rate | Type | Account |
|---|---|---|---|
| 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.
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:
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 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
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.
Bank & cash journals
Accounting → Configuration → Journals. Create one journal per physical bank account. Bangladesh businesses typically have:
- 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).
- 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.
- 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.
- 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.
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 Name | Structure | Common 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.
- 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.
- 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.
- 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.
- 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.
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.