
First-party CRM
Every lead, inquiry and subscriber in one inbox, with a hot / warm / cold pipeline and a single aggregation behind the stats.
- Unified inbox
- Hot / warm / cold pipeline
- One $facet stats query
A Mumbai real-estate developer ran a static brochure site. It now runs a three-app platform — a real-time 3D marketing site, an admin CMS, and the lead infrastructure underneath.
The old site was a brochure — read once, closed, forgotten. The new one is built in real-time 3D: buyers explore the building before it is built, on the phones they actually carry.
This is the actual Esspee Square model from the project, rendered live in your browser — not a video. It streams in well under a megabyte and holds a steady frame on a mid-range phone.

A marketing site, an admin CMS, and a Node API share one database. The decision that ties them together: the public site never fetches content at runtime.
An edit is written to the database, baked into version-controlled seed files, and committed — which triggers a fresh build. The live site ships content as static data: zero network latency, nothing to break mid-scroll.
The team runs the project from two surfaces. Sales reads the CRM — what is in the database right now. Marketing reads GA4 — how visitors behaved — reconciled against the same CRM counts.

Every lead, inquiry and subscriber in one inbox, with a hot / warm / cold pipeline and a single aggregation behind the stats.

Around thirteen GA4 reports — traffic, sources, devices, cohorts, attribution, funnel — blended with first-party counts so the on-site funnel reconciles against real rows.

One rule shaped the path from form to dashboard: never lose a lead, never create a duplicate. Eight stages enforce it — from the browser to the database.
Written to a local queue with an idempotency key before the request leaves the browser — it survives a tab crash or a dropped network.
A GA4 generate_lead event fires — the capture stage of the tracked journey.
POSTed with the idempotency key. Exponential backoff; 4xx is terminal, 5xx and network errors retry.
CORS whitelist, Helmet headers, global plus per-IP rate limits, and a clean 503 if the database is down.
A Zod schema checks name, email, phone, project, date and time. A failure is a terminal 400.
A replayed key returns the existing lead; a duplicate on email or phone for a project returns 409, backed by a partial unique index.
Stored as source mvp-web, status new — auto-promoted to hot when the visitor leaves a real message.
It lands in the CRM inbox and the analytics funnel at the same time.
The guards behind that pipeline — and the rest of the platform.
If you are launching something that deserves the same — the craft and the system underneath — tell us what you are building.