Trading company ERP has a reputation for being simpler than manufacturing ERP. That is partially true — there are no BOMs, no production orders, no work centres. But trading ERP has its own complexity that is consistently underestimated: multi-currency procurement from multiple countries, import duty and landed cost allocation, multi-tier customer pricing across hundreds of SKUs, multi-location stock management, and the cash flow discipline of LC-based import financing.
Bangladesh trading companies that I have worked with often come to Odoo from two different starting points: either they are coming from Tally (and need real inventory management and credit control), or they are coming from a custom-built system (and need scalability and process standardization). Either way, the same Odoo configuration applies. This guide covers it from scratch.
For the purchase module configuration that applies across all industries, see the Odoo purchase and vendor management guide. For multi-company or multi-branch setups, see the Odoo multi-company setup guide.
A trading company lives on margin and cash flow. ERP that cannot tell you your gross margin on every sales order and your AP outstanding by supplier is not ERP — it is a digital ledger.
Trading vs manufacturing ERP: what's different
Understanding the difference helps you configure Odoo correctly rather than carrying over assumptions from manufacturing implementations:
- No Manufacturing module: Trading companies buy finished goods and sell them. No BOMs, no production orders, no work centres. Odoo's Manufacturing module is not installed. This simplifies the setup significantly.
- Import procurement is the most complex workflow: The equivalent of "manufacturing" complexity in a trading company is the import procurement cycle — supplier negotiation, LC application, shipment tracking, Bill of Entry, landed cost allocation, and goods receipt. This is where most configuration effort goes.
- Pricing is by customer tier, not by product cost: Trading companies set prices by customer type (retail vs distributor vs key account vs export) and often change prices seasonally or when landed costs change. Odoo's pricelist system is essential and must be configured carefully.
- Inventory is the primary asset: For a trading company, inventory turns and stock aging are the most important operational metrics. Slow-moving stock is a capital problem. Odoo's inventory aging report and stock turn analysis are primary reports, not secondary.
- Credit management is critical: Trading companies extend credit to distributors and retailers. Odoo's credit limit enforcement and AR aging report must be configured and actively used — not as an afterthought.
Odoo modules for a Bangladesh trading company
Multi-warehouse setup
Enable multi-warehouse in Inventory → Configuration → Settings → enable "Storage Locations" and "Multi-Step Routes". Then create one Odoo Warehouse per physical storage location:
- Central Warehouse (e.g., Dhaka): The main receiving warehouse. Most import shipments are received here. Products are dispatched to branches from this warehouse or directly to Dhaka customers.
- Regional branches (Chittagong, Sylhet, Rajshahi): Each branch is a separate Odoo warehouse. Stock is transferred from the central warehouse based on branch replenishment requests or automatic reordering rules.
- Transit location: When stock is being transferred from the central warehouse to a branch, it moves through a virtual "In Transit" location. This represents the period when goods are in a delivery truck en route. Odoo creates the in-transit location automatically for inter-warehouse transfers.
For each warehouse, configure:
- Incoming shipments: 2-step receiving (Receive → Quality Check/Validate into Stock) for import goods that need inspection. 1-step for trusted local suppliers.
- Outgoing deliveries: 2-step dispatch (Pick from Stock → Deliver to Customer) for large warehouses with separate picking and dispatch teams. 1-step for branch deliveries.
- Responsible person: Assign a warehouse manager as the responsible user. This person receives activity notifications for transfers, low-stock alerts, and expiry warnings for that warehouse.
Import procurement workflow
Managing the LC lifecycle in Odoo: record the LC number, issuing bank, LC amount, and expiry date on the Purchase Order using the "Customer Reference" field and scheduled activities. Create a recurring activity reminder 30 days before LC expiry to check shipment status. If the shipment is delayed and the LC needs amendment, record the amendment as a chatter message on the PO with the revised expiry date.
| LC Stage | What happens | In Odoo | Key date to track |
|---|---|---|---|
| LC Application | Company applies to bank for import LC in favour of supplier | Purchase Order confirmed. LC number added to PO reference field. | LC issue date |
| Shipment | Supplier ships goods before LC shipment deadline. Bills of Lading sent to buyer's bank. | Record expected arrival date on PO. Set activity reminder for arrival date − 3 days. | LC latest shipment date |
| Document Presentation | Supplier's bank presents shipping documents to buyer's bank within the document presentation period (usually 21 days from B/L date). | Attach B/L and commercial invoice PDF to PO chatter. | Document presentation deadline |
| Goods Arrival & Clearance | Goods arrive at Chittagong port. Customs broker files Bill of Entry. Duty assessed and paid. | Record B/E number and duty amount as notes on the PO. | B/E date (for duty drawback if applicable) |
| GRN in Odoo | Goods physically received in warehouse. Inspection done. GRN validated in Odoo. | Validate Purchase Receipt in Odoo. Landed costs applied after. | GRN date = inventory valuation date |
| Bank Payment | LC retires — payment made to supplier's bank from company's account. | Vendor bill posted in Odoo. Payment registered against the bill. | LC maturity / payment due date |
Landed costs configuration
Landed costs are the single most important configuration for a trading company's inventory valuation accuracy. Without landed costs applied correctly, your product costs in Odoo reflect only the CIF invoice price — not what you actually paid to land the goods in your warehouse. This means your margin calculations are wrong.
Enable landed costs: Inventory → Configuration → Settings → Valuation → enable "Landed Costs". Also ensure your product category's costing method is set to "Average Cost (AVCO)" or "First In First Out (FIFO)" — Standard Price does not reflect landed cost adjustments accurately for imported goods.
Typical landed cost items for a Bangladesh importer:
- Customs Duty: Assessed on the assessable value (generally CIF value). Rate varies by HS code — 0% to 25% for most goods, up to 150% for some consumer goods. Record the duty in BDT as a landed cost line.
- Supplementary Duty (SD): Applies to certain categories (luxury goods, tobacco, etc.). Add as a separate landed cost line if applicable.
- Advance Income Tax (AIT): Collected at import stage (typically 5% of assessable value for registered importers). This is an advance payment of corporate income tax — it is NOT a cost to be included in product landed cost. Post it as a debit to "AIT Receivable" or "Tax Asset" account instead, not as a landed cost against inventory.
- C&F Charges: If goods are purchased on FOB terms (supplier cost excludes freight), add international freight and insurance as a landed cost. If purchased on CIF, these are already in the invoice price.
- Local Freight: Trucking from Chittagong port to Dhaka warehouse. Typically BDT 15,000–40,000 per 20-foot container depending on route and carrier.
- Customs Broker/Clearing Agent: C&F agent fees for handling the Bill of Entry, port documentation, and delivery order. Typically BDT 8,000–20,000 per shipment.
- Port and Handling Charges: THC, container demurrage (if customs clearance is delayed), and port delivery order fees.
Customer pricing and margin management
Enable pricelists in Sales → Configuration → Settings → Pricing → enable "Pricelists" and "Discount" if you want to show both list price and discount on the invoice.
Configure margin monitoring: Sales → Configuration → Settings → enable "Margins". This adds a "Margin" column to every sales order and the sales analysis report. Set a company-wide minimum margin alert: go to Sales → Products and set a "Cost" on each product (this should match or be pulled from the product's average landed cost). When a salesperson tries to sell below the minimum margin, Odoo shows the margin in red as a warning.
Credit limit enforcement: In the customer's Accounting tab, set a Credit Limit (e.g., BDT 500,000). In Accounting → Configuration → Settings, enable "Lock" customer sales when credit is exceeded. When a customer's outstanding AR balance exceeds their credit limit, Odoo blocks new deliveries for that customer until the outstanding balance is reduced. This prevents the common Bangladesh trading company problem of unlimited credit accumulation with distributors.
Stock replenishment
Configure automatic replenishment using Odoo's reordering rules to avoid both stockouts (lost sales) and overstock (working capital trap):
- Min/Max reordering rules: For fast-moving SKUs, set Minimum Qty (the stockout trigger level) and Maximum Qty (the target stock level after replenishment). When stock drops below Minimum, Odoo generates a draft PO or internal transfer automatically in the daily replenishment scheduler run.
- Reorder point = average daily sales × lead time + safety stock: For an item that sells 50 units/day and has a 30-day import lead time, the reorder point should be 50 × 30 = 1,500 units, plus safety stock (e.g., 15 days = 750 units), for a minimum of 2,250 units. The maximum order quantity depends on your cash flow and storage capacity.
- Vendor lead times: Set vendor lead times on each product's vendor pricelist entry. Odoo uses this to calculate the expected delivery date on the draft PO and to alert if current stock will be insufficient before the replenishment arrives.
- Make-to-Order (MTO) for slow-moving items: For slow-moving or expensive items that you do not want to hold in stock speculatively, use the MTO route. When a customer sales order is confirmed, MTO automatically generates a draft PO to order the item — it is not purchased until there is a confirmed customer order. This eliminates slow-moving stock risk for low-velocity items.
Bangladesh trading company — specific configuration notes
- TDS on purchases (AIT Section 52): Under Bangladesh Income Tax law, companies are required to deduct TDS (Tax Deducted at Source, also called Withholding Tax) on payments to suppliers for certain categories: goods supply (up to 3–7% depending on supplier registration status), services (10–15%). In Odoo, configure TDS as a tax with "Tax Group = TDS" and a negative amount (it reduces the payment to the supplier). When the vendor bill is posted, TDS appears as a deduction. The company remits the TDS to NBR within 15 days of the following month. Odoo's tax report for the TDS tax group gives you the monthly TDS payable amount.
- Mushak (Bangladesh VAT) on domestic sales: Domestic sales of most trading goods attract 15% VAT. Configure a 15% output VAT tax in Odoo's Tax configuration. Each sales invoice must show the Mushak invoice number (BIN number, customer BIN, HS code). Configure a custom invoice QWeb report that includes these fields. For VAT-exempt goods (certain essential commodities), configure a 0% tax with tax group "VAT Exempt" — this keeps the transaction recorded without charging VAT, and it appears correctly on the VAT return.
- Multi-currency management: Import trading companies deal in multiple currencies: USD for most imports, CNY for China-sourced goods, EUR for European imports, and BDT for domestic costs. Enable multi-currency in Accounting → Configuration → Settings → Currencies. Set a currency rate update schedule (daily for USD/BDT from Bangladesh Bank's official rate). When you post a USD vendor bill and pay in BDT, Odoo automatically calculates the exchange difference (gain or loss) based on the rate difference between invoice date and payment date, and posts it to a Foreign Exchange Gain/Loss account.
- Distributor management: Many Bangladesh trading companies manage a distributor network with performance incentives (quarterly rebates, volume bonuses). Configure these as manual credit notes issued at the end of each quarter, rather than trying to build automatic rebate calculations into the pricelist. Keep pricing simple and manage incentives through manual entries with clear descriptions.
The highest-value configurations for a Bangladesh trading company in Odoo are: landed cost allocation (so your margin is real, not based on CIF price alone), multi-tier pricelists (so pricing is consistent and margin-monitored), and credit limit enforcement (so AR aging does not spiral out of control). These three configurations directly address the three most common financial management failures in Bangladesh wholesale businesses. To budget the licensing and rollout for your business, try the Odoo cost estimator. Need help configuring Odoo for your trading business? Get in touch →
Frequently asked questions
What Odoo modules does a trading company in Bangladesh need?
Core modules: Inventory (multi-warehouse stock), Purchase (vendor management, GRN, landed costs), Sales (customer orders, pricelists, credit control), Accounting (Bangladesh VAT, TDS, multi-currency, financial statements). Optional: CRM for sales pipeline, Expenses for sales team costs. Manufacturing is not needed for pure trading. Total initial setup is simpler than a manufacturer but pricing and procurement configurations are more complex — plan for 4–6 weeks of configuration and training for a mid-size trading company (5–15 users, 3 warehouses, 500+ SKUs).
How to set up multiple warehouses in Odoo for a Bangladesh trading company?
Enable "Storage Locations" and "Multi-Step Routes" in Inventory settings. Create one Odoo Warehouse per physical location (Dhaka head office, Chittagong branch, etc.). Each warehouse gets its own receipt, dispatch, and transfer sequences. Configure incoming shipments as 2-step for imported goods needing inspection, 1-step for trusted local suppliers. Inter-warehouse stock transfers create an "In Transit" movement that shows in-transit quantity separately from on-hand stock at either warehouse. Assign a responsible manager per warehouse for alert notifications.
How to apply landed costs to imports in Odoo Bangladesh?
Go to Inventory → Operations → Landed Costs → New. Select the purchase receipt, add cost lines for customs duty, local freight, and clearing agent fees. Choose splitting method (By Value recommended for most goods). Validate — Odoo adjusts the product's average cost to include these charges. AIT at import is NOT a landed cost — post it to an AIT Receivable (tax asset) account instead. Ensure your product category uses AVCO or FIFO costing (not Standard Price) for landed costs to update the product cost correctly.
How to manage customer pricing for a trading company in Odoo?
Enable Pricelists in Sales settings. Create pricelists for each tier: Retail (full price), Distributor (−15%), Key Account (−22%), Export (USD pricing). Assign pricelist to the customer's Contact record — it applies automatically on all sales orders for that customer. Enable Margins in Sales settings and set product costs from landed cost data. Monitor margin per sales order and use the Margin Analysis report to identify low-margin products or customers. Configure credit limits per customer in their Accounting tab to enforce payment discipline.