Technical Lab · 0021

EPZ & SEZ compliance in Odoo — bonded warehouse setup for Bangladesh export zones.

How to configure Odoo for BEPZA compliance — bonded warehouse location setup, duty-free raw material procurement, fiscal position mapping for EPZ imports, manufacturing consumption tracking, and producing the data needed for the BEPZA Monthly Progress Report (MPR). Built from EPZ knitwear and woven garment factory deployments.

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

Managed by BEPZA

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
Managed by BEZA

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
NBR-licensed

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:

ObligationFrequencyWhat 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

1

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.

2

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.

3

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.

4

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:

Origin
Overseas Supplier
Transit
Chittagong Port / C&F
Odoo: Bonded Receipt
Bonded Raw Material Store
Odoo: MO Consumption
Production / WIP
Odoo: DO
Export Shipment

In Odoo, when creating the Purchase Order for bonded raw materials:

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Note · EPZ knitwear factory, first BEPZA inspection on OdooBonded ledger drift
A factory had set up the bonded location correctly, but its Manufacturing Orders were being created with the default raw material source — the general warehouse — because no one had changed the operation type's source location for bonded BOMs. Consumption posted from general stock; the bonded location's balance kept climbing while the physical bonded store emptied. Nobody noticed until a BEPZA inspector compared the Odoo bonded report to a physical count and found a gap of several tonnes of yarn on paper. The fix was to make the bonded location the hard-wired source on the manufacturing operation type for every bonded product, and to add a monthly check: bonded location balance in Odoo must equal the physical store count before the MPR is filed. A bonded ledger that is never reconciled is not a record — it is a liability waiting for an auditor.

BEPZA Monthly Progress Report (MPR) data from Odoo

The MPR requires the following data for each raw material (yarn, fabric, accessories, etc.):

MPR fieldOdoo report / sourceHow 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:

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).

Linked reading

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.