# Purchase Tender & Bid Scoring

> Put every vendor's quotation for a purchase agreement side by side, score them on price, delivery and quality with your weights, and award.

- **What it is:** Put every vendor's quotation for a purchase agreement side by side, score them on price, delivery and quality with your weights, and award.
- **For:** Purchases
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 149 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_tender
- **Not for:** It does not change how quotations are created or confirmed — it scores the ones already on the agreement.; It does not send the requisition or collect the quotations for you; that is Odoo's own purchase-agreement flow, unchanged.; If every quotation's promised date is already in the past when you score, delivery cannot be measured; its weight is spread over price and quality rather than silently zeroing the ranking.
- **Manual:** https://docs.bambooforge.dev/bambooforge_tender/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-purchase_requisition.action_purchase_requisition
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_tender
- **Manual last updated:** 2026-10-15

---
# Purchase Tender & Bid Scoring

Odoo's purchase agreements let you send one requisition to several
vendors and collect a quotation from each. What they do not do is help
you **choose** — the quotations sit in a list, and comparing them is a
spreadsheet somebody rebuilds every time.

## Score on more than price

Each quotation is scored on three things, not one:

- **Price** — the cheapest quotation scores ten; one at twice the price
  scores five. Relative to the best offer in the field, which is the
  only comparison that survives three very different bids. Quotations in
  different currencies are converted to your company currency first, so
  the vendor in the weakest currency does not win on the nominal number;
  and a one-cent poison bid is not allowed to become the benchmark that
  sinks everyone else.
- **Delivery** — the earliest promised receipt scores ten; a slower one
  loses points in proportion.
- **Quality** — a mark out of ten you give the quotation for everything
  price and speed do not capture: reliability, spec, terms.

Each carries a **weight** you set on the agreement — 60/30/10 by default,
because the cheapest is not always the one you award, and a critical part
weighs delivery more than a cheap consumable does. The weights are
relative: 60/30/10 and 6/3/1 rank the same.

The quality mark starts at a neutral five, so a quotation nobody has
judged sits in the middle — and a buyer who types a zero has said
"worst" deliberately, which counts.

## See them side by side

**Compare** opens every quotation on the agreement in one list: the
total, the promised date, each score, the weighted total and the rank —
sorted best first. The winner is obvious, and the runner-up is the next
row down for when the winner falls through.

## Award in one click

**Award this quotation** marks the winner and cancels the agreement's
other draft quotations together — each with a note saying which
quotation won and its score, the audit trail a buyer needs when a vendor
asks why they lost. A quotation already confirmed is left alone: awarding
is a decision made before anything is ordered, not a way to unwind a
purchase.

## What it does not do

- It does not change how quotations are created or confirmed — it scores
  the ones already on the agreement.
- It does not send the requisition or collect the quotations for you;
  that is Odoo's own purchase-agreement flow, unchanged.
- If every quotation's promised date is already in the past when you
  score, delivery cannot be measured; its weight is spread over price
  and quality rather than silently zeroing the ranking.

## How we make sure it works

Before every release, **20 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- A cancelled loser cannot be re awarded.
- A poison bid does not sink the honest ones.
- All past dates do not silently zero the ranking.
- Compare opens the comparison view not the default.
- Zero weights do not divide by zero.

The complete list is in the source you receive.

## Install

1. Copy `bambooforge_tender` into your addons path and update the app list, or install the ZIP from the Odoo Apps Store.
2. Install **Purchase Tender & Bid Scoring**.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Purchase Agreements app. No extra Python package.

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.
