Skip to content
QuantmHill

Case study — SaaS

1.2s LCP, +19% trial conversion

The six-year-old React SPA behind a US course-authoring SaaS was losing signups to its own load time. A route-by-route replatform took LCP from 4.3s to 1.2s — and trial conversion followed.

Client

Course-authoring SaaS · US

Industry

SaaS

Services

Web & frontendCustom software

Timeline

16 weeks · team of 4

Results

median LCP, down from 4.3s
1.2s
trial-to-paid conversion
+19%
JavaScript at first paint
−54%

Illustrative figures from anonymized engagement profiles.

The challenge

The client, a US course-authoring SaaS, sells to corporate learning teams — about 900 customers on a product that had grown for six years as a client-rendered React single-page app. The bundle had grown with it: 1.9MB of JavaScript before a visitor saw anything, a 4.3s median LCP on the signup flow, and marketing pages Google indexed inconsistently because their content arrived only after hydration.

The commercial cost was measurable. Session recordings showed trial signups abandoning while spinners spun, and the growth team’s experiments kept losing to a baseline they couldn’t beat, because every variant paid the same 4.3-second tax. Inside engineering, estimates kept inflating — a shared webpack config from 2019, three overlapping state libraries, and a components folder nobody dared reorganize.

A full rewrite had been proposed twice and rejected twice, correctly: the client ships weekly and could not afford a release freeze. The mandate we took was narrower and harder — replatform the frontend without stopping the roadmap, and prove the payoff in conversion, not just in Lighthouse scores.

The approach

We migrated route by route rather than all at once. A reverse proxy in front of the app let us move one route at a time onto a new Next.js App Router codebase — starting with the marketing pages and the signup funnel, where speed pays back fastest — while the legacy SPA kept serving everything else. Every migrated route sat behind a feature flag with instant rollback, and traffic shifted in stages: 5%, 25%, then 100%.

The new stack leaned on React Server Components to ship HTML instead of JavaScript. Data fetching moved server-side, marketing content became statically generated with incremental revalidation, and interactive islands hydrated only where users actually interact. Fonts were subset and self-hosted, images went through next/image with explicit dimensions, and 380kB of legacy polyfills simply left. Alongside the migration we extracted a token-based component library, so old and new routes stayed visually identical during the transition.

Measurement was part of the build, not an afterthought. Real-user Core Web Vitals streamed to a dashboard split by route and cohort, and the trial funnel ran as a controlled experiment — legacy versus replatformed — so the conversion claim would survive scrutiny from the growth team rather than rest on lab numbers.

The result

Median LCP on the signup flow landed at 1.2 seconds, down from 4.3, and JavaScript shipped to first paint fell 54%. The controlled experiment settled the question that mattered: trial-to-paid conversion rose 19% on replatformed routes and held across two full billing cycles.

Sixteen weeks in, the legacy SPA served only low-traffic admin routes, and the client’s own engineers were shipping features on the new stack — they had been merging code into it since week three. Template and course-library pages, indexable at last, became the growth team’s cheapest signup channel the following quarter.

We’d been told a replatform meant a year of feature freeze. QuantmHill shipped it route by route while we kept releasing weekly — and the conversion lift paid for the project before it finished.
Chief product officer Course-authoring SaaS · US
Abstract illustration of layered interface panels in violet and ink with fine motion lines sweeping through them
Project imagery — placeholder artwork

Facing a similar problem?

Tell us where you're headed. We'll reply within one business day with an honest read on whether we can help.