Technical Lab · 0035

Odoo for Pharma Bangladesh — batch tracking, expiry, DGDA compliance.

Bangladesh has over 300 licensed pharmaceutical manufacturers. The ones operating under WHO-GMP or EU-GMP certification run ERP with full batch traceability. The ones still on Tally and spreadsheets are one DGDA audit finding away from a recall with no paper trail. This guide covers how to configure Odoo for pharmaceutical manufacturing compliance.

Pharmaceutical ERP is not a separate category from general manufacturing ERP — it is the same system with a much higher traceability requirement. Every raw material that enters a pharma production facility must be traceable to the finished dosage form it contributed to, and every finished dosage form must be traceable back to its input raw material lots. This is not optional: it is the foundation of product recall capability, which is required under DGDA licensing, WHO-GMP, and any export market regulatory approval.

Odoo handles this correctly when configured correctly. The core capability — lot-based traceability from receipt through production to delivery — is built into the standard Odoo Inventory and Manufacturing modules. What pharma requires is that this capability be turned on for every product, consistently enforced at every transaction point, and augmented with expiry date tracking and quality check integration.

For EPZ-based pharma exporters, see also the EPZ compliance configuration guide. For inventory valuation that applies to API and excipient stock, the Odoo inventory valuation cheatsheet covers the relevant costing methods.

In pharmaceuticals, the ERP is not an operational convenience — it is the primary evidence that your manufacturing process was controlled. A recall without ERP traceability is a crisis. A recall with ERP traceability is a manageable event.

Why pharmaceutical manufacturing needs different ERP configuration

Standard manufacturing ERP assumptions that pharma breaks:

Lot and batch tracking setup in Odoo

Enable lot tracking as follows:

  1. System setting: Inventory → Configuration → Settings → Traceability → enable "Lots & Serial Numbers" and "Expiration Dates".
  2. Product tracking: On every pharmaceutical product (finished goods, APIs, excipients, packaging materials), set Tracking = By Lot. Do not skip packaging materials — primary packaging (blisters, bottles) must be lot-tracked for print batch number verification.
  3. Lot number format: Standardize your lot number format. A common Bangladesh pharma format: BN-YYYYMM-NNN (e.g., BN-202605-001 = Batch 001 manufactured in May 2026). Configure this as a convention in your SOP — Odoo accepts any string as a lot number but your lot numbers should be systematic.
Product Category Tracking Setting Expiry Dates Lot number source FEFO required?
APIs (Active Pharmaceutical Ingredients) By Lot Yes — from supplier CoA Supplier batch number Yes
Excipients (fillers, binders, lubricants) By Lot Yes — from supplier CoA Supplier batch number Yes
Primary packaging (blisters, bottles, vials) By Lot Typically no expiry Supplier batch or internal code No (FIFO)
Secondary packaging (cartons, inserts) By Lot (for printed material with batch/expiry) No Print run reference No
Finished pharmaceutical products By Lot Yes — calculated from manufacture date + shelf life Internal batch number (BN-YYYYMM-NNN) Yes — mandatory

Expiry date management in Odoo

When "Use Expiration Dates" is enabled on a product, each lot has four date fields in Odoo:

Note · Pharma manufacturer, TongiStock write-off review
A pharmaceutical company had lot tracking switched on but had never set a removal strategy, so pickers simply took whatever lot was nearest the door. At a quarter-end review the warehouse held several lakh taka of finished product within three months of expiry, while newer, longer-dated stock had already shipped. Distributors started returning the short-dated cartons. We set the removal strategy to FEFO on every pharmaceutical product and switched on the daily expiry alert — near-expiry stock now surfaces months before it can become a write-off. Lot tracking only records what happened. FEFO is what changes what happens; without it, the system simply watches the loss instead of preventing it.

