Skip to content

STDNT GEAR ERP

Staff command center for quote review, invoice approval, and production handoff — isolated from the customer storefront, built on the same API.

Role
Founding Engineer (solo)
Timeframe
Apr 2024 — Present
ReactNode.jsPostgreSQLOperations UISystem Design
STDNT GEAR ERP dashboard with active quote metrics and operations sidebar
Operations dashboard — live KPIs across the quote-to-production pipeline.

At a glance

Customers submit quotes through the storefront. Staff need a dense, reliable surface to review every line item, adjust pricing, advance statuses, and hand production teams artwork and personalization exports — without touching the public site.

  • Separate React admin app — scales independently of storefront traffic
  • Quote-to-invoice lifecycle with 12+ tracked statuses
  • Production blueprint: placement mocks, artwork, ink specs per position
  • One-click CSV and ZIP exports for factory handoff
0+
quote lifecycle statuses
0
shared REST API
0
isolated React frontends
~0
API endpoints reused

Staff

Admin portal (React)
JWT staff auth

Shared API

Express — quotes, pricing, documents, exports

Production handoff

PDF invoices
Artwork ZIP
Personalization CSV

The admin portal is a separate deployment from the storefront but reads and writes through the same API and PostgreSQL schema.

Workflow

Quote to production

Four stages staff move orders through — from inbox to factory-ready exports.

01

Review queue

Search, filter, paginate all incoming quotes

02

Blueprint

Garment breakdown + print positions + artwork

03

Price & approve

Adjustments, PDF, send invoice

04

Production

Export CSV roster + artwork ZIP

STDNT GEAR ERP staff login screen
Staff-only auth gate — separate from customer accounts.
ERP dashboard with quote pipeline metrics
Pipeline KPIs: active quotes, pending approval, in production.
01

Master quote log

Debounced search across reference numbers, customer names, and emails — with status filters and pagination.

Quotes master log with pending quotes from university customers
Incoming customer quotes — status, value, and unit counts at a glance.
Invoices list showing awaiting payment and in production statuses
Post-approval invoices — payment and production tracking.
02

Quote blueprint

Every quote opens into a production-ready blueprint — not a summary row.

Quote detail showing garment breakdown, print position mockups, artwork preview, and pricing summary
Garment variations, screen-print placement, UCT artwork, and server-locked pricing in one view.

Garment breakdown

Per-color size matrix with unit pricing

Print positions

Placement mock + artwork + ink colour chips

Personalization

Per-garment field mapping with CSV export

03

Invoice approval

Staff adjust fees, lock totals server-side, generate PDFs, and email invoices — then track payment status.

Invoice detail with awaiting payment status, garment breakdown, and quote summary
Approved invoice with production files ready — awaiting payment before production starts.

For engineers

Technical deep dive

Why a separate admin app, how pricing integrity works, and what gets exported to production.

Why a separate React app

The storefront optimizes for discovery and guided quoting. Staff need dense data tables, inline status changes, multi-panel quote blueprints, and document review — a different interaction model. Running a separate admin-client keeps deploys independent: a traffic spike on the public site doesn't compete with staff doing pricing review.

Key engineering decisions

Quote status machine

Problem

A quote moves through review, approval, payment, production, and completion — each stage gates what staff can edit (e.g. no fee adjustments after invoice is sent).

Options considered
  • Free-form status field staff can set to anything.
  • Strict status enum with UI that locks fields based on current state.
Decision

Twelve-plus explicit statuses (pending, reviewed, approved, awaiting payment, in production, shipped, completed, etc.) with UI affordances that disable pricing edits once an invoice is live.

Trade-off

More frontend conditionals, but staff can't accidentally mutate a finalized invoice total.

Discrete pricing adjustments

Problem

Custom print jobs need ad-hoc fees (vector tracing, rush charges) or discounts. Baking adjustments into a single mutable total loses audit history.

Options considered
  • Edit the total directly in the admin UI.
  • Append named adjustment line items that recompute the total server-side.
Decision

Staff add fee/discount rows with descriptions. The API recalculates subtotal + VAT + shipping + adjustments and locks the result. Each adjustment is removable until invoice send.

Trade-off

Slightly more UI, but every invoice shows exactly what changed and when.

Production export pipeline

Problem

Factory staff need personalization rosters (names, numbers per garment) and artwork files — not access to the admin portal.

Options considered
  • Email screenshots of the quote detail page.
  • Server-generated CSV for personalization data and ZIP of artwork assets.
Decision

Dedicated export endpoints: personalization CSV per product, artwork ZIP per quote, and server-rendered PDF for invoices — all behind staff JWT auth.

Trade-off

Export generation adds API surface area, but production handoff is one click instead of manual copy-paste.

Authenticated artwork serving

Problem

Customer-uploaded artwork must display in the admin blueprint but shouldn't be publicly accessible URLs.

Options considered
  • Store artwork on a public CDN path.
  • Serve artwork through authenticated API routes with a client-side proxy component.
Decision

Artwork URLs route through /api/ with staff auth. The admin portal uses an AuthenticatedImage component that fetches blobs with the staff JWT.

Trade-off

Extra client complexity, but uploaded logos stay private until staff explicitly export them.

Built vs planned

Dashboard, quotes log, quote blueprint, invoice workflow, PDF generation, and production exports are live. Sidebar modules for Clients, Staff, Reports, and Matrix settings are scaffolded in the navigation — the core quote-to-invoice path shipped first.