Concetto Labs
Corporate portal rebuild for an India-based engineering studio. Sanity-driven content, Next.js front end on Vercel, faster lead-form turnaround, cleaner case-study layout.
About the project.
A full corporate portal rebuild for an India-based engineering studio that had outgrown its old WordPress stack. The new site runs on Next.js with Sanity as the content layer, deployed on Vercel for instant previews. I rebuilt the case-study layout, the services pages, and the lead-form pipeline so the sales team gets a clean handoff without copying fields into a spreadsheet. The goal was to make their portfolio read like the work itself: precise, technical, no decoration.
What changed.
from kickoff to launch
visual regressions in production
What we walked into.
An India-based engineering studio had outgrown its old WordPress portal — slow editor experience, case studies that copy-pasted from spreadsheets, lead form that dropped into an inbox no one read.
What we did.
Full rebuild on Next.js 14 with Sanity as the content layer, deployed on Vercel with instant previews. Rewrote case-study layout, services pages, and a lead-form pipeline that pushes into the sales tooling without manual transcription.
What it became.
Faster editorial workflow, cleaner case studies, sales team gets a structured handoff in their existing CRM — no more spreadsheet round-trip.
My role on this project.
Solo · 100% engineering ownership. The client supplied the copy and the brand direction; I owned the Sanity schema, the Next.js front end, the lead-pipeline wiring, and the Vercel deployment. The Sanity schema was designed so their non-technical writers can publish case studies in 30 minutes without engineering involvement.
Schema designer (Sanity)
Modelled case studies, services, team, testimonials, and lead-form payloads in a way that scales as the agency adds verticals. Portable Text for rich bodies; structured references for technology stacks.
Front-end engineer
Next.js 14 App Router, ISR for content surfaces, full responsive design, accessibility baseline (WCAG AA on the major templates).
Lead pipeline engineer
Form submissions push into the agency's CRM via webhook + idempotency key; sales team sees structured payload (project type, budget, timeline) without manual entry.
DevOps / deploy
Vercel + Sanity preview integrations so editors see drafts live before publish. Custom domain, edge caching, daily Sanity content snapshots.
The numbers that matter.
- <200msTTFB · p75Vercel edge cache + Next.js ISR. Measured from US + EU + India edges.
- ~10× fasterEditorial publish timeAnecdotal — staff feedback. Sanity Portable Text vs. previous Gutenberg flow.
- 100/100Lighthouse SEO scoreOn the case-study + services templates. Verified post-launch.
- ZeroLost lead submissionsIdempotent webhook + retry queue replaced the previous "mailto:" form.
- 0 lock-inPortable content modelSanity export is JSON — agency owns the data and could move off Sanity in days if needed.
What was actually broken.
A services agency lives or dies on its portfolio page. If the case studies look generic, the sales pipeline stalls. The old site's editor experience was so painful that case studies went up months after the project shipped — by which point the engineer who built it had moved on and the write-up was 70% accuracy. The brief was a publishing workflow that takes 30 minutes per case study, not 3 hours, and a case-study layout that signals "we engineer real systems," not "we have a stock-photo template."
The hard surface area.
- 01Editorial flow has to be 10× faster than the legacy WordPress flow or the team will not adopt it. Sanity Portable Text + custom blocks were the bet.
- 02Case-study layout must communicate engineering depth without becoming a wall of text. Required a flexible block-based template with code-snippet support + diagram embeds.
- 03Lead-form payload needs to route into the agency's existing CRM (not a fresh DB) with idempotency so a flaky webhook does not create duplicate leads.
- 04Bilingual (English + Hindi) was deferred to v2 — the schema accommodates it, but v1 is English-only.
- 05Preview-on-draft for editors: any change in Sanity must be visible on a draft URL before publish, with no engineering involvement.
Engineering wins worth naming.
Sanity schema that scales without becoming spaghetti
Modelled the 8 core content types (caseStudy, service, person, testimonial, post, page, technology, vertical) with strict references — not embedded duplicates. Adding a new vertical adds one document, not one schema migration.
Idempotent lead-pipeline webhook
Form POST generates a UUID client-side, server stores it before pushing to CRM, CRM webhook reply marks success. A retry on flaky network never creates two leads in the CRM.
Draft previews without exposing draft data
Sanity preview tokens scoped per editor session; draft URLs are signed and expire in 7 days. Public crawlers never see drafts.
How the system is wired.
Edge tier
Application tier
Data tier
The decisions behind each choice.
Next.js 14 + Vercel
- ISR + on-demand revalidation lets editors publish without rebuilding the whole site — change goes live in seconds.
- Edge runtime + RSC give the case-study pages near-static performance with full database personalisation when needed.
- Vercel preview deployments make every PR clickable without manual setup.
Sanity over Contentful/Strapi
- Portable Text is the cleanest rich-text format I have used — JSON-native, custom block types are first-class, editor experience is fast.
- Embedded Studio (same domain, no separate login) cuts editor friction massively.
- Pricing scales with API queries, not seats — fits a services agency where many people read content occasionally.
Idempotent webhooks over direct DB writes
- CRM is the source of truth for leads. Writing to a sidecar DB and syncing later creates two truths that drift.
- Idempotency key client-generated ensures retries are safe.
What the build taught us.
- Editorial speed determines content velocity. If publishing takes 3 hours, case studies will be 6 months late. If it takes 30 minutes, they go up the week the project ships.
- Portable Text earns its place. JSON-native rich text gives you everything Markdown lacks (custom blocks, references, partial fragments) without locking you in.
- Webhook idempotency is the cheapest insurance you can buy. Add it before you need it.