FEFO enforcement: Go to Inventory → Configuration → Settings → Storage Locations → enable "Storage Locations" if not already on. Then in the product's inventory tab, set Removal Strategy = "First Expiry First Out (FEFO)". When a picking is generated for a sales order or a transfer, Odoo automatically suggests the lot with the earliest expiry date. For a wholesale/hospital sales context, this is essential — it prevents near-expiry stock from accumulating in the warehouse.

Expiry alerts: Configure Odoo's scheduled action "Generate Expiry Alerts" (Settings → Technical → Automation → Scheduled Actions) to run daily. Lots reaching their Removal Date generate an activity alert for the QC or warehouse manager. You can also create a custom report: Inventory → Products → Lots/Serial Numbers, filter by Expiration Date ≤ today + 90 days, to see all near-expiry stock.

Pharmaceutical manufacturing workflow in Odoo

Configure the manufacturing routing with one work order per major production stage. Each stage has its own work centre, time estimate, quality checks, and responsible operator.

Stage 1
Dispensing
Raw materials (API + excipients) are weighed to the exact quantities specified in the BOM. Each component's lot number and actual quantity dispensed is recorded in the MO work order. A second person checks each weighing (double verification — a GMP requirement).
QC check: identity test per component · weight verification · dispensary cleanliness log
Stage 2
Granulation
Wet or dry granulation. APIs and excipients are blended and granulated. Process parameters (mixing speed, time, binder volume for wet granulation) are recorded in quality checks. Granule moisture content is tested (LOD test) before proceeding.
QC check: LOD % · granule size distribution · blending time record
Stage 3
Compression
Granules compressed into tablets on a rotary tablet press. In-process checks performed every 30 minutes: tablet weight variation, hardness, friability, disintegration time. Defective tablets are rejected and weighed — actual yield = theoretical yield minus rejects.
QC check: weight variation · hardness (kP) · friability % · disintegration time · yield %
Stage 4
Coating
Film or sugar coating applied in a coating pan. Coating weight gain target is specified in the BOM. Visual inspection for uniform coating, colour consistency, chipping. Not all products require coating — this stage is skipped for uncoated tablets.
QC check: weight gain % · appearance · coating uniformity
Stage 5
Primary Packaging
Tablets blistered or bottled. Blister foil lot number recorded. Batch number, manufacturing date, and expiry date printed on each blister/label — verify print against approved artwork. Defective blisters are rejected.
QC check: print legibility · batch/expiry print accuracy · seal integrity · tablet count per blister
Stage 6
Secondary Packaging
Blisters packed into cartons with package insert. Cartons into shipper cases. Batch number and expiry on carton label. Shipper cases palletised and moved to QC quarantine storage to await batch release.
QC check: carton count per case · batch/expiry on carton · insert presence · shipper case integrity

QC and batch release in Odoo

In pharmaceutical manufacturing, the quality department must release each batch before it can be sold. Odoo implements this through a two-location stock structure:

DGDA compliance data in Odoo

The Directorate General of Drug Administration (DGDA) requires pharmaceutical manufacturers to maintain Batch Manufacturing Records and Batch Packing Records for every production batch. Odoo captures the underlying data; you need a custom report to format it as a BMR.

Data that Odoo captures in the Manufacturing Order (which feeds the BMR):

Develop a custom QWeb report that pulls all this data from the Manufacturing Order and formats it into your DGDA-approved BMR template. This is a one-time development effort (typically 3–5 days of Odoo development time) but is mandatory for regulatory compliance. The BMR is the document a DGDA inspector will request during a factory inspection.

Recall traceability in Odoo

