CRM · 6 weeks · 2025

Building a Full CRM from Scratch

A custom CRM that replaced three spreadsheets and two WhatsApp groups.

3→1

Systems consolidated

40%

Faster lead response

0

Monthly licensing cost

20+

Agents onboarded

The challenge.

NGSSOM managed insurance leads across fragmented spreadsheets, WhatsApp groups, and email threads. Agents had no visibility into each other's pipelines, leads fell through the cracks, and management couldn't see real-time performance metrics. They needed a unified system — but couldn't afford enterprise CRM licensing for 20+ agents.

The solution.

I built a custom CRM from scratch using Node.js, React, and SQLite, designed to run on their own on-premise server. The system features agent dashboards with real-time lead tracking, campaign management with bulk SMS/WhatsApp integration, a simulation mode for training new agents, and an admin panel with KPI dashboards. Everything deploys via a single installer script.

How it was delivered.

  1. 01

    Discovery & Schema Design

    Mapped existing workflow across spreadsheets, identified 12 entity types, designed normalized schema.

    ✓ Complete
  2. 02

    Core API & Auth

    Built REST API with JWT auth, role-based access (admin/supervisor/agent), rate limiting.

    ✓ Complete
  3. 03

    Agent Dashboard

    React frontend with lead pipeline, activity timeline, WhatsApp quick-send, and notification center.

    ✓ Complete
  4. 04

    Admin & Reporting

    KPI dashboards, campaign manager, bulk import/export, agent performance metrics.

    ✓ Complete
  5. 05

    Deployment & Training

    On-prem installer, simulation mode for agent training, documentation, and handover.

    ✓ Complete

Behind the build.

The project started with a two-day discovery sprint where I sat with the sales team and mapped every step of their lead lifecycle — from first contact to policy issuance. What emerged was a surprisingly complex workflow hidden behind simple-looking spreadsheets.

The key insight was that their process wasn't broken — it was invisible. Agents were doing great work, but nobody could see it. The CRM didn't need to change how they worked; it needed to make their work visible and trackable.

I chose SQLite deliberately. For an on-premise deployment serving 20-30 concurrent users, it eliminates the ops burden of running a separate database server. The entire application — API, frontend, and database — runs as a single process behind Nginx.

The simulation mode was an unexpected hit. New agents can practice the entire lead-to-close workflow with fake data before touching real leads. It cut onboarding time from two weeks to three days.

Built with

  • Node.js
  • Express
  • React
  • SQLite
  • JWT Auth
  • WhatsApp API
  • Linux Server

Next case study

A Bilingual Online Store for Omani Kumma & Mussar

Let’s build it.

Tell me what you need built. You’ll hear back in under 24 hours.