SaaSPOSMulti-TenantNext.jsNest.js

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
SaaS Point of Sale & Retail Management Platform — product screenshot

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.