← All work

Inova Sales Hub

An internal sales platform for Inova IT Systems — proposal pipeline, SLA-aware approval queue, and a points leaderboard.

  • Next.js
  • TypeScript
  • Prisma
  • MariaDB
  • OpenID Connect SSO
  • Nodemailer
  • Motion

Screens

Sales dashboard — proposal stats and revenue targets, dark theme
Sales dashboard — proposal stats and revenue targets, dark theme
Quote pipeline with cost, price, and margin per proposal
Quote pipeline with cost, price, and margin per proposal
Approval queue — what the Sales Lead sees, escalated items first
Approval queue — what the Sales Lead sees, escalated items first
The same dashboard in light theme
The same dashboard in light theme
NDA review with a per-submission audit trail
NDA review with a per-submission audit trail

Problem

Proposals moved between sales executives and the Sales Lead as spreadsheets and email threads. Nobody could answer the two questions that mattered — what is waiting on approval right now, and what margin are we actually signing — without reconstructing it by hand.

Role

Built the application: SSO auth and session handling, the Prisma schema and queries behind the pipeline, the approval workflow and its email notifications, the leaderboard scoring, and the themed UI.

Key decisions

Margin is computed and shown in the approval queue itself rather than left for the approver to work out from cost and price. An approver scanning a queue makes a decision in a couple of seconds, and a number they have to compute is a number they will skip. Statuses are modelled explicitly — pending, escalated, approved, cancelled — so 'escalated past SLA' is queryable state rather than something inferred from dates.

Challenges

Document ingestion was the fragile part. The NDA review flow parses uploaded PDFs and Word files, and real submissions fail in ways a happy path never shows: unreadable files, missing paths, parser errors mid-pipeline. That pushed every submission onto an explicit status machine with a per-submission audit trail, so a failure surfaces as a recorded reason instead of a document that silently never arrives.

Outcome

Turns a spreadsheet-and-email approval chain into one tracked queue, with margin visible at the point of approval.