headless-wordpress-development.html

Headless WordPress on Next.js or Astro — keep wp-admin, lose the plugin tax.

WPGraphQL, ACF, Faust.js, ISR, preview mode, full SEO transport. Twelve thousand WordPress sites of practice meet a modern front-end. Editors keep what they know, the public site loses the bloat.

12,000+ WordPress sites shipped WPGraphQL + ACF + Faust.js Next.js, Astro, Nuxt front-ends SEO transport built-in

WHEN IS HEADLESS WORDPRESS THE RIGHT MOVE

Headless WordPress is right when one of three things is true. The default classic WordPress setup is wrong otherwise — headless adds engineering overhead and you should not pay for it without a real reason.

The first reason is performance. A vanilla WordPress site with five or six plugins ships about seven hundred kilobytes of JavaScript before the H1 renders, and with Elementor or Divi plus a typical addon stack, real-world sites ship two to three megabytes on first load. There is a hard ceiling on Lighthouse and CrUX field data even with the best caching plugin in front of it. Headless on a static or ISR Next.js or Astro front-end clears ninety-five plus Lighthouse on shared hosting consistently and the field data follows.

The second reason is engineering experience without losing the editorial team. Engineers who write TypeScript daily get frustrated by the WordPress front-end stack. PHP templates, jQuery, page builder shortcodes — the language is wrong, the tooling is wrong, the deploy story is wrong. Headless lets the engineering team work in a Next.js or Astro codebase with version control, type checking, edge deployment, and component-driven design while editors keep wp-admin, Yoast, and ACF unchanged.

The third reason is multi-destination. A marketing site, a mobile app, an internal portal, and a partner portal all reading from the same content source. Classic WordPress is one CMS, one front-end. Headless WordPress becomes the editorial back-end for whichever destinations you need, each with its own front-end framework optimised for its surface.

WHAT STACK CHOICES MATTER MOST

Three decisions decide most of the engineering story.

The front-end framework is usually Next.js with App Router for marketing sites and apps with auth or interactivity. Astro is the simplest path for content-heavy sites that benefit from static generation and need partial hydration only on specific components. Nuxt is the right choice when the team already runs Vue. We default to Next.js plus WPGraphQL plus a small custom scaffolding rather than Faust.js because Faust ships opinions we sometimes disagree with — but Faust is excellent if you want the framework to make the decisions for you.

The API layer is WPGraphQL by default. Typed query-by-shape API, ACF support via WPGraphQL for ACF, Yoast support via Yoast SEO for WPGraphQL, RankMath equivalent. WP REST works without a plugin and is fine for simple sites, but you fetch more data than you need and there is no schema introspection on the front-end. Reach for REST only when WPGraphQL is blocked by hosting policy or when you have a very small dataset.

Hosting separates the front-end from the back-end. Front-end on Vercel, Netlify, or Cloudflare Pages depending on team preference. Back-end on Cloudways, Kinsta, or WP Engine on a non-public subdomain — cms.yourdomain.com — locked behind Cloudflare Access or an IP allowlist. Public traffic never hits WordPress directly. WordPress becomes invisible from the public web; only your editors know it is there.

HOW DO YOU TRANSPORT EVERYTHING THAT MATTERS

A successful headless WordPress build transports five things from the WordPress side to the public front-end without losing fidelity along the way.

Content is the obvious one — every post, page, custom post type, taxonomy, and ACF field, fetched via WPGraphQL on build or revalidation. Media follows: every uploaded image, with WordPress-side WebP optimisation if available or front-end-side image optimisation otherwise. SEO metadata is the third — Yoast or Rank Math fields bridged via plugin-companion GraphQL schemas, rendered as canonical, title, description, OG, and Twitter card from the typed response.

Schema is the fourth and most teams handle it wrong. We replace plugin-emitted JSON-LD with hand-written templates on the front-end for cleaner output. Article, BlogPosting, Service, Product, BreadcrumbList — all generated from typed data, validated at build time. Redirects are the fifth: anything in Yoast Redirect Manager or the Redirection plugin gets exported and shipped as 301s in vercel.json or _redirects on Netlify, never as JavaScript redirects that lose ranking signal in transit.

The transport is automated. We do not hand-build any of these layers per site. The same scaffolding ships across every headless build we do, which is why the per-site cost has come down over time even as the engineering surface has grown.

WHAT BREAKS AND HOW WE HANDLE IT

Page builders break first. Elementor and Divi inject heavy CSS and HTML into the front-end. None of that runs on a headless front-end. Most migrations ship a content rewrite as part of the project — we extract the content, reformat it to match the new front-end's component library, and skip importing the visual builder layer entirely. Editors get a new, simpler editing UX based on Gutenberg blocks plus ACF flexible content. The content survives, the visual builder does not, and the page weight drops significantly as a side effect.

Comments and forms also need rethinking. Native WordPress comments do not render headless without proxying the rendering. Most teams replace them with Disqus, Giscus, or a custom comment system on the front-end. Forms typically migrate to ConvertKit, HubSpot Forms, or a custom Next.js endpoint hitting an email-sending service. Contact Form 7 and Gravity Forms have headless-friendly versions but require explicit GraphQL integration that adds work.

