Skip to content
Jason Ooi — home

Multi-Tenant Inventory ERP

  • Web app
  • SaaS
  • 2026
  • Personal product

A multi-tenant inventory and order-management system for SME manufacturers in Malaysia and Singapore, with one database per workspace.

Overview

Small manufacturers often sit between spreadsheets and a full MRP system. This ERP gives each business its own workspace, at its own URL and with its own database, to run its product and materials catalogue, bills of materials, stock across sites and warehouses, purchase and sales orders, returns and physical stock counts.

Stock correctness is the core. A single StockService is the only code allowed to write stock: every change becomes a signed ledger entry, stock can never go below zero, quantities use decimal-safe bcmath maths, and locks are always taken in a fixed order so concurrent transfers can't deadlock.

The codebase is built to stay maintainable: thin controllers calling domain Actions and Services, typed DTOs whose TypeScript types are generated and committed, PHPStan at level 7 with no baseline, and custom check scripts that keep every Laravel FormRequest in sync with its zod schema.

Role

Solo: product, architecture and full-stack development

Architecture

architecture.svg
Inventory ERP architectureThe browser runs React 19 with Inertia 3, server-side rendered via Node. It talks to a Laravel 13 application with Fortify authentication, domain Actions and Services, and a single StockService that writes every stock change. Laravel uses a central MySQL database plus one database per workspace (Workspace A, B and C), managed by stancl/tenancy.React 19Inertia 3SSR · NodeLaravel 13Fortify authActionsStockServicecentraltenancyABC

Highlights

  • Database-per-tenant workspaces with create, archive and restore from a central admin console

  • 63 permissions across 19 screens, enforced on all 129 workspace routes

  • Fully translated into English, Malay and Chinese (about 1,680 keys each)

  • Concurrency stress test: 0 of 12 deadlocks with ordered locks (7 of 12 without), and 321 concurrent movements reconcile exactly with the ledger

  • Catalogue and BOM, stock ledger, warehouse transfers, stock takes, purchase and sales orders with returns

  • PHPStan level 7 with no baseline, plus 6 custom check scripts run by lefthook and CI

Available for freelance projects

Need a custom web app like this?

Tell me what you're building. Message me on WhatsApp or send an email.

Have a project in mind?WhatsApp me(opens WhatsApp in a new tab)