[ Case study ]
The marketing site — pricing, feature pages, the blog — sat on a legacy templated stack where every page shipped a large JavaScript bundle regardless of content. Field data showed p75 LCP at 4.8s on mobile, and paid acquisition was landing on pages that scored poorly on the exact metrics Google reports publicly.
CLIENT a hiring-platform SaaS company — FOCUS Decide the rendering model per route
Representative examplesEvery case study in this library is an illustrative composite of the kind of engagement we deliver — written to show our method and standards, not to name clients.
Their product helps mid-market recruiters run hiring, and the marketing surface — pricing, feature pages, a high-cadence blog — does heavy paid-acquisition work. Two people run that site part-time while holding other roles. Content lives in a headless CMS the editorial team likes; the template stack in front of it dates from an earlier era and ships the same JavaScript bundle to a pricing page and a blog post alike.
The marketing site — pricing, feature pages, the blog — sat on a legacy templated stack where every page shipped a large JavaScript bundle regardless of content. Field data showed p75 LCP at 4.8s on mobile, and paid acquisition was landing on pages that scored poorly on the exact metrics Google reports publicly.
We proposed a rebuild on Next.js with the rendering model decided per route: content pages render on the server with request caching and ship almost no client JavaScript, while genuinely interactive pieces become small client-side islands. The image and font pipeline gets rebuilt first, because it moves the metric more than any design change. A written performance budget gates every merge in CI, so a regression is a failed check rather than a quarterly surprise. The product app stays untouched; the CMS stays the source of truth.
Just as important is what we ruled out, and why:
Marketing pages moved to server components with request caching; interactive islands stayed client-side by exception — the bundle stopped shipping for content-only routes.
The image and font pipeline (next/image, subsetting, priority hints) was rebuilt before layout work, because it moved LCP more than any design change.
Lighthouse runs against a written budget on every merge, so a regression is a failed check rather than a quarterly surprise.
Delivered by the systems pod — 2 engineers over 10 weeks, with working increments reviewed with the client every week.
Obstacle
Lab scores passed from week two, but real-device field data still showed slow interactions in week six — mid-range Android behavior the lab simply couldn't reproduce.
Handled: We added field Web Vitals monitoring, traced the lag to hydration cost on the pricing table, and split it into a small island; the gap closed.
Obstacle
The headless CMS's cache-invalidation webhooks fired unreliably, so edited pricing pages occasionally served stale numbers after a publish everyone believed had cleared them.
Handled: We added a scheduled revalidation fallback and an editorial clear-cache action, and wired invalidation failures into the operators' channel so silence meant success.
The headline: p75 lcp on mobile marketing pages, 28-day crux window after full rollout — 4.8s → 2.1s, read from CrUX field data. A second check: bounce rate on the five highest-traffic landing pages at −22%.
The two operators stopped treating deploys as events. A merge either passes the budget check or it doesn't, and the weekly metrics email gets skimmed rather than feared. Marketing runs pricing experiments without asking whether the page will survive them. The team's standing joke — don't touch the marketing site before a launch — died somewhere in the second month, and nobody has tried to revive it.
The result was read from CrUX field data against the pre-engagement baseline over the stated window, with a guardrail check on bounce rate on the five highest-traffic landing pages. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.
What we would do differently
We would have instrumented INP from week one — the lab passes looked clean while real-device interaction lag persisted until week six.
[ Related service ]
[ Related builds ]
9 installs 1 adminSites maintained from one WordPress admin, migration completed over 9 weeks
3 weeks 4 daysMedian landing-page turnaround, measured across the first 12 campaign pages post-handover
[ Next step ]
Next case study