Front-end plugins are the third thing that breaks. Anything that injects HTML or JavaScript into the WordPress front-end stops working — security plugins, caching plugins, schema plugins, social-share plugins. Each one gets either replaced by code on the front-end or by a managed service. The plugin count typically drops seventy to eighty percent post-migration. That is part of the win, not a regression.

FREQUENTLY ASKED QUESTIONS

What is headless WordPress?

Headless WordPress is a setup where WordPress runs only as the editorial back-end and a separate front-end framework — usually Next.js, Astro, or Nuxt — fetches content via the WordPress REST API or WPGraphQL and renders the public site. Editors keep wp-admin; visitors never touch WordPress directly.

When should I go headless instead of staying classic WordPress?

Go headless when one of three things is true. You need Core Web Vitals north of what plugin-heavy WordPress can deliver. Your team wants modern front-end DX (TypeScript, component frameworks, edge deployment) without losing the WordPress editor. Or you need to power the same content into multiple front-ends — a marketing site, a mobile app, an internal portal — without duplicating the CMS. Otherwise, classic WordPress is faster and cheaper.

WPGraphQL vs WP REST vs Faust.js — which should I use?

WPGraphQL gives you a typed, query-by-shape API and is the default we reach for on Next.js builds. WP REST is built into WordPress core and works without a plugin, but you fetch more data than you need. Faust.js is a Next.js framework specifically for headless WordPress — it bundles WPGraphQL plus auth, preview, and post-type routing, but it locks you into Faust's patterns. Default to WPGraphQL plus your own Next.js scaffolding; reach for Faust when you want the framework to make decisions for you.

Does ACF work in headless WordPress?

Yes. Advanced Custom Fields plus the WPGraphQL for ACF plugin exposes every ACF field group, repeater, flexible content, relationship, and gallery as a typed GraphQL field. We use this pattern on most headless builds — editors get the ACF interface they know, and the front-end gets clean queryable data. Pro license recommended; the free version of ACF works for most fields but flexible content needs Pro.

What about Yoast and Rank Math — do SEO plugins still work?

Partially. The plugins still run on the WordPress side, the SEO data still saves, but none of it reaches the public front-end automatically. We bridge it by exposing Yoast or Rank Math fields through WPGraphQL (Yoast SEO for WPGraphQL, RankMath SEO Schema and Meta), pulling them into the Next.js layout, and rendering canonical, title, description, and Open Graph from the bridged data. Schema needs a separate decision — most teams replace plugin-emitted JSON-LD with hand-written templates on the front-end for cleaner output.

Will Elementor or Gutenberg pages render correctly in headless?

Gutenberg blocks render via WPGraphQL Content Blocks or the core block parser — workable, but the front-end has to handle each block type explicitly. Elementor is harder. The Elementor markup includes layout-specific CSS classes that the front-end must either replicate or replace. Most headless migrations ship a content rewrite as part of the project — we extract the content, reformat it to match the new front-end's component library, and skip importing the visual builder layer entirely.

How do you handle preview, drafts, and editorial workflow?

Preview works through Next.js Draft Mode plus a preview JWT that WordPress mints when an editor clicks Preview. The Next.js app verifies the token, fetches the draft content, and renders it bypassing static generation. Editors see live previews of unpublished work without exposing draft URLs publicly. Comments, revisions, and the rest of the WordPress editorial UX stay exactly as they were.

Where do I host the front-end and the back-end?

Front-end on Vercel, Netlify, or Cloudflare Pages depending on your team. Back-end on a managed WordPress host — Cloudways, Kinsta, or WP Engine — but on a non-public subdomain like cms.yourdomain.com locked to your team's IPs or behind Cloudflare Access. Public traffic never hits WordPress directly; ISR or full static generation serves every public request from the edge.

How much does a headless WordPress build cost?

A headless rebuild of an existing 30-100 page WordPress site runs 25,000-50,000 USD over 8-12 weeks. A new headless build with custom design plus WPGraphQL plus Next.js or Astro plus deployment runs 35,000-90,000 USD over 10-16 weeks. Migration work — moving content, mapping redirects, preserving SEO — is roughly 30-40% of the total.

What are the trade-offs versus staying classic WordPress?

You give up: any plugin that injects HTML into the front-end (most security plugins, some SEO plugins, anything that hooks into wp_footer), live editing through a page builder, and the simplest possible deploy story. You gain: significantly better Core Web Vitals, a modern front-end codebase, the ability to power multiple destinations from one CMS, and freedom from front-end plugin compatibility hell. Worth it for most marketing sites past about 50 pages and almost every site where Core Web Vitals matter to ranking.

Will my SEO survive the migration?

Yes if the migration is done correctly. Three rules. Preserve every URL or 301 it to its new home — no exceptions. Bridge Yoast or Rank Math metadata into the new front-end so titles, descriptions, and canonicals stay identical. Keep schema on every page; if you cannot ship the same schema types, ship better ones. We ship migrations with a redirect map plus a build-time SEO linter that fails the build if any indexed URL would 404 post-migration.

WHAT THE FIRST 48 HOURS LOOK LIKE

Book a 30-minute call. Bring your current WordPress URL, your stack constraints, and what is bothering you about staying classic. By the end of the call you will have an honest read on whether headless is the right move, what the migration looks like for your specific plugins and content, and a price range. If headless is wrong for your project I will tell you to stay where you are.