← Selected work

Case study

Radheshyam Glass House — End-to-End Digital Build

Overview

Radheshyam Glass House is a 30-year-old artisan mirror and glass business in Ulhasnagar, Maharashtra that operated entirely on word-of-mouth with no digital presence. I designed and built their complete digital setup from scratch: a performant, content-managed storefront that lets a non-technical client run their own catalogue, gallery and pricing — and a separate full-stack CRM (React, Node.js, PostgreSQL) that tracks every customer inquiry through a 9-stage inquiry-to-dispatch workflow with JWT-based role access.

Problem Statement

Local artisan businesses with premium products lose customers to competitors who simply show up on Google. The client's target audience — interior designers, hotels, homeowners — starts their search online. Without a website, Radheshyam Glass House was completely invisible to this discovery channel.

The second, harder problem: even after building a website, who maintains it? The client is non-technical. Any solution requiring a developer for routine content updates would become a bottleneck within weeks. The real product challenge was building something the client could own independently — forever.

Product Thinking

Target users:

Interior designers
Homeowners (premium)
Hotel / office procurement
Business owner (CMS)

Key use cases:

1.Browse product catalogue → enquire via WhatsApp or contact form
2.Estimate project cost → get instant ₹/sqft calculation with no API calls
3.View past project gallery → build trust before reaching out
4.Client adds new products/photos in Sanity → ISR auto-publishes within 1 hour

Key Features

Dynamic product collections

CMS-driven catalogue with categories (Designer Mirrors, Illuminated Mirrors, etc.), with individual detail pages per product driven by slug-based routing.

Live price calculator

H × W input gives instant ₹ estimate at ₹600/sqft base rate. Pure CSR React state — zero API calls. Rate is configurable in lib/constants.ts.

Project gallery

Showcases completed installations (residences, hotels, offices) with Sanity-managed photos served via CDN with auto-format transforms.

Enquiry form + email

Server Route Handler → Resend API → owner's inbox. WhatsApp CTA runs in parallel as a fast-response channel.

Headless CMS studio

Sanity Studio deployed on separate subdomain. Client has Editor-role access to manage products, gallery images, and hero banners independently — zero developer dependency.

CRM — Inquiry to Dispatch

The storefront captures demand; the CRM is where the business acts on it. It is a separate full-stack app — React frontend, Node.js API, PostgreSQL — with JWT-based authentication and role access so the owner and staff see different capabilities.

1.Every enquiry (form or WhatsApp hand-off) becomes a tracked record
2.A 9-stage workflow moves each job from first contact through quotation, approval, production and dispatch
3.Role-based access separates owner-level actions from staff updates
4.Status history gives the owner a single view of what is in progress and what is stuck

Tech Stack with Reasoning

Next.js 14 App Router

ISR support is built-in and zero-config on Vercel. File-system routing maps cleanly to product slugs. Server Components cut client JS bundle for content-heavy pages. Route Handlers replace a separate Express backend for the email endpoint.

Sanity.io

Sanity Studio can be deployed to a dedicated subdomain and given to the client as a standalone admin panel — no account dependency on developer credentials. GROQ is more flexible than REST for nested content queries. CDN image transforms (crop, resize, auto-format) are baked into the URL, so no image processing code needed.

Resend over Nodemailer/SMTP

Serverless functions have execution time limits and cold starts — SMTP connections often time out. Resend's HTTP API is reliable on serverless with better deliverability defaults and a generous free tier.

Vercel

ISR + Edge CDN without infra management. Free tier is sufficient for a local business site with modest traffic. Deploy previews work out of the box.

Architecture & Data Flow

Product page (ISR): Browser → Vercel Edge CDN → Server Component → GROQ query → Sanity CDN
Enquiry form: Form submit → POST /api/contact → Resend API → Owner email
Rendering strategy:
ISR (1hr revalidation) — /collections, /collections/[slug], /gallery
CSR — Price calculator (pure React state, zero API calls)
SSG — /about, /contact

Performance Optimisations

Next.js Image + Sanity CDN URLsAutomatic WebP/AVIF conversion, lazy loading, srcset. Sanity's ?auto=format&w=400&q=75 params cut payload ~55–65%.
Server Components by defaultProduct listing and gallery pages render on the server. Zero JS hydration cost for static content.
ISR caching on Vercel EdgePages served from CDN; content changes reflect within 60 min without touching all cached pages.
lib/constants.ts for static business configZero runtime fetch for base rate, WhatsApp number, contact details. Bundled at build time.

Challenges & Solutions

Challenge 1 — Non-technical client who can't use a GitHub repo or call a dev

The client manages a physical store and has no technical background. Any CMS requiring developer access for updates would break within weeks.

✓ Solution: Deployed Sanity Studio to a dedicated subdomain. The client logs in with their own Sanity account (Editor role). Documented a step-by-step guide covering exactly what they can manage. Zero developer dependency for content — permanently.

Challenge 2 — Pricing is variable — per product and per custom finish

Glass pricing depends on size, thickness, finish, and complexity. A single flat rate calculator would mislead customers.

✓ Solution: Two-layer system. Global base rate in constants.ts for the calculator widget (labelled as indicative). Per-product pricing fields in Sanity for the detail page. Calculator clearly prompts users to contact for custom finishes.

Challenge 3 — ISR content lag — client wants "publish now" behaviour

ISR revalidates every 60 minutes. If the client adds a product, it won't appear immediately.

✓ Solution: Documented the 1-hour revalidation window clearly upfront. For urgent cases, a manual Vercel redeploy takes 30 seconds. Long-term fix: Sanity webhook → Vercel revalidatePath() for on-demand ISR — noted as a future improvement.

Impact & Results

0 → Live

Digital presence built from scratch

~60%

Image payload reduction via CDN + Next/Image

<2s

Target LCP on mobile networks

0 devs

Needed for content updates post-launch

The most meaningful outcome isn't a performance number — it's that a 30-year-old traditional business now has a professional digital storefront that runs without ongoing developer cost. The client manages their own catalogue. That's the real product success metric.

Future Improvements

1Sanity webhook → Vercel revalidatePath() for instant on-demand ISR — removes the 1-hour content lag
2Product search + category filtering with URL state (?category=illuminated) for SEO-friendly discovery at scale
3Move base rate from constants.ts to a Sanity singleton document — full client control, zero code deployment needed
4Google Analytics 4 + WhatsApp CTA click tracking for conversion visibility
5Multi-language support (Marathi / Hindi) for the local customer base