# A purchase management system that makes buyers shop around before they order

Canonical: https://erpfly.com/modules/purchase-management/
Last updated: September 14, 2026

Category: Operations

Purchasing rarely loses money in one dramatic mistake. It leaks through orders placed with the usual supplier without a comparison, bills paid for goods that never fully arrived, and approvals signed on a phone in a car park. A purchase management system built into ERPNext or Odoo can close those gaps without turning every order into paperwork.

### Features

- **Quote rules with a sensible exit.** Require competing quotes above a value, and let buyers record a single-source reason when there genuinely is only one supplier. The reason is kept and reportable.
- **Approval limits by amount and category.** A $2,000 order for office supplies and a $2,000 order for a spare part on a critical machine can follow different routes. You decide which.
- **Requests that become orders, not emails.** Staff raise material requests. Buyers turn them into RFQs and orders, so every order can be traced back to someone who asked for it.
- **Bills matched to what arrived.** Supplier bills are checked against the order and the receipt. Pay for 180 units if 180 arrived, not the 200 on the order.
- **Supplier scorecards from your own data.** On-time delivery, short shipments and rejected goods per supplier, calculated from receipts rather than from memory.

### What gets generated

**ERPNext / Frappe app:**
- Single Source Reason custom field on Purchase Order (fixture)
- Purchase Order before_submit hook for quote rules
- Workflow on Purchase Order with value-based approval
- Supplier Scorecard criteria for short and late deliveries
- Quote Compliance Script Report

**Odoo addon:**
- purchase.order inheritance with quote rule check
- Approval thresholds per product category
- Single-source reason field with tracking
- Bill control set to received quantities
- Pivot and list views for supplier performance

### Purchasing leaks money in small, boring ways

Nobody sets out to overpay suppliers. It happens because the usual supplier is quick to reply, because getting three quotes takes a day the buyer doesn't have, and because the invoice looks roughly right. Each one is small. Across a year of orders it isn't.

The standard purchasing flow in ERPNext and Odoo is solid. Requests, RFQs, orders, receipts and bills are all there. What's missing is your organisation's rules about when the process can be skipped, who can skip it and what has to be written down when they do. Those rules are what erpfly generates.

### How the purchase management system is put together

On **ERPNext**, the chain is Material Request, Request for Quotation, Supplier Quotation, Purchase Order, Purchase Receipt and Purchase Invoice. The Frappe app hooks into Purchase Order submission to check quote rules, adds a Workflow for approvals by value and uses supplier scorecards for delivery performance. Custom fields ship as fixtures, so your test site and live site stay in step. If you want to see how a generated app is laid out, our page on [ERPNext custom module development](https://erpfly.com/erpnext-custom-module-development/) walks through it.

On **Odoo**, the addon inherits `purchase.order`, adds the single-source reason with tracking so changes show in the chatter, and extends the approval step with category-based thresholds. Where Odoo already has the setting you need, like billing on received quantities, we switch it on instead of writing code.

A good rule of thumb: if the platform has a setting for it, use the setting. Code is for the rules that are genuinely yours.

Before asking for the module, it's worth writing down three numbers: the value above which quotes are required, the value above which a director signs, and the tolerance you'll accept between billed and received quantities. Most of the back-and-forth in purchasing projects is about those three numbers, not about code.

### Example: three quotes above $10,000

A food manufacturer buys cocoa, packaging and spare parts. Their rule is three quotes for anything over $10,000, unless there's a documented reason to single-source.

The production planner raises a Material Request for 2,000 kg of cocoa powder. A buyer sends an RFQ to four suppliers. Two respond in time. The best quote works out to $14,600, and the buyer tries to submit the Purchase Order.

The check finds two supplier quotations against that request, not three, and stops the submission with a message saying so. The buyer has two options. Chase the other suppliers, or record why two is enough this time: the other approved suppliers can't meet the allergen certification this recipe needs. They type that reason, the order goes through, and the reason is now on the order and in the compliance report.

A month later, 1,850 kg arrives, and a batch of 150 kg follows the week after. The supplier bills the full 2,000 kg straight away. The matching rule compares the bill with the receipts, finds it 150 kg ahead, and holds that line until the second delivery is booked in. The accounts clerk doesn't need to open the warehouse log to know something is off.

### Where we'd push back

- **Approval for every order.** If a $40 box of gloves needs a signature, people stop reading what they sign. Set thresholds high enough that approvals mean something.
- **Automatic purchase orders from reorder levels.** Letting the system raise Material Requests when stock runs low is useful. Letting it send orders to suppliers with no buyer in the loop is how you end up with a year's supply of the wrong bolt.
- **A custom supplier portal on day one.** The built-in portals cover quoting and confirmation. Start there and see what suppliers actually ask for.
- **Scoring suppliers on 20 criteria.** On-time, in-full and quality rejections tell you most of what you need.

### Receipts, stock and supplier quality

Purchasing only works when the receiving side records what actually arrived. Quantities received feed [inventory management](https://erpfly.com/modules/inventory-management/), inspection results on incoming goods belong in [quality management](https://erpfly.com/modules/quality-management/), and matched bills move into [invoice management](https://erpfly.com/modules/invoice-management/) for payment. Manufacturers get the most out of tying these together, which is why our page on [ERP for manufacturing](https://erpfly.com/industries/manufacturing/) spends so much time on the purchasing side.

### FAQ

### Does ERPNext or Odoo already do some of this?

Quite a lot. ERPNext has Material Requests, Request for Quotation, Supplier Quotation and supplier scorecards. Odoo has RFQs, purchase approval limits in settings and bill control by received quantity. We configure what exists first and only generate code for the rules it can't express.

### Can suppliers submit quotes online?

ERPNext has a supplier portal for RFQs and Odoo has a portal for purchase orders. We usually extend those rather than build a new supplier site. A custom portal only makes sense if suppliers need to do much more than quote and confirm.

### How do we handle tax on purchases?

Purchase taxes stay in the standard tax templates and fiscal positions, driven by supplier and item. We don't touch them. If import duties or landed costs matter to you, ERPNext's Landed Cost Voucher and Odoo's landed costs feature are the right place.

### We run purchasing on spreadsheets and email. What does migration involve?

Suppliers, items with their usual suppliers and prices, and open purchase orders. Open orders matter most, because receipts and bills will need to match them from day one. Closed history can stay as an archive.

### Will the rules break when we upgrade?

The code is a separate Frappe app or Odoo addon, so upgrades don't overwrite it. Purchase Order and purchase.order are stable objects, and the included tests tell you quickly if a new release changed something they rely on.

### How long does it take?

The rules in the example above produce a working first version in minutes. Expect a week of buyers using it on a test site, mostly arguing about thresholds, which is a conversation worth having anyway.