The recall scenario: a supplier notifies you that an API lot (e.g., Metformin HCl, Lot MF-2025-CN-019) has failed potency testing. You must identify every finished product batch that used this API lot and every customer who received product from those batches.

  1. Forward trace from raw material lot: Inventory → Reporting → Traceability → search for the API lot number (MF-2025-CN-019). Odoo shows all Manufacturing Orders that consumed this lot. Note all internal batch numbers (e.g., BN-202601-005, BN-202601-012).
  2. Forward trace from finished goods batch: For each finished goods batch identified, run Traceability again on the finished goods lot. This shows all Sales Order deliveries that included this lot — with customer names, delivery dates, and quantities.
  3. Recall affected customers: Export the customer list from the Odoo traceability report. Your quality department contacts each customer with the recall notification and return instructions.
  4. Block remaining stock: For any quantity of the affected lots still in your warehouse (Released or QC Quarantine), create an internal transfer to move them to a "Recall Hold" location. This prevents accidental shipment of the recalled product while the recall is underway.
  5. Regulatory reporting: Report the recall to DGDA with: product name, batch numbers affected, lot number of the defective raw material, reason for recall, quantity in market, and corrective action. All this data is available from Odoo's traceability report and MO records.

The entire forward trace from API lot to customer list can be completed in under 10 minutes in Odoo. Without ERP lot tracking, the same exercise requires days of manual reconciliation across paper records — during which more defective product may continue to ship.

Temperature-sensitive storage management

Many pharmaceutical products require controlled storage: 2–8°C (refrigerated), 15–25°C (controlled room temperature), or protected from light. Odoo can support temperature zone management through storage location configuration:

Bottom line

Odoo for pharma in Bangladesh requires three non-negotiable configurations: (1) lot tracking on every product without exception; (2) FEFO enforcement and expiry date management on all pharmaceutical stock; and (3) a QC quarantine location that prevents unreleased batches from being sold. Beyond these, the BMR custom report and the recall traceability capability are what turn Odoo from a stock management tool into a genuine GMP-compliant pharmaceutical ERP. Need help configuring Odoo for your pharmaceutical company? Get in touch →

Frequently asked questions

How to enable lot and batch tracking in Odoo for pharmaceuticals?

Go to Inventory → Configuration → Settings, enable "Lots & Serial Numbers" and "Expiration Dates". Then set Tracking = "By Lot" on every pharmaceutical product (APIs, excipients, primary/secondary packaging, and finished goods). Assign lot numbers at receipt (from supplier CoA batch numbers for raw materials) and at manufacturing (your internal batch number format for finished goods). Odoo will then record every movement of every lot, creating the traceability chain required for GMP compliance and product recall.

How does Odoo manage expiry dates for pharmaceutical products?

Enable "Use Expiration Dates" on pharmaceutical products. Each lot has an Expiration Date, Removal Date, and Best Before Date. For finished goods, set "Use Time" (shelf life in days) on the product — Odoo calculates expiry automatically as manufacturing date + use time. Set Removal Strategy = FEFO on pharma products to ensure oldest-expiry stock is always shipped first. Run the scheduled expiry alert action daily so near-expiry lots trigger activities for the QC team. Block sales of expired stock by ensuring the sales order picking only draws from the Released stock location (not QC Quarantine where new production lands first).

Can Odoo handle DGDA batch manufacturing record requirements in Bangladesh?

Odoo captures all the data required for a DGDA BMR: product/batch identity, manufacturing and expiry dates, raw material lot numbers and quantities, in-process quality check results, work centre and operator records, final yield, and QC release sign-off. What Odoo does not provide out-of-the-box is a formatted BMR print template — you need a custom QWeb report that renders all Manufacturing Order data in the DGDA-approved BMR format. This is a one-time development (3–5 days) that is mandatory for regulatory compliance. The same data also supports WHO-GMP inspection requirements.

How do I set up pharmaceutical manufacturing workflow in Odoo?

Configure multi-step routing in Manufacturing: Work Orders for Dispensing → Granulation → Compression → Coating → Primary Packaging → Secondary Packaging, each with its own Work Centre and quality checks. Finished goods from the last work order go to a QC Quarantine location, not directly to Released stock. QC conducts final product testing and, if the batch passes, creates an internal transfer from QC Quarantine to Released stock — this is the batch release event. Only released lots can be allocated to sales orders. Rejected batches are moved to a Destroyed location via a scrap order, which writes off the inventory value and locks the lot.