---
title: Vendor scorecard
order: 4
updated: 2026-07-12
---

# Vendor scorecard

The *Procurement* tab on the dashboard grades your suppliers from the procurement data you already generate — RFQs, vendor quotes, purchase orders, and arrivals. There is nothing to fill in: every number is computed from records that already exist, so a vendor's grade updates on its own as you send RFQs, place POs, and mark stock arrived. The tab has two states — a firm-wide *leaderboard* when no supplier is picked, and a single *supplier scorecard* when one is. Both honour the *From* / *To* date range at the top of the dashboard.

This page explains exactly what each pillar measures, the ranges and defaults behind every score, which records feed in, and what the *Print scorecard* PDF contains. For the surrounding procurement workflow see [RFQ cart](/docs/procurement/rfq-cart), [Vendor responses](/docs/procurement/vendor-responses), [Create a purchase order](/docs/procurement/create-purchase-order), and [Add a stock arrival](/docs/inventory/add-stock-arrival).

## Open the Procurement tab

1. Open the *Dashboard* (the home overview page — see [Dashboard](/docs/getting-started/dashboard)).
2. Set the *From* and *To* dates in the header. This window drives everything on the tab: which quotes, POs, and deliveries count as "in period". See [Date range](#which-window-does-the-tab-use) below.
3. Click the *Procurement* tab in the tab strip (shopping-cart icon).

The tab only appears if you hold both permissions below; without them you never see the tab, and the API refuses the request even if it is called directly (the app assumes every request can be forged, so it re-checks server-side):

- *View Dashboard* (`dashboard.view`) — the master gate for the whole dashboard. Without it you get a plain "HELLO" greeting page and no tabs at all.
- *Procurement Report (detailed)* (`dashboard.procurementReport`) — unlocks this specific tab. Both the data endpoint and the PDF endpoint return `403 Forbidden` if either permission is missing.

Grant these under *Settings → Users & Permissions* — see [Users and permissions](/docs/settings/users-and-permissions).

## The two views

### Leaderboard (no supplier selected)

This is the default view. It shows firm-wide procurement health and ranks every vendor that had activity in the period. Click any vendor row (the *Supplier* name or its *Grade* pill) to drill into that vendor's full scorecard.

### Single-vendor scorecard (a supplier is selected)

Pick a supplier from the *Supplier* box at the top-left, or click a leaderboard row. You then see that one vendor's grade header, financial tiles, raw-metric tiles, competitive-quote and delivery history tables, and a monthly reorder trend. A *← All vendors* link (top-left, above the picker) returns you to the leaderboard; clearing the *Supplier* box does the same. The picker placeholder reads *All vendors (pick one to drill in)*.

Switching supplier or changing the date range triggers exactly one fresh fetch; results are cached per `supplier + from + to` combination, so flipping back to a view you already loaded is instant.

## The grade

Each graded vendor gets an overall score from `0` to `100` and a letter grade. The thresholds are fixed:

| Grade | Score | Pill colour |
|---|---|---|
| `A` | `85` and above | green |
| `B` | `70`–`84` | indigo |
| `C` | `55`–`69` | amber |
| `D` | below `55` | red |
| `—` | not enough data to grade | grey |

The overall score is a weighted blend of four pillars:

| Pillar | Weight | What it measures |
|---|---|---|
| *Price* | `30%` | How your quoted rate compares to the *best bid on the same RFQ line*. `100` = consistently the cheapest. |
| *Delivery* | `30%` | How your delivery lead time compares to *that item's own historical norm*. |
| *Responsiveness* | `30%` | How often you quote when invited, blended with how fast you reply (vs the item norm). |
| *Reorder* | `10%` | Repeat-business strength ranked against other vendors. A small, indirect loyalty signal. |

The weights above are the raw weights. If a vendor lacks data for a pillar, that pillar shows `—` and drops out of the blend — the remaining pillars' weights re-normalise among themselves, so the grade is always an honest average of only the pillars that could be measured. A vendor with, say, only a Delivery score gets an overall equal to that Delivery score. If *no* pillar can be scored, the overall is `—` and the vendor is listed but ungraded.

### Why times are judged relative to the item, not in raw days

A cable gland can be quoted in minutes; a 1000 kV transformer needs a month of drawing approval. So the model **never grades on absolute time**. For every product it builds an *expected time* from the whole firm's history, then scores a vendor by how they compare to *that item's* norm. Matching an inherently-slow item's norm is not penalised; only being slower than the item's own pattern hurts. The same logic applies to both response times and delivery lead times. A footnote on the tab restates this: *"Times are scored against each item's own historical norm, so complex items aren't penalised."*

The per-item norm (the "baseline") is built like this:

- **Lookback** — all source records over the **2 years** before the period start feed the baselines and the price/reorder peer sets. Only *scoring* is limited to the selected window; the norms use the wider history so they are stable.
- **Recency weighting** — older samples count less, on a **180-day half-life** (a sample 180 days old carries half the weight of a fresh one).
- **Specificity** — samples for the *exact same product code* carry full weight (`1.0`); samples from the *same product head but a different code* are down-weighted (`0.4`) and used only as a fallback when the exact code is thin.
- **Widening** — a code needs at least `3` weighted samples to form its own baseline. Below that the model widens to the product head, and if that is still too thin, to a single firm-wide median. So even a brand-new item always resolves to *some* norm.
- The baseline is a recency-weighted **median** (not a mean), so one freak slow delivery cannot distort an item's expected time.

### Price pillar

For every RFQ line a vendor quoted, their rate is compared to the *best (lowest) genuine bid from any invited vendor on that same line*. The line's price index is `bestRate ÷ yourRate`, clamped to `0`–`1` (`1` = you were the cheapest). The pillar score is the recency-weighted average of those indices × 100.

- **Single-bidder lines are ignored.** If only one vendor quoted a line there is no competition to judge, so it does not count toward Price. Only lines with two or more genuine bidders are scored.
- *No-bid* lines are excluded (a vendor that declined a line isn't quoting a price).
- Lines with a non-positive rate are skipped.

### Delivery pillar

Every delivered PO line becomes a lead-time event: `earliest approved arrival date − PO date`, in days. Each event is scored `baseline ÷ actual`, clamped to `0`–`1` (`1` = you met or beat the item's norm), then recency-weighted and averaged × 100.

- "Delivered" means an **approved** stock arrival is linked to the PO. Pending or draft arrivals don't count.
- The arrival date used is the **earliest** approved arrival's *invoice date* (falling back to the arrival's created date if it has no invoice date).
- **Reverse entries** (returns to supplier) are excluded from lead-time measurement — a return date isn't "when the goods first arrived".
- Only POs with status `sent`, `partiallyArrived`, or `arrived` (and not deleted) are considered.

### Responsiveness pillar

Two things blended: *did the vendor bother to quote*, and *how fast*.

- **Response rate** = quotes submitted ÷ RFQs emailed, clamped `0`–`1`. A submission only counts if it has at least one genuine (non-no-bid) line.
- **Speed** = the same per-item time score as Delivery, but on *response* time (`submitted − emailed`) instead of lead time.
- If there is scorable speed data, the pillar is `50% × response-rate + 50% × speed`. If there is no scorable speed data, the pillar is the response rate alone × 100.
- A vendor that was never emailed an RFQ in the period gets no Responsiveness score (`—`).

### Reorder pillar

A deliberately small (`10%`) loyalty proxy. Each vendor's *reorder strength* is a recency-weighted count of POs placed to them over the lookback (again, 180-day half-life; **counts, never amounts** — ordering 300 units instead of 100 must not inflate loyalty). Those strengths are ranked across the whole peer set and turned into a `0`–`100` percentile. The strongest repeat vendor sits near `100`; a vendor with no reorder history gets `0` for the percentile but shows `—` for the pillar if they have no strength at all. When only one vendor qualifies, it scores `100`.

## Leaderboard view

### Firm-wide KPI strip

Four tiles summarising all graded vendors in the period:

- *Graded vendors* — how many vendors had enough data to receive an overall grade (i.e. at least one scorable pillar).
- *Avg grade* — the mean overall score (`0`–`100`) across vendors, rounded to a whole number.
- *Avg response rate* — quotes submitted ÷ RFQs emailed, averaged across vendors, shown as a percentage.
- *Avg on-time* — the share of deliveries that met their promised lead time, averaged across vendors, as a percentage.

Any tile shows `—` when there is no data to average.

### Grade distribution

A donut chart labelled *Grade distribution* / *"How vendors spread across A–D"* showing how many vendors fall in each grade band (`A` green, `B` indigo, `C` amber, `D` red), with a *Vendors* centre label. Ungraded vendors (`—`) are not counted here.

### Vendor leaderboard table

Subtitled *"Top 20 by overall grade · click a vendor to drill in"*. It lists the top `20` vendors ranked by overall score (highest first; ungraded vendors sort last). Every cell is clickable and drills into that supplier. Columns:

- *Supplier* — the vendor name.
- *Grade* — the letter pill (`A`–`D` or `—`).
- *Overall* — the composite `0`–`100` score (rounded).
- *Price*, *Delivery*, *Response*, *Reorder* — the four pillar sub-scores (`0`–`100`, or `—` if not measurable).
- *Win %* — share of the vendor's submitted quotes that converted to a real PO. **Shown for context, not part of the grade** (see [Why win-rate is shown but not graded](#why-is-win-rate-shown-but-not-part-of-the-grade)).
- *Quotes* — number of quotations the vendor submitted in the period.
- *POs* — number of purchase orders placed to the vendor in the period.

A vendor appears on the leaderboard if it had *any* in-period activity — an RFQ emailed to it, a quote submitted, or a PO placed. The empty state reads *"No vendor activity in this period."*

## Single-vendor scorecard view

### Grade header

A large grade pill next to the vendor name and a one-line summary: *"Overall N/100 · X quotes · Y POs in period"*.

### Order & delivery value (financial tiles)

Four tiles. Money is shown as a compact excl-tax figure with the incl-tax figure beneath; the tile's info tooltip carries the exact rupee amounts.

- *Ordered (period)* — total value of POs placed to this vendor **in the selected period**, line items **plus additional charges** (freight etc.). Line value is `qty × pricePerUnit × (1 − discount%)`, and incl-tax applies each line's tax rate; charges add their amount (incl-tax adds the charge's own tax rate).
- *Delivered (all-time)* — value of goods from this vendor that have actually arrived and been approved, **across all time** (not just the period). Computed per PO line from how much of that line has been received.
- *Pending delivery* — value of goods ordered but not yet arrived (outstanding on `sent` / `partiallyArrived` POs), **all-time**.
- *POs (period)* — count of purchase orders placed to this vendor in the period.

Notes on the money split:

- Additional charges fold into *Ordered* only — they aren't goods, so they never appear in the delivered/pending split.
- Received quantity per line is clamped to `[0, ordered qty]`, so an over-receipt can't make *Pending* go negative or make *Delivered* exceed what was ordered.
- **Reverse entries net out automatically** — a return-to-supplier carries negative quantity, so it reduces the received total.
- Draft, cancelled, and deleted POs are excluded entirely — they aren't spend.

### Raw metrics tiles

Four context tiles (these are the underlying rates, not the graded pillar scores):

- *Response rate* — quotes submitted ÷ RFQs emailed to this vendor, as a percentage.
- *On-time* — share of this vendor's deliveries that met the promised lead time (only deliveries where a promised lead existed are counted).
- *Win rate* — the vendor's submitted quotes that converted to an actual PO. Shown for context, not graded.
- *Quotes* — quotations this vendor submitted in the period.

### Recent competitive quotes

A table subtitled *"Your response time + rate vs the best bid on the same RFQ line"*. Only *competitive* lines appear — lines where two or more vendors bid — because a single-bidder line has no "best rate" to compare against. Up to `25` most-recent rows are shown. Columns:

- *Item* — product code · product head label.
- *Date* — the date the quote was submitted (`dd/mm/yy`).
- *Response* — days between the RFQ email and the vendor's submission (`—` if no email/submission pair exists).
- *Your rate* — the vendor's quoted unit rate.
- *Best rate* — the lowest genuine bid on that line from any vendor.
- *Index* — `best ÷ your rate` as a percentage (`100%` = you were the cheapest; below `100%` = someone beat you).

Empty state: *"No competitive quotes in this period."*

### Recent deliveries

A table subtitled *"Lead time vs the item's historical norm; on-time vs the promised lead"*. Up to `25` most-recent delivered POs. Columns:

- *Item* — the product code · head of the PO's first line.
- *PO date* — the date the PO was placed (`dd/mm/yy`).
- *Lead* — actual lead time in days (earliest approved arrival − PO date).
- *Item norm* — the item's expected lead time (the recency/specificity-weighted baseline) in days.
- *Promised* — the delivery days the vendor promised in the winning quote (`—` if the PO wasn't linked to a quoted invitation, or no promise was made).
- *On-time* — *On time* if the goods arrived within the promised lead, *Late* if not, `—` if there was no promise to judge against.

Empty state: *"No delivered POs in this period."*

### Reorder trend

A bar chart of purchase orders placed to this vendor by month, over the selected period. It only appears if the vendor has at least one PO in the window. Months are UTC-bucketed and labelled like `Apr 26`.

## Print scorecard (PDF)

The *Print scorecard* button (top-right of the tab) generates a one-click PDF of the **current view**, honouring the current date range and supplier selection. There are no PDF options to configure — it is a single-click export.

- **Leaderboard PDF** (no supplier selected) — a *Procurement health* KPI block (graded vendors, avg grade, avg response rate, avg on-time) followed by the ranked *Vendor leaderboard* table (`#`, *Supplier*, *Grade*, *Overall*, *Price*, *Delivery*, *Response*, *Reorder*, *Win%*).
- **Single-vendor PDF** (a supplier selected) — an *Overall grade* block (grade, overall, win rate, on-time), a *Pillars* block (price, delivery, responsiveness, reorder), then the *Recent competitive quotes* and *Recent deliveries* tables.

Every PDF carries your firm's name and logo in the header, the printed date range, a *Printed by* attribution block (name, username, user ID), a generated-at timestamp, a *"Confidential · Intigra"* footer, and a faint diagonal trace watermark identifying who printed it. The file downloads as `vendor-scorecard-<scope>-<start-date>.pdf` (scope is `all` for the leaderboard, or the sanitised vendor name).

If generation fails, a small red error line appears under the toolbar; the button shows a loading state while the PDF is being built. The PDF endpoint re-checks the same two permissions as the tab.

## What is intentionally not in the grade

- **Order value / quantity** — never used. Stocking up (ordering 300 instead of 100) would distort a grade, so Reorder is measured by repeat *frequency*, not amounts. Order value is shown on the financial tiles for context only.
- **Arrival approve/reject as "quality"** — deliberately excluded. That flag reflects staff data-entry, not the goods themselves. A true quality pillar would need an explicit quality rating, which can be added later.
- **Win-rate** — shown, never graded (see below).

## Common questions

### Why is a vendor showing a `—` grade?

The vendor had activity in the period but not enough data to score *any* pillar — for example, they were emailed an RFQ but every line they bid on had no competitor (Price can't be judged), they never delivered a PO (Delivery can't be judged), and so on. They still appear on the leaderboard so you can see the activity; they just aren't ranked.

### Why does one pillar show `—` while the others have numbers?

Each pillar needs its own kind of evidence. *Price* needs at least one competitive (multi-bidder) line; *Delivery* needs at least one approved arrival; *Responsiveness* needs at least one RFQ emailed in the period; *Reorder* needs some repeat-PO history. Missing evidence for one pillar shows `—` for that pillar and the others still compute — the overall grade re-weights across only the pillars that were measurable.

### Why is win-rate shown but not part of the grade?

Who wins an order is partly the buyer's choice — a pricier vendor may be picked for good reasons (reliability, relationship, single source). So win-rate reflects buyer decisions as much as vendor performance and would make the grade unfair. It's displayed as context only. Note that many POs are placed directly from known rates without an RFQ; those still count toward *Delivery* and *Reorder* even though they were never "won" through a quote.

### Which window does the tab use?

The *From* / *To* pickers in the dashboard header. Everything scored — quotes, POs, deliveries — must be anchored inside that window to count. The date norms (baselines) and the price/reorder peer sets are built from a wider **2-year** lookback so they stay stable, but a vendor's *score* is always about what happened in your selected period. The dashboard opens on the current calendar month by default. The server rejects a period that is inverted, non-positive, or longer than **3 years**.

### Why does a slow vendor still score well on Delivery?

Because Delivery is graded against *the item's own norm*, not raw days. If a product genuinely takes a month across the whole firm's history, a vendor that also takes about a month is meeting the norm and scores well. Only being slower than the item's typical pattern lowers the score. See [Why times are judged relative to the item](#why-times-are-judged-relative-to-the-item-not-in-raw-days).

### Why is the "Delivered (all-time)" figure larger than "Ordered (period)"?

They measure different windows on purpose. *Ordered (period)* counts only POs dated inside your selected range, while *Delivered* and *Pending* are **all-time** rollups of what has physically arrived vs. what is still outstanding for that vendor. A vendor with a long history will usually have delivered far more than you ordered this month.

### A vendor I know I ordered from isn't on the leaderboard — why?

The leaderboard lists vendors with activity **in the selected period**. If your window is a single month and the vendor's last PO or RFQ was outside it, widen the *From* / *To* range. Also confirm the PO wasn't deleted and is in a `sent` / `partiallyArrived` / `arrived` state — draft and cancelled POs never count.

### Why can't I see the Procurement tab at all?

You need both *View Dashboard* and *Procurement Report (detailed)* permissions. Without *View Dashboard* you only see the greeting page; without the procurement permission the tab is hidden and the data/PDF requests are refused server-side. Ask a firm administrator to grant them under [Users and permissions](/docs/settings/users-and-permissions).

### How is this different from the Supply chain report?

The [Supply chain report](/docs/reports/supply-chain) is product- and stock-centric (movement, FIFO profit, dead stock, pending pipelines). The vendor scorecard is supplier-centric — it grades *who* you buy from on price, delivery, responsiveness, and loyalty. They share some source records (POs, arrivals) but answer different questions.

### Can I change the pillar weights or grade thresholds?

Not from the app — the weights (`30/30/30/10`) and the `A`/`B`/`C`/`D` cut-offs (`85`/`70`/`55`) are fixed in the scoring model so grades stay comparable across the firm and over time.
