Inventory · Orders · Production · Packing

A lightweight CRM for a real household-chemicals brand.

Built for a 4-person team that produces, packs and ships across three channels — website, Rozetka and wholesale. Everything is a server action away. RLS keeps each role honest.

Role-based order workflow

New → processing → paid → packing → packed → TTN → shipped → delivered. Each transition is gated by role (manager, packer, admin) with proper audit trail.

Stock as movements

Current stock is derived from production / sale / defect / adjustment / return events. No silent overwrites — every change has an author and a reason.

Packer interface

Mobile-first checklist with quantity counters, progress bar, and a one-tap defect modal that writes a stock movement and notifies the manager.

Production dashboard

Products grouped by stock urgency (critical / warning / ok). Record a new batch in two taps — stock moves and notifications fire automatically.

Order funnel

Live counts per status on the home dashboard, plus a quick-glance funnel that links straight into the filtered order list.

Mobile-first

Tables collapse to cards under 768px. Number inputs use inputMode + select-on-focus so iOS users can edit quantities without fighting the keyboard.

Tech stack

  • Next.js 16 (App Router, Turbopack, React 19.2)
  • TypeScript strict
  • Tailwind v4
  • shadcn/ui (base-nova)
  • Supabase (Postgres + RLS + Auth)
  • Server Actions
  • Vercel

Want to look around?

Drop me a line for demo credentials, or check the source.