Context

A trading company owner in Taiwan ran weekly operations from Excel files passed around on Line. One sheet tracked inbound shipments, another matched invoices, a third held follow-ups, and a fourth was "temporary" for three years. Staff edited copies. Numbers disagreed by Friday.

They wanted software they could own-not another SaaS subscription with features they would never use.

What I built

A single web dashboard with four views tied to one database:

  • Pipeline - inbound shipments with status, expected arrival, and responsible staff member
  • Invoice match - link supplier invoices to shipment rows; flag amount or date mismatches
  • Tasks - owner-assigned follow-ups with due dates and simple completion state
  • Export - one-click CSV for their accountant (same columns they already used)

Login for owner plus three staff accounts. Chinese UI labels with English where their suppliers use it. Mobile-readable tables because the owner checks status on the phone between meetings.

Technical approach

Next.js App Router, PostgreSQL on AWS RDS, Prisma for schema migrations the owner will never touch but I can maintain remotely.

Kept the data model boring on purpose: no custom ERP abstractions, just tables that mirror how they already think about the week. Validation at save time so bad rows do not silently propagate.

Deployed with preview URLs for each change; owner approved on staging before production push.

Outcomes

  • Owner stopped maintaining four spreadsheet versions; staff use one link
  • Monday review dropped from ~90 minutes of copy-paste to opening one screen
  • Second phase scoped from real usage: WhatsApp alerts deferred because email digest was enough

Stack

Next.js · TypeScript · PostgreSQL · Prisma · AWS · Tailwind