SIMS — Smart Inventory Management System
Multi-tenant inventory management with role-scoped access
Overview
SIMS is built for businesses managing inventory across multiple tenants from one platform. Each tenant gets its own inventory, order history, users, and alert thresholds, and every role — from Super Admin down to a regular User — is scoped to the tenant it belongs to, so nothing from one tenant is ever visible to another.
Key Features
- Multi-tenant inventory tracking, fully isolated per tenant
- Configurable low-stock thresholds that trigger alerts before items run out
- Full CRUD for purchase and sales orders
- Four-tier role hierarchy — Super Admin, Admin, Manager, User — scoped per tenant
- Notification system surfacing stock alerts and order events to the relevant roles
My Responsibilities
- Built the multi-tenant data access layer so inventory, orders, and users stayed isolated per tenant at both the API and UI layer
- Implemented configurable stock-threshold alerting, including per-tenant thresholds and alert delivery
- Built CRUD flows for purchase and sales orders, including status transitions like fulfillment and cancellation
- Implemented role-based UI and route guarding across four roles, each scoped to its tenant rather than global
- Built the notification module surfacing threshold and order events to the roles responsible for acting on them
Challenges & Solutions
Roles weren't just role-based, they were role-scoped-per-tenant — a Manager in one tenant needed the same permissions as a Manager in another, but neither should see or affect the other's data.
Modeled permissions as (tenant, role) pairs instead of a flat role enum, and enforced tenant scoping at the API query layer as well as route guards, rather than relying on the frontend alone to hide unauthorized data.
Threshold alerts fired on every stock update near the limit, which meant a slow-moving item hovering around its threshold could spam the same alert repeatedly.
Added hysteresis to the alert logic: an alert fires once when stock crosses below the threshold and clears once stock is restocked past a buffer above it, rather than re-evaluating and re-alerting on every update.
Architecture
- Frontend
- React with role-aware route guards shared across a common component layer
- State
- Redux for tenant, role, and inventory state; local state for order forms
- Styling
- Tailwind CSS with Material UI for inventory and order data grids
- Testing
- Jest coverage on threshold-alert logic and tenant/role permission edge cases
At a glance
- User roles
- 4 (Super Admin → User)
- Tenancy model
- Fully multi-tenant
- Core modules
- 5+
Technologies
This is an enterprise project built for a company I've worked with, so I'm not able to share source code or a live demo here — happy to walk through the code and architecture in person.