Product & Technical Blueprint

Subcontractor & Vendor Pre-Qualification Scorecard

One product, two documents on this page: a plain-language overview for pitching and a buildable spec for implementation. Both describe the same scope and the same launch commitments.

Document A

Business & Product Overview

Audience: commercial founder — no engineering detail below this line until Document B

What we're selling

A web tool that lets a main contractor or GLC procurement team vet subcontractors before awarding work — replacing the paper form or one-off spreadsheet that currently gets filled in per tender and then thrown away. The buyer sets up their own scoring criteria once (financial standing, past performance, safety record, whatever matters to them); subcontractors fill in a self-service form; a reviewer scores and approves or rejects; and every past result is kept, so the next tender starts from a record instead of a blank page.

Who should buy it

Buyer
Procurement manager at a main contractor or GLC (government-linked company) who runs vendor/subcontractor vetting before awarding tenders
Company size
Vets roughly 20–100 subcontractors a year — too much volume for an ad-hoc spreadsheet, too small to justify an enterprise vendor-management platform
Who else touches it
The subcontractors themselves, who fill in the self-submission form — they are a user, not a paying customer

The problem it solves

Right now this is done on paper or in a spreadsheet copied fresh for every tender. There's no running history: a subcontractor who failed on safety last year can slip through again because nobody remembers, or because the person who remembers has left. Enterprise vendor-management software exists, but it's priced and built for large corporates running thousands of vendors — nothing is sized for a contractor doing this 20–100 times a year.

How it works, in plain terms

  1. The procurement team builds their scorecard once — the questions and weightings they care about (e.g. financial statements, safety certifications, past project references).
  2. When a tender opens, they invite subcontractors by email/link to fill in the self-submission form.
  3. A reviewer on the procurement side scores each submission against the scorecard and marks it approved, rejected, or needs more info.
  4. Every decision is saved against that subcontractor's profile, so the next tender shows their history at a glance instead of starting from zero.

Main selling points

What's included in the first release

Included (P0)Added once there are paying customers (P1)Not yet — future (P2)
One fixed scorecard template the buyer fills in with their own questions; subcontractor self-submission form; single-reviewer approve/reject/needs-info workflow; subcontractor history visible on their profile Multiple reviewers with sign-off routing; reminder emails for incomplete submissions; CSV export of a tender's full result set Integration with the buyer's own ERP/procurement system; analytics dashboards on subcontractor performance trends across the whole portfolio; multi-criteria weighted scoring templates (versus one fixed template)
Assumption to validate — whether a single fixed scorecard template (one set of questions, same for every tender) is good enough for a first customer, or whether they'll insist on different criteria per tender type from day one. If the latter, P0 needs to include basic template editing, which adds real build time. Confirm this with the first 2–3 prospects before committing to the P0 scope above.

What's NOT included

Customer onboarding

  1. Procurement team walks through scorecard setup with us (hands-on for the first few customers, since a wrong first template is a bad first impression)
  2. They send their first tender's subcontractor list — a CSV import, not manual one-by-one entry
  3. Subcontractors receive an email/link and fill in the form themselves — no account needed to submit, only to review
  4. First live tender cycle runs end to end with us watching, to fix anything that breaks before it's a pattern

Expected delivery timeline

6–7 weeks from kickoff to a pilot customer running one real tender cycle through the tool — assuming the scorecard stays to the single fixed-template scope above. This is a build estimate for one developer working solo with AI-assisted tooling, not a contractual date; it hasn't been tested against a real customer's actual tender calendar, which may force the timeline around their own schedule rather than ours.

Important limitations to set expectations on

Document B

Technical Blueprint

Audience: technical founder / AI coding assistant
3

Product Requirements Summary

Problem
Subcontractor vetting runs on paper/spreadsheets with no persistent history across tenders
Target customer
Main contractor / GLC procurement team, 20–100 subcontractors/yr
User roles
Procurement Admin (configures scorecard, manages tenders), Reviewer (scores submissions), Subcontractor (external, submits — no login required to submit, only to view status)
Core value
A scorecard the buyer owns, a submission the subcontractor self-serves, and a history that persists after the tender closes
MSP
One fixed scorecard template per buyer account, subcontractor self-submission by link, single-reviewer approve/reject/needs-info, subcontractor profile with past decisions visible

Key business rules

Feature priority (carried from Document A)

PriorityFeature
P0Fixed scorecard template per buyer, CSV subcontractor import, self-submission form (no login), single-reviewer scoring + approve/reject/needs-info, subcontractor profile history
P1Multi-reviewer sign-off routing, reminder emails for incomplete submissions, tender result CSV export
P2ERP/procurement system integration, cross-portfolio analytics, configurable weighted multi-template scoring
5

Workflows

