A mid-market publisher came to us with a familiar problem: their WordPress site was slow, and it was costing them money. Pages took 4-6 seconds to load on mobile. Bounce rates were climbing. Their editorial team was fighting a bloated admin panel with 47 plugins, and every update felt like defusing a bomb.
Six weeks later, their site loaded in under 2 seconds. Here's what we did and why it worked.
The client ran a content-heavy site — roughly 1,200 published pages across news articles, evergreen guides, landing pages, and a product catalog. Their WordPress instance had been running for eight years, accumulating technical debt the way old houses accumulate coats of paint.
The symptoms were obvious:
Their Google PageSpeed score hovered around 35 on mobile. Core Web Vitals were failing across the board. They were watching competitors with faster sites climb past them in search rankings.
The first question we always ask: does this actually need a migration, or can we fix what's there?
We spent two days auditing the existing setup. The conclusion: patching WordPress would buy them incremental gains, but the architecture itself was the bottleneck. Every page request triggered a full server-side render through a chain of PHP templates, database queries, and plugin hooks. Caching helped, but cache invalidation was unreliable — editors would publish a change and wait 20 minutes to see it live.
The case for going headless came down to three things:
We moved them to a three-layer stack:
| Layer | Before | After |
|---|---|---|
| CMS | WordPress (monolithic) | Headless CMS with structured content models |
| Frontend | PHP theme (server-rendered) | Next.js with static generation + ISR |
| Hosting | Single VPS, no CDN | Edge-deployed with global CDN |
| Images | Unoptimized uploads | Automatic WebP, responsive srcsets, lazy loading |
We exported all 1,200 pages from WordPress using the REST API and WP-CLI. Our AI-assisted migration pipeline handled the content transformation — mapping WordPress blocks and custom fields to structured content types in the new CMS. The pipeline flagged 68 pages (about 5.7%) that needed manual review, mostly due to complex shortcode usage or custom HTML that didn't map cleanly to structured blocks.
Total migration time: 4 days, including the manual review pass.
The Next.js frontend used static site generation (SSG) for all content pages, with incremental static regeneration (ISR) so editors could publish changes and see them live within 60 seconds — without triggering a full rebuild.
Key performance decisions:
Pages deploy to edge nodes worldwide. A reader in Tokyo gets served from Tokyo. A reader in London gets served from London. The old setup routed every request through a single server in Virginia regardless of where the reader was.
We measured performance two weeks after launch, once traffic patterns had normalized:
| Metric | Before | After | Change |
|---|---|---|---|
| Mobile page load | 4.8s | 1.9s | -60% |
| Desktop page load | 3.1s | 1.2s | -61% |
| Largest Contentful Paint | 5.2s | 1.8s | -65% |
| PageSpeed score (mobile) | 35 | 92 | +163% |
| Time to First Byte | 1.4s | 0.08s | -94% |
| Bounce rate | 58% | 41% | -29% |
The Time to First Byte improvement tells the real story. Going from 1.4 seconds to 80 milliseconds means the server response is essentially instant — the page is already built and sitting on a CDN edge node waiting to be served.
Performance wasn't the only win. The content team's workflow improved significantly:
No project is perfect. A few things we'd adjust next time:
A headless migration makes sense when your content is relatively structured, your WordPress instance is fighting you on performance or editorial experience, and you have the budget for a proper rebuild — not just a reskin.
It does not make sense if WordPress is working fine for your team, your performance issues can be solved with better hosting and a CDN, or your site is small enough that the migration overhead exceeds the benefit.
If you're on the fence, we're happy to do a quick audit and give you an honest recommendation — even if that recommendation is "stay on WordPress."
Get in touch and we'll take a look.