Structured, transparent vendor evaluation framework for RFQs with weighted scoring, independent evaluator assessments, shortlisting rules, and full audit trail.
The Bid Scoring and Evaluation system provides a structured, transparent methodology for evaluating vendor bids submitted against RFQs. It ensures that bid selection is driven by objective, weighted criteria rather than subjective preference, supporting procurement integrity and compliance requirements.
Reusable scoring templates that define evaluation frameworks for different procurement categories
Individual scoring criteria belonging to a template, each with a type, weight, and max score
Individual evaluator scores per criterion per vendor bid, with finalist designation
Pre-scoring clarification requests between buyers and vendors with deadline tracking
Criteria types: TECHNICAL COMMERCIAL COMPLIANCE QUALITY DELIVERY
Clarification statuses: PENDING ANSWERED OVERDUE
The scoring algorithm uses a weighted-sum methodology. Each criterion carries a configurable weight, and evaluators score each criterion on a scale of 1 to 10. The final composite score is normalized to a 100-point scale.
-- Bid Scoring: Weighted Normalized Calculation -- Evaluators score each criterion from 1-10; final score normalized to 100 FINAL_SCORE = (SUM(criterion_weight * evaluator_score) / SUM(criterion_weight)) * 10 -- SQL Implementation SELECT bs.vendor_bid_id, ROUND(SUM(sc.weight * bs.score) / SUM(sc.weight) * 10, 2) AS final_score FROM rfq.bid_shortlists bs JOIN rfq.bid_scoring_criteria sc ON sc.id = bs.criteria_id WHERE bs.rfq_id = @rfq_id GROUP BY bs.vendor_bid_id ORDER BY final_score DESC;
| Criterion | Type | Weight | Score (1-10) | Weighted |
|---|---|---|---|---|
| Technical Capability | TECHNICAL | 40 | 8 | 320 |
| Price Competitiveness | COMMERCIAL | 30 | 7 | 210 |
| Regulatory Compliance | COMPLIANCE | 15 | 9 | 135 |
| Delivery Timeline | DELIVERY | 15 | 6 | 90 |
| TOTAL | 100 | 755 / 100 * 10 = 75.50 |
┌────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ RFQ Close │────>│ Auto-Generate │────>│ Assign Evaluators│────>│ Independent │
│ │ │ Bid Comparison │ │ (min. 2) │ │ Scoring │
└────────────┘ └──────────────────┘ └──────────────────┘ └────────┬─────────┘
│
┌──────────────────┐ ┌──────────────────┐ │
│ Award │<────│ Shortlist │<────────────┘
│ Decision │ │ Finalists │ ┌──────────────────┐
└──────────────────┘ └──────────────────┘<────│ Committee Review │
└──────────────────┘
When the RFQ deadline passes, the system locks all vendor bids and auto-generates a side-by-side comparison matrix. The matching scoring template from rfq.bid_scoring_templates is loaded based on category.
At least 2 evaluators are assigned. Each scores every vendor bid against each criterion (1-10) in rfq.bid_shortlists. Evaluators work blind -- no visibility into others' assessments until all are submitted.
The committee reviews aggregated scores, resolves variance, and flags discrepancies. Vendors meeting the technical threshold are shortlisted (is_finalist = true). L1 vendor is determined and the award decision is finalized.
Vendors must achieve a minimum technical score (configurable, default 60%) to qualify for commercial evaluation and L1 determination.
-- Identify technically qualified vendors SELECT bs.vendor_bid_id, AVG(bs.score) AS avg_technical_score FROM rfq.bid_shortlists bs JOIN rfq.bid_scoring_criteria sc ON sc.id = bs.criteria_id WHERE bs.rfq_id = @rfq_id AND sc.criteria_type = 'TECHNICAL' GROUP BY bs.vendor_bid_id HAVING AVG(bs.score) >= @min_technical_threshold; -- default: 6.0 (60%)
| Priority | Criterion | Logic |
|---|---|---|
| 1 | Higher Technical Score | Vendor with the higher weighted technical score wins |
| 2 | Past Performance Rating | Vendor with higher historical rating from vendor.vendor_ratings wins |
| 3 | Earlier Submission Time | Vendor who submitted their bid earlier wins (timestamp comparison) |
Before scoring begins, buyers may request clarifications from vendors on ambiguous bid submissions. Tracked in rfq.bid_clarifications with strict deadline enforcement.
┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐
│ Buyer Reviews │────>│ Submit Question│────>│ Vendor │────>│ Response │
│ Bid Details │ │ (PENDING) │ │ Notified │ │ (ANSWERED) │
└────────────────┘ └───────┬────────┘ └────────────────┘ └────────┬───────┘
│ deadline expires │
▼ ▼
┌────────────────┐ ┌────────────────┐
│ OVERDUE │ │ Scoring Proceeds│
└────────────────┘ └────────────────┘
| Stage | Status | Action | Table Interaction |
|---|---|---|---|
| Question Submitted | PENDING | Buyer creates clarification with deadline | INSERT into rfq.bid_clarifications |
| Vendor Responds | ANSWERED | Vendor submits response within deadline | UPDATE response, responded_at, status |
| Deadline Passes | OVERDUE | Scheduled job marks unanswered items | UPDATE status WHERE deadline < NOW() |
| Scoring Impact | -- | Unanswered clarifications may lower compliance scores | Referenced during evaluator scoring |
-- Scheduled job: Mark overdue clarifications UPDATE rfq.bid_clarifications SET status = 'OVERDUE' WHERE status = 'PENDING' AND response_deadline < NOW();
| Rule ID | Rule | Description | Enforcement |
|---|---|---|---|
| BR-BID-001 | Minimum Evaluators | Every RFQ evaluation requires at least 2 independent evaluators for transparency | System blocks scoring initiation if < 2 evaluators assigned |
| BR-BID-002 | Blind Evaluation | No evaluator can see others' scores until ALL have submitted their assessments | API enforces visibility restriction until all evaluations are complete |
| BR-BID-003 | Score Change Justification | Any score modification requires written justification recorded in the audit trail | Update endpoint requires non-empty justification; original score preserved |
| BR-BID-004 | Evaluation Finality | Completed evaluations cannot be reopened without committee-level approval | Records locked after sign-off; reopening requires approval workflow |
-- BR-BID-001: Validate minimum evaluator count CREATE FUNCTION fn_validate_evaluator_count(@rfq_id UUID) RETURNS BOOLEAN AS $$ BEGIN RETURN (SELECT COUNT(DISTINCT evaluator_id) >= 2 FROM rfq.bid_shortlists WHERE rfq_id = @rfq_id); END; $$ LANGUAGE plpgsql; -- BR-BID-002: Check if all evaluators have submitted CREATE FUNCTION fn_all_evaluations_complete(@rfq_id UUID) RETURNS BOOLEAN AS $$ BEGIN RETURN NOT EXISTS (SELECT 1 FROM rfq.bid_shortlists WHERE rfq_id = @rfq_id AND evaluated_at IS NULL); END; $$ LANGUAGE plpgsql;
Every significant action in the bid scoring lifecycle is logged with the actor, timestamp, and contextual detail to support compliance, dispute resolution, and regulatory requirements.
| Event | What Is Logged | Purpose |
|---|---|---|
| Evaluator Assignment | Evaluator ID, RFQ ID, assigned by, timestamp | Accountability for evaluation participants |
| Score Submission | Evaluator, vendor bid, criteria, score, comments, timestamp | Immutable record for audit and dispute |
| Score Modification | Original score, new score, justification, modified by | Trace changes with mandatory justification (BR-BID-003) |
| Shortlist Decision | Vendor bid ID, is_finalist flag, reason, decided by | Rationale for vendor inclusion or exclusion |
| Evaluation Reopening | RFQ ID, reopened by, approval reference, reason | Track exceptions to finality rule (BR-BID-004) |
| Clarification Activity | RFQ ID, vendor ID, question/response, deadlines | Complete buyer-vendor communication record |
ProKure Database Documentation - Bid Scoring & Evaluation Logic v1.0
Part of the ProKure Procurement Management System