Procurement is where cash leaves the business. In Bangladesh SMEs, it is also where the most informal processes live — verbal agreements with vendors, handwritten receipts, payments before documents, and no systematic record of what was ordered vs. what arrived vs. what was billed. Odoo's Purchase module formalises all of this. The discipline it enforces is valuable. The configuration required to make it fit Bangladesh workflows is non-trivial.
This guide covers the full setup: vendor master, RFQ-to-PO workflow, approval controls, 3-way matching, vendor bill management, reorder automation, and the Bangladesh-specific considerations that most Odoo guides overlook.
The gap between "what was ordered" and "what was paid" is where procurement fraud lives. 3-way matching closes it.
What the Purchase module covers
Odoo Purchase manages the buy side of the business: requesting quotes from vendors, issuing Purchase Orders, receiving goods against those orders, and processing vendor invoices for payment. It integrates directly with:
- Inventory — PO confirmation triggers a Goods Receipt in the designated warehouse
- Accounting — vendor bills are created from receipts and posted to AP journals
- Manufacturing — MRP generates Purchase Orders automatically when raw materials are needed
- Inventory reordering — min/max rules trigger RFQs when stock falls below the reorder point
Vendor master setup
Every vendor is a Contact in Odoo (Contacts → New). The Purchase tab adds procurement-specific fields. Here is what to configure for each vendor in Bangladesh:
- Company Type Company for registered businesses, Individual for sole traders. This affects how Odoo formats documents and which tax certificates apply.
- BIN / Tax ID Enter the vendor's Business Identification Number (BIN). This is required for input VAT credit — Odoo can print the BIN on purchase orders and vendor receipts. Without it, input VAT claims are unsubstantiated.
- Payment Terms Set the agreed payment terms (Net 30, Net 60, Advance, etc.). Odoo uses this to calculate payment due dates on vendor bills and the Aged Payables report.
- Currency BDT for domestic vendors; USD/EUR for foreign suppliers. If a domestic vendor quotes in USD, set currency to USD — Odoo converts at the daily rate on the PO date.
- Fiscal Position Assign the correct fiscal position (Domestic VATable, VAT-exempt, etc.). This controls which purchase tax applies automatically. Import suppliers should use a "Zero-rated Import" position if you handle customs duty separately.
- Purchase Lead Time The vendor's standard delivery lead time in days. Odoo uses this for automated reorder scheduling — the PO is triggered lead-time days before the stock-out date.
- Vendor Pricelists Add product-specific prices if you have negotiated rates. When you add a product to an RFQ, Odoo auto-fills the vendor's last or agreed price — eliminating manual price entry errors.
When importing vendor master data from spreadsheets, clean TIN/BIN numbers first — they come in inconsistent formats (with dashes, without dashes, with letters). Odoo stores them as plain text but your VAT reports need them formatted correctly. See my Excel → Odoo migration checklist for the vendor data cleaning steps I run before every go-live.
RFQ to Purchase Order workflow
The standard Odoo purchase flow is: Request for Quotation (RFQ) → Purchase Order (PO) → Goods Receipt → Vendor Bill → Payment. Here is each step:
Purchase approval matrix
Enable purchase approvals in Settings → Purchase → Purchase Orders → tick "Purchase Order Approval". Set a threshold amount — any PO above this amount requires a designated approver to confirm before it is sent to the vendor.
Bangladesh SMEs typically implement a two-level approval matrix:
| PO Amount | Required Approver | Odoo implementation |
|---|---|---|
| Under BDT 50,000 | Purchase Officer (self-approve) | Threshold set at BDT 50,000 — no approval popup below this |
| BDT 50,000 – 5 lakh | Purchase Manager | PO goes to "To Approve" state; manager receives notification |
| Above BDT 5 lakh | Director / CFO | Use the Approvals app for multi-level routing; Odoo base only supports one approval level natively |
For the third level (Director/CFO approval), the Approvals app (part of the Community edition) extends the base approval mechanism. Configure an Approval Type linked to "Purchase" with a minimum amount threshold and assign the approver by user group.
Goods receipt & 3-way matching
3-way matching is the control that prevents overpayment. Odoo enforces it when you set the Vendor Bills control policy to "On Receipt" (Settings → Purchase → Invoicing Control).
Purchase Order
What you agreed to buy: product, quantity, unit price, delivery date. This is your contractual commitment.
Goods Receipt
What was actually delivered to your warehouse: actual quantity received and accepted. Odoo records this as a stock move.
Vendor Bill
What the vendor is charging: quantity billed and price. Odoo pre-fills from the receipt — discrepancies are immediately visible before the bill is validated.
When all three documents match, the vendor bill can be validated and paid. When they don't — a vendor bills for 100 units but only 80 were received, or the price on the bill exceeds the PO — Odoo flags the discrepancy. Finance must resolve it before payment. This single control, consistently applied, eliminates the most common procurement fraud pattern in Bangladesh SMEs.
Vendor bills & payments
Once a vendor bill is validated in Odoo, it sits in Accounting → Vendor Bills → To Pay. Key payment controls for Bangladesh businesses:
- TDS deduction — configure AIT withholding tax on the vendor (Accounting tab → Fiscal Position with AIT). When paying, Odoo deducts the AIT and shows the net payable. The AIT amount posts to TDS Payable and must be remitted to NBR separately.
- Advance payment reconciliation — if you paid an advance before receiving goods, create a vendor credit note from the advance payment and apply it against the vendor bill. The net amount is the balance due.
- Payment batch — at end of week, use Accounting → Batch Payments to pay multiple vendor bills in a single bank transfer. Odoo generates a reconciliation report matching the batch to the bank statement.
- Outstanding payables report — Accounting → Reporting → Aged Payables. Review weekly. In Bangladesh, vendor relationships are personal — overdue balances damage credit terms. Keep the Aged Payables clean.
Reorder rules & automation
Odoo can trigger Purchase Orders automatically when stock falls below a minimum level. This is configured via Inventory → Replenishment → Reorder Rules.
For each product that needs automatic replenishment, set:
- Minimum Quantity — the stock level that triggers the reorder
- Maximum Quantity — the level to replenish up to
- Quantity Multiple — purchase in multiples of this number (e.g., 500 pcs per carton)
- Lead Time — days until delivery. Odoo uses this to schedule the PO so goods arrive before stock hits zero.
- Preferred Vendor — set on the product or in vendor pricelists. Odoo creates the RFQ for this vendor automatically.
Run the scheduler manually (Inventory → Replenishment → Run Scheduler) or let Odoo run it daily via the automated scheduler. For Bangladesh factories where raw material consumption is predictable, reorder rules eliminate the "we ran out of thread at midnight" emergency purchases that cost 20% more from local markets.
The unit cost of goods received through Purchase Orders directly affects your inventory valuation. If you're using AVCO, each receipt recalculates the weighted average cost of the product. If the price on your PO doesn't match what you're actually paying (a common issue with vendor price changes), your COGS and gross margin reports will be wrong. See my inventory valuation cheatsheet for how to handle price variance correctly.
Bangladesh-specific procurement notes
| Bangladesh Pattern | Odoo handling |
|---|---|
| Vendor advance payments before delivery | Create a vendor bill for the advance amount posted to "Advance to Suppliers" account. Apply as a credit note against the final vendor bill on delivery. Never post directly to the expense account — it overstates cost before the goods arrive. |
| Cash purchases from local markets | Create a Purchase Order (even for cash purchases) to maintain the 3-way match. Use Petty Cash as the payment journal. This keeps procurement records complete for audit — "no PO, no payment" is a policy worth enforcing from day one. |
| Vendor price renegotiation mid-contract | Update the vendor pricelist in Odoo. For open POs, amend the unit price before the receipt is validated — changing price after validation requires a credit note and a new bill. |
| Import purchases with LC and customs duty | Create the PO in the foreign currency. Receive goods at the PO price. Add landed costs (freight, customs duty, port charges) separately via Inventory → Landed Costs — this adds them to the product cost. Do not add to the vendor bill of the supplier. |
| Multiple vendors for same product | Add all vendors in the product's Vendor Pricelist tab with their respective prices and minimum quantities. When creating an RFQ, Odoo shows the best vendor price automatically. Use Purchase Alternatives to compare simultaneously. |
Purchase module configuration is part of every SME implementation I lead in Bangladesh. If you're running procurement on WhatsApp and spreadsheets and want to formalise it, let's talk about a structured transition →
Frequently asked questions
How does 3-way matching work in Odoo for Bangladesh businesses?
3-way matching checks that the Purchase Order, Goods Receipt, and Vendor Bill all agree. With invoice control set to "On Receipt", a vendor bill can only be created after goods are received. Odoo pre-fills the bill from the receipt quantities — any variance from the PO price or quantity is immediately visible before the bill is validated or paid. This is the primary control against overpayment and duplicate billing.
How do I set up purchase approval workflows in Odoo?
Enable Settings → Purchase → Purchase Order Approval → tick "Require approval for purchase orders above..." and set your threshold (e.g., BDT 50,000). Any PO above that amount requires a user with the "Purchase Manager" role to approve before the order is sent. For two-level approval (e.g., manager then director), install the Approvals app and create a custom approval type linked to purchase documents.
How do I handle vendor advance payments in Odoo?
Post advances to a dedicated "Advance to Suppliers" balance sheet account — never directly to expense. When the vendor delivers and bills, create a vendor credit note from the advance entry and apply it against the vendor bill. The net remaining amount is the payment due. This gives you a clean advance balance per vendor and prevents double-counting cost.
Can Odoo generate Purchase Orders automatically for manufacturing?
Yes. When the Manufacturing module's MRP scheduler runs, it calculates raw material requirements from open Manufacturing Orders and existing stock, and generates RFQs for the shortfall — automatically, for the correct vendor, at the correct lead time. This is called Make to Stock replenishment. For custom or job-order production, use Make to Order rules on the product, and Odoo generates the PO when the Sales Order is confirmed.