Bangladesh has eight Export Processing Zones managed by BEPZA, plus a growing number of Special Economic Zones under BEZA. For factories inside these zones, the duty-free import privilege is their most significant cost advantage — but it comes with strict tracking obligations. BEPZA auditors can arrive unannounced and demand a reconciliation of every kilogram of raw material imported, consumed, and exported.
Most EPZ factories I've worked with track this in Excel. When I ask for the reconciliation between bonded raw material imports and finished good exports for the past six months, the answer is usually three days of manual calculation. Odoo can produce that answer in three minutes — if it's configured correctly from day one.
BEPZA compliance isn't about paperwork. It's about having a live, reconcilable record of every gram of bonded raw material from port arrival to export vessel.
EPZ vs SEZ vs bonded warehouse — key differences
EPZ (Export Processing Zone)
- 8 zones: Chittagong, Dhaka, Mongla, Comilla, Ishwardi, Uttara, Adamjee, Karnaphuli
- 100% export-oriented — cannot sell to local market without permission
- Duty-free import of raw materials, machinery, spare parts
- No VAT on imports consumed in production
- Monthly Progress Report (MPR) to BEPZA
- Annual utilisation declaration
- Strong physical infrastructure — dedicated customs posts on-zone
SEZ (Special Economic Zone)
- Newer framework — expanding across Bangladesh
- Can accommodate both export and (limited) domestic-oriented industries
- Similar duty concessions to EPZ but governed by BEZA Act 2010
- More flexible zone governance — private SEZ developers possible
- Compliance reporting to BEZA rather than BEPZA
- Income tax holiday periods on investment
Bonded Warehouse (Off-Zone)
- Available to 100% export-oriented factories located outside EPZ/SEZ
- Licensed by NBR Customs Bonding Commissionerate
- Duty-free import under bonded warehouse license
- Quarterly reconciliation statement to Customs
- On-site customs inspection for export clearance
- Available to RMG, textile, footwear, and other export sectors
The Odoo configuration principles in this guide apply to all three frameworks. The specific reporting format (BEPZA MPR vs BEZA vs NBR Customs bond reconciliation) differs, but the underlying inventory tracking logic in Odoo is identical.
BEPZA compliance obligations
Every EPZ factory must maintain and report:
| Obligation | Frequency | What BEPZA requires |
|---|---|---|
| Monthly Progress Report (MPR) | Monthly (by 10th) | For each raw material: opening stock, imports during month, consumption during month, closing stock. For finished goods: production quantity, export quantity, closing stock. |
| Annual Utilisation Declaration | Annually (after financial year close) | Full-year reconciliation of all duty-free imports against finished goods exported. Surplus raw material (unused) requires explanation or duty payment. |
| BEPZA Inspection | On demand (unannounced) | Physical stock count of bonded raw materials, in-process goods, and finished goods awaiting export. Stock must match the bonded ledger. |
| Export proof submission | Per shipment | Bill of Export and Bill of Lading copies submitted to BEPZA to discharge the bonded liability for each shipment's raw material consumption. |
Bonded warehouse setup in Odoo
Create a dedicated bonded warehouse (or location)
Go to Inventory → Configuration → Warehouses → New. Name it: EPZ Bonded Warehouse or Bonded Store. If you operate one physical facility but want to segregate bonded from domestic stock, create a child location instead: Inventory → Configuration → Locations → [your main warehouse] → New Child: Bonded Raw Material Store.
Mark the location with a custom note or use Odoo's location type. The key constraint: all duty-free imports go to this location. Nothing else should enter the bonded location without a customs-cleared purchase receipt.
Tag raw material products as "Bonded"
Create a product category called Bonded Raw Materials and assign it to all products that are imported duty-free. This makes it easy to filter inventory reports, landed cost allocations, and valuation reports by bonded status. Also enables future custom reporting for the MPR.
Configure two-step receipts for bonded imports
Enable multi-step receipts in the bonded warehouse: Inventory → Configuration → Warehouses → [Bonded WH] → Incoming Shipments: Receive + Quality Check (2 steps). This creates a quarantine step where bonded imports are held pending quantity and quality verification before entering the bonded stock. Customs officers often verify quantities at this stage — the Odoo quarantine location maps to this inspection area.
Enable lot/serial tracking for bonded materials
Turn on lot tracking for bonded raw materials: on the product record → Inventory tab → Tracking: By Lot. Assign each import consignment a lot number matching the LC number or Bill of Lading number. This provides a per-consignment audit trail — critical for BEPZA inspections where they may check a specific shipment's utilisation.
Duty-free raw material procurement
The bonded raw material flow from import to bonded stock:
In Odoo, when creating the Purchase Order for bonded raw materials:
- Set the delivery location to the Bonded Raw Material Store — not the general warehouse. On the PO → "Deliver To" field or the receipt operation type destination location.
- Apply the "EPZ Bonded Import" fiscal position to the vendor (see fiscal position section below). This maps import taxes to a suspended duty account rather than expensing them immediately.
- Record landed costs for C&F charges, port fees, and freight — but NOT for customs duty (which is suspended under the bonded license). Only the freight and handling components of the landed cost apply. Post landed costs to the bonded stock to get accurate cost-per-unit of bonded raw material.
- Assign a lot number matching the LC or Bill of Lading number when validating the receipt. This is the consignment reference that BEPZA will ask about during inspection.
Manufacturing consumption tracking
The Manufacturing Order (MO) is where bonded raw material consumption is recorded in Odoo. This is the most critical data point for BEPZA compliance — it links the bonded input to the finished goods output.
- Bill of Materials (BOM) — configure the BOM for each product with the bonded raw materials as components. Specify the quantities per unit (e.g., 1.2 kg cotton yarn per kg knitted fabric, allowing for standard wastage). The BOM-based quantity is what BEPZA's utilisation norm allows.
- Source location on MO — when creating the Manufacturing Order, set the raw material source location to
Bonded Raw Material Store. This ensures that consumption posts from the bonded location, not general stock — keeping your bonded inventory balance accurate. - Wastage tracking — BEPZA allows a wastage norm per product type (e.g., 3–5% yarn wastage for knitwear, negotiated with BEPZA). Configure wastage in the BOM as a "component" with a scrap route, or use Odoo's scrap order to record actual production waste and post it to a "Bonded Wastage" location. Document the norm in your BEPZA license — don't exceed it without prior approval.
- Backflush vs real-time consumption — for high-volume EPZ knitwear factories, backflushing (recording consumption when MO is completed, not in real-time) is more practical. Validate this is acceptable with your operations team and BEPZA auditor before implementing.
BEPZA Monthly Progress Report (MPR) data from Odoo
The MPR requires the following data for each raw material (yarn, fabric, accessories, etc.):
| MPR field | Odoo report / source | How to extract |
|---|---|---|
| Opening Stock (1st of month) | Inventory Valuation Report | Inventory → Reporting → Inventory Valuation → filter: location = Bonded Store, date = first day of month |
| Imports during month | Purchase Receipts | Inventory → Reporting → Moves → filter: location_dest = Bonded Store, date range = month. Group by product. |
| Consumption during month | Manufacturing Orders | Manufacturing → Reporting → Production Analysis → filter: source location = Bonded Store, date range = month. Raw material consumed per product. |
| Closing Stock (last day) | Inventory Valuation Report | Same as opening stock filter but with last day of month as date. |
| Finished goods exported | Delivery Orders | Inventory → Reporting → Moves → filter: operation type = Export Delivery, date range = month. Group by product. |
Odoo does not generate a formatted BEPZA MPR PDF. The standard workflow is: pull the above data from Odoo's reporting → paste into the BEPZA MPR Excel template (available from BEPZA) → submit. For factories with 20+ raw material SKUs, this is a significant monthly effort — a custom Odoo MPR module can automate the data extraction and formatting, reducing the process from 4 hours to 15 minutes.
Fiscal position for EPZ/bonded imports
For EPZ and bonded warehouse factories, customs duty on raw material imports is suspended — not waived. It remains a contingent liability until you provide export proof. The fiscal position in Odoo models this correctly:
Create a fiscal position: EPZ Bonded Import — Duty Suspended
Tax mapping in this fiscal position:
- Customs Duty 25% → map to a 0% tax with account =
Suspended Customs Duty (Liability) - Supplementary Duty → map to 0% with account =
Suspended SD (Liability) - VAT on Import 15% → map to 0% (VAT is also suspended on bonded imports)
Assign this fiscal position to all bonded warehouse vendors. When a bonded import bill is posted, the suspended duty amount is recorded as a liability — a reminder that this duty will be owed if the goods are not exported within the stipulated period. When export proof is confirmed, post a journal entry to reverse the suspended duty liability (debit the suspended duty account, credit a "Duty Discharged" income account).
EPZ compliance is built on the foundation of correct VAT configuration. If you haven't set up NBR VAT tax groups and fiscal positions yet, the NBR VAT compliance guide for Odoo Bangladesh provides the base framework. The Mushak 6.3 configuration in the Mushak 6.3 Odoo setup guide is also relevant — EPZ factories are exempt from VAT on production inputs, but this exemption must be correctly modelled in Odoo so that export invoices (zero-rated) appear correctly in the Tax Report. To size the budget for a bonded-ready Odoo deployment — users, modules, and the custom MPR report — try the Odoo cost estimator for Bangladesh. Need help with your EPZ Odoo setup? Book a scoping call and I'll review your configuration →
Frequently asked questions
What are the EPZ compliance requirements for factories in Bangladesh?
BEPZA-licensed EPZ factories must be 100% export-oriented and import raw materials duty-free under their approved raw material list. They must track consumption of every bonded raw material per manufacturing order, submit a Monthly Progress Report (MPR) to BEPZA by the 10th of each month, submit annual utilisation declarations, and maintain physical stock that reconciles to the bonded ledger at all times. BEPZA inspectors can arrive unannounced — your Odoo bonded stock balance must match physical count.
How does bonded warehouse work in Odoo for EPZ factories?
Set up a dedicated storage location tagged as "Bonded Raw Material Store" — separate from general warehouse stock. All duty-free imports are received into this location (Purchase Receipts set destination = Bonded Store). Manufacturing Orders source raw materials from the Bonded Store — the consumption is recorded when the MO is completed or during production. Delivery Orders for export shipments record finished goods leaving the plant. The bonded stock balance at any point = opening stock + imports − consumption − wastage. This is your BEPZA reconcilable balance.
Does Odoo support the BEPZA Monthly Progress Report (MPR)?
Not as a built-in formatted report. But all the source data is in Odoo: opening/closing stock from Inventory Valuation, imports from Purchase Receipts filtered to the Bonded location, consumption from Manufacturing Order analysis, exports from Delivery Orders. The monthly process is: pull these four data sets from Odoo → populate the BEPZA MPR Excel template → submit. For high-volume factories (20+ raw material SKUs, 100+ MOs per month), a custom Odoo MPR report module can automate this data extraction and cut the process from hours to minutes.
What happens if EPZ raw materials are not fully consumed and exported?
Unused bonded raw materials that cannot be exported within the stipulated period (typically 12–18 months from import, depending on BEPZA license terms) are subject to duty recovery — you must pay the full import duties that were suspended. You may also apply for BEPZA permission to sell unused raw materials domestically (rare and restricted) or re-export them. In Odoo, the suspended customs duty liability account tracks this exposure — the balance shows what you'd owe NBR if the remaining bonded stock can't be utilised.