SaaS Point of Sale & Retail Management Platform
One cloud POS that lets many independent retail businesses sell, stock, and report — each in their own isolated workspace.
- Role
- Solo Full-Stack Developer — product, API & storefront UI
- Timeline
- Dec 2025 — Present
- Team
- Solo — from schema to storefront
- Status
- Live & actively maintained

Overview
What this project is about
Independent retailers were juggling disconnected tools: a cash register or spreadsheet for sales, manual stock counts, and end-of-day reports assembled by hand. Every new branch or staff member multiplied the chaos — no shared source of truth, no permissions model, no visibility for owners.
I designed and built a cloud POS SaaS on the MERN stack where each business operates as an isolated tenant with its own catalog, staff roles, and reporting. Cashiers get a fast, distraction-free checkout; managers get live inventory and sales performance without waiting for closing time.
Problem
The challenge
Retail teams needed register-speed checkout and owner-level insight in one system — without sharing data between businesses.
- 01
Sales, inventory, and reporting lived in separate tools that drifted out of sync during busy hours.
- 02
No role separation: every staff member effectively had the same access, which is risky around refunds, discounts, and cash handling.
- 03
Owners had no real-time view of what was selling, what was running low, or how each cashier and branch was performing.
- 04
Onboarding a new business meant manual setup work instead of self-serve tenant provisioning.
Approach
How I built it
The key architectural and product decisions, in the order they were made.
Tenant-first data model
Scoped every document — products, sales, stock movements, users — to a tenant id at the database layer, so businesses are isolated by construction rather than by convention.
Role-based access control
Modeled owner, manager, and cashier roles with granular permissions for discounts, refunds, inventory edits, and reports, enforced on both API and UI.
Checkout optimized for speed
Designed the sale flow around barcode-first input, offline-tolerant state handling, and minimal taps per transaction so queues keep moving.
Live inventory & reporting
Stock decrements at the moment of sale and feeds dashboards for low-stock alerts, best sellers, and per-branch and per-cashier performance.
Features
What shipped
Fast checkout terminal
Barcode-first sale flow with discounts, returns, and receipt printing tuned for high-throughput retail counters.
Inventory synchronization
Stock levels update in real time across terminals and branches as sales, restocks, and transfers happen.
Role-based workspaces
Owners, managers, and cashiers each see exactly what they need — and nothing they should not touch.
Performance reporting
Sales trends, top products, low-stock alerts, and staff and branch leaderboards for daily decision-making.
Multi-business tenancy
New businesses onboard into fully isolated workspaces on shared infrastructure, keeping costs low and data separate.
Catalog management
Variants, pricing, categories, and supplier info managed centrally and pushed to every terminal instantly.
Problem solving
Hard parts & trade-offs
Every project has moments where the obvious path breaks. These were the defining ones.
Challenge
Selling the same SKU from two terminals at once could oversell stock.
Solution
Made stock decrement part of the sale transaction with server-side validation, so the second sale fails gracefully with a clear out-of-stock message instead of corrupting counts.
Challenge
Checkout had to stay usable on flaky in-store connections.
Solution
Kept sale state resilient on the client with explicit sync status, so cashiers always know whether a transaction is confirmed, pending, or needs a retry.
Challenge
Permission bugs in a money-handling system are high-stakes.
Solution
Enforced RBAC in API middleware as the source of truth and mirrored it in the UI, with audit-friendly records on sensitive actions like refunds and voids.
Outcomes
What it achieved
Real-time
Sales-to-stock sync
Every sale updates inventory and dashboards instantly — no end-of-day reconciliation.
2 roles
Permission model
Owner, and staff workspaces with least-privilege access by default.
Multi-tenant
One deploy, many stores
Businesses onboard into isolated workspaces on shared infrastructure.
Live
In production
Serving real retail traffic with ongoing iteration driven by operator feedback.
Retrospective
What I took away
In money-handling systems, server-side validation is the only validation that counts — the UI is just a courtesy layer.
Designing for the busiest hour (register queues, peak sales) surfaces requirements that quiet-hour testing never will.
Tenant isolation is cheapest when it is a data-model decision on day one, not a migration in year two.