All workFreelance · Product · 2026 · In production

B2B Platform — Client Build

A working product for a real business: scoped, designed, shipped, and used day to day.

ReactTypeScriptNodePostgreSQLTailwind CSS
B2B Platform — Client Build — project visual
01

Overview

A B2B web platform replacing a tangle of spreadsheets and WhatsApp threads with one system of record for orders, clients and internal handoffs.

Built with the operations team rather than for them — weekly increments, real data from day one, and a hard rule that nothing ships until someone on the floor can use it without a walkthrough.

02

The problem

Every order lived in at least three places: a spreadsheet, a chat message, and someone's memory. Nobody could answer 'where is this' without asking two people.

Reporting was reconstructed by hand at month end, which meant the numbers were always late and never quite trusted.

03

System architecture & technical approach

A normalised PostgreSQL schema models orders, clients and state transitions as an append-only event log, so history is never overwritten and any status can be explained.

The React front end is role-aware: operations sees a queue, management sees aggregates, clients see only their own thread. Server-side authorization gates every read, not just the UI.

  1. 01

    Client request intake

  2. 02

    Order record + event log

  3. 03

    Role-scoped queues

  4. 04

    Status transitions (audited)

  5. 05

    Aggregation views

  6. 06

    Live dashboard + exports

04

Technical hurdles & breakthroughs

Migrating live spreadsheets without downtime

Ran an import pipeline with a dry-run diff mode against the live sheet for two weeks, so the team could see exactly what would land before the cutover. The actual migration was uneventful, which was the point.

Permissions that don't leak through the UI

Early builds hid buttons but still returned full payloads. Rewrote the data layer so authorization happens at the query level and the UI simply reflects what came back.

Adoption, not features

The biggest blocker was habit. Shipping keyboard-first entry and a one-screen daily view got usage past the tipping point faster than any feature on the original list.

05

Outcomes & key results

~6 hrs

Manual reporting removed per week

1

System of record, replacing three

100%

Status changes audited and explainable

Daily

Active internal usage since launch

  • Shipping in visible increments buys more trust than a polished demo at the end.
  • The hardest part of internal tooling is not the code — it is making the new way faster than the old way on day one.