rauhan.sheikh
← Back to Work Directory
INTERNAL[CRM]2026

CRM Platform

An internal CRM that keeps sales and support organised: quotes and invoices, who can see what, and automatic links to the company's other products. Internal tool, so described at a high level.

APIs + webhooks
Integrations
Signed, deduplicated events between products
Person to department
Access Control
Permissions at individual, team and department level, all audited
1-click
Quote → Invoice
With validation and PDF output

Engineered With

Next.jsTypeScriptNode.jsMongoDBGmail APIPDF generationWebhooks

The Problem & Context

Sales and support needed quotes and invoices that could be configured instead of hand-built, access that matched how the company is organised, and a dependable feed of events from the company's products so the CRM reflects reality without manual entry.

The Messy Part (Behind the Build)

A CRM holds live customer data, so every change has to be safe by default: previews before scripts touch production, immediate loss of access for deactivated users, and integrations that stay correct when events arrive twice or out of order.

Architecture & Design Decisions

A Node.js and TypeScript application with the same self-hosted foundation as the other platforms. Quotations convert to invoices with validation and PDF output; access is granted at individual, team and department level with audit trails; and signed webhooks plus a small API connect it to MarketBaaz in both directions.

What I built

  • Quotations and invoices: configurable line items, taxes, discounts and currencies, reusable templates, PDF download and quote-to-invoice conversion with validation.
  • Access control: permissions across individuals, teams, sub-departments and departments, with audit trails.
  • Integrations: Gmail integration, and a signed API and webhook layer that connects the CRM to MarketBaaz, so a contact can be issued MarketBaaz access automatically and product events flow back.
  • Safety and developer experience: previews and confirmations for data-changing scripts, and an isolated one-command local setup.

Note

This is an internal company system built by a two-person team, with me as the senior developer. There is no public link and the description is deliberately general.

What I'd Do Differently Today

I would write the integration contract and its tests before building either side. Several fixes came from discovering mismatches between the two systems after the fact.