Merse.
Case study · Real estate

Bhatia Builders a system.

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.

3
apps, one systemmarketing site · admin CMS · API
0
runtime content fetchesthe public site reads baked data
1.25×
capped DPRreal-time 3D, steady on mid-range Android
8
stage lead pipelineidempotent, end to end
01The redesign

Scrolled past, then remembered

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.

  • 01Static brochure pagesReal-time 3D experience
  • 02No content controlA custom admin CMS
  • 03Leads lost in inboxesAn idempotent lead pipeline
  • 04No visibilityLive analytics dashboards
02Real-time 3D

On the phones their buyers 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.

Esspee Square — rendered tower from the Bhatia Builders 3D marketing site
  • DPR capped at 1.25×sharp without melting the GPU
  • Demand frameloopthe GPU idles when nothing moves
  • Streamed after paintmodel and environment load off the critical path
  • Static fallbacka render on reduced-motion and constrained devices
03The system

Three apps, one set of conventions

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.

  1. Editor saves
  2. MongoDB
  3. Sync engine
  4. Seed files
  5. Vercel build
  6. Live site

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.

  • React 19
  • React Three Fiber
  • GSAP + Lenis
  • Express 5
  • MongoDB Atlas
  • Cloudflare R2
  • GA4 Data API
  • Vercel
04The command center

Two dashboards, two sources of truth

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.

Bhatia Builders sales dashboard — lead inbox with the new / contacted / scheduled / closed pipeline
Sales

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
Bhatia Builders marketing dashboard — headline GA4 metrics and conversion goals
Marketing

Behavioural analytics

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

  • GA4 Data API
  • ~13 parallel reports
  • Reconciled against CRM
Bhatia Builders marketing dashboard — traffic over time, acquisition channels, and the visitor-to-closed funnel
Traffic over time, acquisition channels, and the full visitor → closed funnel — one screen.
05Lead infrastructure

Built to never lose a lead

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.

  1. 01

    Capture & queue

    Written to a local queue with an idempotency key before the request leaves the browser — it survives a tab crash or a dropped network.

  2. 02

    Client analytics

    A GA4 generate_lead event fires — the capture stage of the tracked journey.

  3. 03

    Transport

    POSTed with the idempotency key. Exponential backoff; 4xx is terminal, 5xx and network errors retry.

  4. 04

    Edge guards

    CORS whitelist, Helmet headers, global plus per-IP rate limits, and a clean 503 if the database is down.

  5. 05

    Validation

    A Zod schema checks name, email, phone, project, date and time. A failure is a terminal 400.

  6. 06

    Idempotency & dedupe

    A replayed key returns the existing lead; a duplicate on email or phone for a project returns 409, backed by a partial unique index.

  7. 07

    Persist

    Stored as source mvp-web, status new — auto-promoted to hot when the visitor leaves a real message.

  8. 08

    Surface

    It lands in the CRM inbox and the analytics funnel at the same time.

Security posture

The guards behind that pipeline — and the rest of the platform.

Authentication
A signed JWT in an HttpOnly cookie — no token in localStorage, so no XSS theft surface. Failed logins are rate-limited.
Authorization
Role-based access across four roles: mvp, superuser, editor, viewer.
Input safety
Zod on every write; Mongo-operator injection blocked by regex-escaping and scalar coercion; pagination and sort fields clamped to a whitelist.
Resilience
Serverless-aware DB pooling with a 503 gate, partial unique indexes on public forms, an audit log, and revertible sync snapshots.
Privacy
noindex on both apps; the admin adds a strict CSP and frame-busting.
Start a project

Bhatia Builders is the first Merse build.

If you are launching something that deserves the same — the craft and the system underneath — tell us what you are building.

0/10 min characters

No spam. Your details stay between us.