The Real Question Is Not Technical
Every week I get a message from a business owner or developer asking whether they should use WordPress or switch to a headless CMS like Contentful, Sanity, or Strapi. After helping 30+ clients navigate this decision, I have learned the answer depends almost entirely on who will manage the content, not on technical benchmarks.
WordPress powers 43% of the web for a reason: the admin interface is the best content editing experience ever built for non-technical users. Headless CMSes are powerful but they all have steeper learning curves, higher monthly costs, and vendor lock-in risks. Before you migrate anything, ask: who writes the content and what do they need?
When WordPress Wins
WordPress is the right choice when your content team is not technical, when you need a wide plugin ecosystem, when budget is tight, and when time to launch matters. A well-built WordPress site with a quality theme, proper caching (WP Rocket or LiteSpeed Cache), and a CDN will score 90+ on Lighthouse and handle tens of thousands of monthly visitors without issue. The performance gap between WordPress and headless is much smaller than the headless community suggests, once you apply basic optimization.
WordPress also wins on total cost of ownership for most small and medium businesses. Hosting costs $10-30 per month. The plugin ecosystem solves 80% of common requirements without custom development. Content editors need zero training — they already know how to use it. When I am building a site for a local business, an e-commerce store under $2M GMV, or a content site with a small team, WordPress is almost always the correct recommendation.
Key insight: A WordPress site with WP Rocket, Cloudflare CDN, and WebP images will outperform a poorly-optimized Next.js site in real-world Core Web Vitals. Performance is about implementation quality, not the CMS.
When Headless Wins
Headless architecture earns its complexity premium in specific scenarios. Multi-channel publishing — same content on web, mobile app, digital signage, and smart TV — is the textbook headless use case. When your content needs to live in one place and render in five different contexts, a headless API is the only sane architecture.
Developer experience is the second scenario. If your team is Next.js-native and finds WordPress theme development painful, the productivity gain from a headless setup often justifies the additional infrastructure. TypeScript-first development, component-based architecture, and modern CI/CD pipelines are dramatically easier with a headless frontend than with classic WordPress theme development.
The third scenario is scale. At 10M+ monthly pageviews, WordPress starts showing cracks regardless of your caching strategy. A Next.js frontend with static generation can serve those pages from a CDN edge with zero server compute per request. WooCommerce at large transaction volumes also benefits enormously from a headless checkout built on a purpose-built commerce API.
The Hybrid Setup: Best of Both Worlds
The setup I use most often for serious projects is WordPress as a headless CMS paired with a Next.js frontend. WordPress handles content management — your editors get the familiar Gutenberg editor, ACF fields, and the full plugin ecosystem for SEO (Yoast), forms (Gravity Forms), and media management. Next.js handles the frontend — ISR (Incremental Static Regeneration) means pages rebuild automatically when content changes, with sub-second TTFB from CDN edge.
Setting Up WPGraphQL
# Install WPGraphQL plugin via WP-CLI
wp plugin install wp-graphql --activate
# Install WPGraphQL for ACF if you use Advanced Custom Fields
wp plugin install wpgraphql-acf --activate
// lib/wordpress.ts — fetch posts from WordPress GraphQL API
const WP_API = process.env.NEXT_PUBLIC_WP_GRAPHQL_URL!;
export async function getAllPosts() {
const query = `
query GetAllPosts {
posts(first: 100, where: { status: PUBLISH }) {
nodes {
slug
title
excerpt
date
featuredImage {
node { sourceUrl altText }
}
categories {
nodes { name slug }
}
author {
node { name }
}
}
}
}
`;
const res = await fetch(WP_API, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query }),
next: { revalidate: 60 },
});
const { data } = await res.json();
return data.posts.nodes;
}
export async function getPostBySlug(slug: string) {
const query = `
query GetPost($slug: ID!) {
post(id: $slug, idType: SLUG) {
title
content
date
modified
seo { title description }
featuredImage {
node { sourceUrl altText width height }
}
}
}
`;
const res = await fetch(WP_API, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query, variables: { slug } }),
next: { revalidate: 60 },
});
const { data } = await res.json();
return data.post;
}
Migration Strategy
If you have an existing WordPress site and want to go headless, do not rewrite everything at once. Use a strangler fig pattern: stand up the Next.js frontend, migrate the highest-traffic pages first (usually homepage and top blog posts), and leave the lower-traffic pages on WordPress temporarily. Vercel's rewrites can proxy specific paths to your WordPress install while the rest serves from Next.js.
Measure Core Web Vitals before and after each batch of pages you migrate. The performance improvements are usually dramatic enough to justify the investment to stakeholders, which keeps the migration project funded through completion.
Cost Comparison
Traditional WordPress on managed hosting (WP Engine or Kinsta): $30-100/month. This covers everything — server, CDN, backups, and updates. Headless WordPress + Next.js on Vercel: $20-25/month for WordPress hosting + Vercel Pro ($20/month) for the frontend = $40-45/month minimum. Add Cloudflare for CDN, and you are at roughly the same cost with more operational complexity.
The cost calculus changes at scale. At 1M+ monthly pageviews, managed WordPress hosting jumps to $200-500+/month. A static Next.js frontend on Vercel serves those same pages for $20/month because there is no PHP execution cost per request. Headless becomes the economical choice above roughly 300k monthly visitors.