flowchart LR
  A[Buyer signs up] --> B[Configure scorecard
template] B --> C[Open a tender,
import subcontractor list] C --> D[Subcontractors invited
by email link] D --> E[Subcontractor submits
self-service form] E --> F[Reviewer scores
submission] F -->|approved| G[Added to tender's
approved vendor list] F -->|rejected| H[Marked rejected,
reason recorded] F -->|needs info| D G --> I[Decision written to
subcontractor's permanent history] H --> I
A. Complete customer journey — from signup to a decision landing in the permanent record
flowchart TD
  A[Buyer account created] --> B{First time?}
  B -->|yes| C[Guided scorecard setup
with us, hands-on] B -->|no, new tender| D[Reuse existing scorecard] C --> E[CSV import of first
subcontractor list] D --> E E --> F[Invite links sent] F --> G[We watch first live
cycle end to end]
B. Customer onboarding — hands-on for the first tender, self-serve after
flowchart TD
  A[Subcontractor opens
invite link] --> B[Fills scorecard
answer form] B --> C[Uploads supporting
documents] C --> D[Submits] D --> E[Reviewer dashboard:
submission appears as Pending] E --> F{Reviewer decision} F -->|Approve| G[Status: Approved] F -->|Reject| H[Status: Rejected + reason] F -->|Needs info| I[Status: Needs info —
subcontractor notified] I --> B G --> J[(Subcontractor profile:
decision + date + tender)] H --> J
C. Core product operation — submission through to a recorded decision
flowchart LR
  subgraph Procuring Company Account
    AD[Procurement Admin
configures scorecard,
manages tenders, users] RV[Reviewer
scores submissions,
approves/rejects] end SC[Subcontractor
no login — link-based access,
can view own submission status] AD -- invites --> RV AD -- opens tender for --> SC RV -- decides on --> SC
D. User roles and permissions — two internal roles per buyer account, one external link-based role
flowchart TD
  A[Buyer signs annual contract] --> B[Invoice issued,
RM4,800/yr] B --> C{Paid?} C -->|yes| D[Account active
for 12 months] C -->|no, past due| E[Grace period reminder] E -->|still unpaid| F[Account read-only:
history visible, no new tenders] D --> G[Renewal reminder
60 days before expiry]
E. Subscription and payment — annual contract, not monthly billing
flowchart LR
  A[Us, the vendor] --> B[Provision new buyer account]
  B --> C[Assist first scorecard setup]
  A --> D[Monitor for failed imports /
bounced invite emails] A --> E[Handle support requests
from Procurement Admins] A --> F[Track renewal dates,
flag at-risk accounts]
F. Administrative workflow — what we do as the vendor running this for customers
6

Technical Architecture

A modular monolith is the right call here — the feature set (accounts, scorecards, submissions, reviews) is small enough that splitting into services would only add deployment and debugging overhead for a solo developer, with no scaling need that justifies it yet.

Frontend
Next.js (App Router) — server-rendered pages for the subcontractor's no-login submission form (must work with zero JS assumptions for a one-time external visitor), client-side dashboard for the Procurement Admin/Reviewer side
Backend
Next.js API routes / server actions — no separate backend service needed at this scale
Database
Postgres via Neon or Supabase — relational fits this domain naturally (buyers, tenders, subcontractors, submissions, decisions)
ORM
Drizzle — matches this team's existing house stack
Auth
Email/password or magic-link for Procurement Admin and Reviewer accounts (Supabase Auth or Auth.js); subcontractors authenticate via a signed, expiring submission-link token — no account, no password
Authorization
Row-level scoping by company_id on every tenant-owned table, enforced in the query layer (Postgres RLS if using Supabase directly, or an explicit WHERE company_id = ? guard on every query if using Drizzle without RLS) — this is the single most important thing to get right given the no-cross-tenant-visibility rule
File storage
Object storage (Supabase Storage or S3-compatible) for subcontractor-uploaded supporting documents, referenced by URL from the submissions table — never stored as blobs in Postgres
Background jobs
Minimal at P0 — reminder emails (P1) and renewal-date checks can run on a daily cron (Vercel Cron or a scheduled Supabase Edge Function); no queue infrastructure needed yet
Hosting
Vercel for the app, managed Postgres (Neon/Supabase) for data — matches the team's stated stack and needs no dedicated ops time
Security
Signed, time-expiring tokens for subcontractor submission links (so a leaked link can't be reused indefinitely); uploaded documents scanned or at minimum type/size-restricted on upload; all tenant queries scoped by company_id as above
Monitoring/backups
Managed Postgres's built-in automated backups are sufficient at this scale; basic uptime/error monitoring (Vercel's built-in logs plus a lightweight error tracker) — no custom observability stack justified yet
flowchart TB
  subgraph Client
    PA[Procurement Admin /
Reviewer dashboard] SF[Subcontractor
submission form] end subgraph "Next.js app (Vercel)" API[API routes /
server actions] AUTH[Auth: email/password
+ signed link tokens] end DB[(Postgres
Neon / Supabase)] FS[(Object storage
for documents)] MAIL[Email provider
invites + reminders] PA --> API SF --> API API --> AUTH API --> DB API --> FS API --> MAIL
System architecture — a single Next.js app, managed Postgres, object storage for uploads, no separate backend service
7

Database and API Design

erDiagram
  COMPANY ||--o{ USER : employs
  COMPANY ||--o{ SCORECARD_TEMPLATE : owns
  COMPANY ||--o{ TENDER : runs
  TENDER ||--o{ SUBMISSION : receives
  SCORECARD_TEMPLATE ||--o{ SUBMISSION : "scored against"
  SUBCONTRACTOR ||--o{ SUBMISSION : submits
  SUBMISSION ||--o| DECISION : "resolved by"
  USER ||--o{ DECISION : makes

  COMPANY {
    uuid id PK
    string name
    string plan_status
  }
  USER {
    uuid id PK
    uuid company_id FK
    string role
    string email
  }
  SUBCONTRACTOR {
    uuid id PK
    string company_name
    string registration_no
  }
  SCORECARD_TEMPLATE {
    uuid id PK
    uuid company_id FK
    jsonb questions
  }
  TENDER {
    uuid id PK
    uuid company_id FK
    uuid template_id FK
    string name
    string status
  }
  SUBMISSION {
    uuid id PK
    uuid tender_id FK
    uuid subcontractor_id FK
    jsonb answers
    string status
    timestamp submitted_at
  }
  DECISION {
    uuid id PK
    uuid submission_id FK
    uuid reviewer_id FK
    string outcome
    string reason
    timestamp decided_at
  }
    
ERD — note SUBCONTRACTOR is shared across companies by design, while every other table is scoped to one company_id

Key constraints

API endpoints (P0)

EndpointMethodAuthNotes
/api/scorecard-templatesGET, POSTProcurement AdminScoped to caller's company_id
/api/tendersGET, POSTProcurement AdminCreate tender, attach a template
/api/tenders/:id/subcontractorsPOSTProcurement AdminCSV import, generates signed invite links
/api/submit/:tokenGET, POSTSigned link token (no account)GET renders the form, POST submits answers + uploads
/api/tenders/:id/submissionsGETReviewerList pending submissions for review
/api/submissions/:id/decisionPOSTReviewerBody: outcome, reason — writes DECISION, locks SUBMISSION
/api/subcontractors/:id/historyGETProcurement Admin / ReviewerPast decisions for this subcontractor within caller's company only
8

UI/UX Planning

Two distinct front ends: an internal dashboard (Procurement Admin + Reviewer) and an external, no-login submission form (Subcontractor). Design them as if they're two different products that happen to share a database.

Internal dashboard sitemap

External submission form

Empty and error states

Responsive requirements

The internal dashboard is desktop-first — procurement staff review on a desk, not a phone. The subcontractor submission form must work well on mobile, since many subcontractor-side staff will open the invite link from WhatsApp on a phone.

9

Development Roadmap

Weeks 1–2

Core data model + internal auth

Company/user accounts, company-scoped auth, scorecard template CRUD (single template per company). Deliverable: a Procurement Admin can log in and define their scorecard questions. Done when: templates persist and are correctly scoped per company.

Weeks 3–4

Tender + submission flow

Tender creation, CSV subcontractor import, signed invite-link generation, the external no-login submission form with file upload. Deliverable: a subcontractor can receive a link and submit a complete form. Done when: a submission lands in the database correctly tied to the right tender and subcontractor.

Weeks 5–6

Review + decision + history

Reviewer dashboard listing pending submissions, approve/reject/needs-info action, subcontractor profile showing cross-tender history. Deliverable: a full tender cycle runs end to end. Done when: a decision is recorded, the submission locks, and it appears in that subcontractor's history.

Week 7

Pilot hardening

Fix whatever breaks when a real pilot customer runs their first live tender through it — empty/error states, email deliverability for invite links, basic billing status tracking. Deliverable: one pilot customer's real tender completed start to finish. Done when: they'd pay for a second tender cycle without us in the room.

This gets one pilot customer through one real tender, not a finished platform. Multi-reviewer workflows, reminder emails, and CSV export (P1) come after that pilot proves the core loop, not before.

10

Parallel Founder Execution Plan

StageTechnical FounderCommercial Founder
DiscoveryConfirm the single-template P0 scope is technically soundValidate with 2–3 prospects whether one fixed scorecard template is acceptable, or whether per-tender customization is a dealbreaker
PlanningLock the data model and API surface aboveConfirm the RM4,800/yr annual price point survives a real pricing conversation with a prospect
DevelopmentBuild weeks 1–7 per the roadmapLine up a pilot customer with a real tender cycle landing inside that build window, so there's no idle gap after launch
TestingFix issues surfaced by the pilot's real tenderSit with the pilot's Procurement Admin and Reviewer during their first cycle, collect friction points directly
LaunchHandle the pilot's second tender with less hand-holding; start on P1 features the pilot actually asked forConvert the pilot to a paid annual contract; start outreach to the second prospect using the pilot as a reference
Commercial assumptions to validate before development begins
  • That a buyer's existing Excel scorecard isn't already "good enough" for them — if it is, there's no sale regardless of how well the product is built
  • That subcontractors will actually complete a new, unfamiliar online form rather than pushing back and asking to submit on paper as before — a buyer can only use this if their vendor base will participate
  • That the single fixed-template P0 scope survives contact with a real prospect's stated requirements