← Library

Headless WordPress: when it pays off and when it is a waste

Headless WordPress fixes LCP and INP on corporate sites built with page builders, at the cost of two deploys. See when it pays off and when it is a waste.

Servers and infrastructureSeptember 16, 202610 min read

The short answer

Headless WordPress means using WordPress only as a content database and delivering pages through another front end, which makes sense for a corporate site whose HTML is already bogged down by a page builder and piled-up plugins. The gain is concrete where it hurts: visitors receive ready-made HTML instead of waiting for PHP to build the page on every visit. So is the cost: two deploys, two environments to monitor and an editor who loses drag-and-drop layout. If whoever publishes today changes whole sections alone in the builder, headless transfers that power to development, and that is a process decision, not a technology one. For a store, headless is the wrong remedy: catalog, cart and checkout call for an e-commerce platform, not an extra layer. The right question is not whether it gets faster, it is how much of your content changes each week and who changes it.

1. What headless actually changes

In traditional WordPress, every visit triggers PHP, queries the database, runs the filters of the active plugins, builds the HTML and returns it. The theme decides the markup, the page builder injects its own structure, and every plugin that registers a script or style joins the browser's queue. Official requirements: PHP 8.3 or higher and MariaDB 10.11 or higher (or MySQL 8.0 or higher), with HTTPS, according to the WordPress.org requirements page read on 2026-09-16.

In the headless version, WordPress keeps running with PHP and a database, but no public visitor hits it. It responds with JSON through the REST API, which the documentation describes as the foundation of the block editor, or GraphQL via WPGraphQL. A site generator (Next.js, Astro, Nuxt) consumes that data at build time and publishes ready-made HTML and CSS to a CDN.

Three things really change:

  • The visitor's critical path no longer goes through PHP, the database and the plugin queue.
  • The markup is now written by whoever builds the front end, not by the builder.
  • Publishing content is no longer the same as publishing a page: a build or revalidation step comes in.

What does not change: the admin still exists and still needs updates, backups and login protection. Headless is not a security plan. The dashboard is only less exposed because it stops being the front door for traffic.

A detail the documentation makes explicit

The REST API Handbook itself warns: "You do not need to use the REST API to build a WordPress theme or plugin." Headless is a choice, not a natural evolution. Whoever says otherwise is selling architecture.

2. The numbers that justify (or sink) the project

Before changing architecture, look at field data, not gut feeling. CrUX gathers data from real Chrome users and powers the page experience factor in Google Search, according to the Chrome for Developers documentation read on 2026-09-16. PageSpeed Insights shows that data for any public URL, without installing anything.

Reference Good value Poor value Source (read on 2026-09-16)
LCP, field 75th percentile 2.5 s or less above 4 s web.dev, Largest Contentful Paint
INP, field 75th percentile 200 ms or less above 500 ms web.dev, Interaction to Next Paint
Lighthouse performance score 90 to 100 0 to 49 Chrome for Developers, Lighthouse performance scoring

Two traps. The first: the Lighthouse score is a weighted average of lab metrics and the weights have changed between versions, according to the documentation itself. Chasing the score instead of field LCP and INP is optimizing the thermometer. The second: not every site has CrUX data. The official methodology requires the page to be publicly discoverable and to have enough visitors, and it excludes Chrome on iOS, Android WebView and other Chromium browsers. A small corporate site usually shows up only at the origin level, or not at all.

If field LCP on mobile is well above 2.5 seconds and the report points to render blocking and third-party JavaScript, you have a delivery problem. If LCP is within 2.5 seconds and the complaint is a slow admin for the editor, headless solves nothing: the admin stays the same.

3. Where headless really wins

Three scenarios where the switch pays for itself:

A corporate site with a heavy page builder and content that barely changes. Landing pages, service pages, team pages. Generating HTML once and serving it from a CDN removes PHP, the database and much of the builder's JavaScript from the visitor's path.

Content that needs to appear in more than one place. The same post feeding the site, an app and an internal dashboard. Here WordPress becomes a content source with an API, which is what the REST API was built to be.

A front end with requirements the theme cannot meet. A stateful interface, instant search, integration with an in-house system. Writing that on top of a third-party theme costs more than writing it directly.

And the case where it is almost always a waste: a five-page site, low traffic, edited by one person in the builder. There, decent hosting, trimmed plugins, compressed images and caching deliver most of the gain, without changing the process.

4. The real cost: two deploys and the layout taken away from marketing

This is the point that disappears from sales decks. Headless does not add a tool, it adds a whole system.

You now have two environments: WordPress (PHP, database, backups, plugins) and the front end (build, deploy, CDN, logs). Two places where a deploy can break, two sets of credentials. When the site goes down, the first question becomes "which of the two".

The second cost is political. In the builder, the editor drags in a new section and publishes. In headless, the section only exists if someone has created the matching block in the front end. Content inside existing fields stays free; a new layout becomes a development task. Acceptable for a team with a request queue, unbearable where marketing publishes alone on Friday night.

The third cost is the list the theme gave you for free and that you now rebuild: forms, search, pagination, sitemap, SEO tags, breadcrumbs, feed, old URL redirects, draft preview. None of them is hard on its own. Together, they are weeks.

Item Traditional WordPress Headless WordPress
Production environments 1 2
Publish text in an existing field immediate build or revalidation
Create a new layout section editor does it in the builder development task
Forms, search, sitemap, SEO plugin or theme rebuilt in the front end
Dashboard exposed to public traffic yes no, but it still exists

5. How content reaches the front end

Two official doors, and the choice changes the work.

The REST API is built in: it delivers JSON and responds at /wp-json/wp/v2/. A detail that shows up early: per_page is capped at 100 records per request, and the response includes the X-WP-Total and X-WP-TotalPages headers, according to the pagination documentation read on 2026-09-16. A site with 900 posts means nine requests at build time, not one.

curl -sI "https://exemplo.com.br/wp-json/wp/v2/posts?per_page=100" \
  | grep -i "x-wp-total"

WPGraphQL is the other door: a free, open-source plugin that exposes an extendable GraphQL schema for any WordPress site, according to the official documentation read on 2026-09-16. The advantage is requesting only the fields you use, instead of receiving the whole post object and discarding half of it.

For non-public content (drafts, preview), authentication goes through Application Passwords, which have their own REST API endpoint and record last_used and last_ip per password, according to the official reference.

A security rule, no beating around the bush: an application password is a production credential. It lives in a build environment variable, never in the repository, never in a versioned file, never pasted into a ticket. Each consumer gets its own, so that revoking one does not stop the others.

6. Publishing content without rebuilding the whole site

The editor's legitimate fear: fixing a comma and waiting ten minutes for a build. The answer is incremental revalidation.

In Next.js, ISR revalidates a static page by time or on demand. The documentation for version 16.3.5, read on 2026-09-16, describes revalidatePath and revalidateTag to invalidate the cache without a full rebuild, and lists three limits that change the project: it only works on the Node.js runtime, it does not work with static export, and the disk cache is per instance when you run several, which requires a shared cache handler.

export const revalidate = 3600

The same documentation carries a warning that avoids arguments later: "revalidatePath invalidates the cache entries but regeneration happens on the next request." In other words, the editor publishes, the cache is marked stale, and the new page appears when someone requests that URL. To check, the x-nextjs-cache header responds HIT, STALE, MISS or REVALIDATED.

curl -sI https://seusite.com.br/blog/post | grep -i x-nextjs-cache

The trigger comes from WordPress: a webhook on save_post calls the front end's revalidation route with a shared secret. Without that, the update waits for the configured time.

Astro solves the same problem another way, with on-demand rendering per route via an adapter. The choice between the two matters less than closing the operational question: who presses the button and how long until the page changes.

7. A store is a different problem, and headless is not the answer

Here the math changes in nature. A store has a catalog with stock, a cart with state, checkout with payment, calculated shipping, coupons, invoices. A headless front end in front of WooCommerce does not remove any of these pieces: it keeps all of WooCommerce running and adds another layer to keep in sync.

Worse: what hurts most in a store is precisely what is dynamic. Products with real-time stock, cart and checkout are not static. The gain from pre-rendered HTML shrinks exactly where the money comes in, and the maintenance cost stays whole.

The security and maintenance angle of WooCommerce is already detailed in Is WooCommerce still safe? Plugins, piracy, spam and why migrate to Shopify. Here the point is architectural: headless on a store adds complexity to attack a symptom, when the diagnosis is the platform. A store with performance and maintenance pain goes to a hosted e-commerce platform, where checkout, catalog and CDN already come solved by the vendor.

The honest exception: a large operation, with a dedicated team and front-end requirements the platform cannot meet. Then the conversation is about a decoupled storefront, not about headless WordPress.

8. The cheap path before changing architecture

Before deciding, spend an afternoon on diagnosis. In order:

  1. Run PageSpeed Insights on the home page and two inner pages, mobile and desktop, and write down the 75th percentile field LCP and INP with the date. Without field data, the site does not have CrUX volume and the decision rests on lab data alone.
  2. List the active plugins and mark those unused in the last ninety days. Each one removed takes scripts and queries out of the path.
  3. Check PHP and the database against the official requirements: PHP 8.3 or higher and MariaDB 10.11 or higher, or MySQL 8.0 or higher.
  4. Check caching, compression and image formats. A large image without defined dimensions is a common cause of poor LCP and of jumping layouts.
  5. Only then ask: does the remaining slowness come from PHP building the page on every visit, or from the weight of what the page loads?

If it comes from page weight, headless changes almost nothing: the same JavaScript and the same images will travel. If it comes from the server building the page, and the content changes little, then the conversation makes sense.

A VPS with up-to-date PHP, page caching and optimized images solves most cases for a fraction of the cost. Swapping bad hosting for adequate hosting is reversible in a weekend. Swapping architecture is not.

Frequently asked questions

Is headless WordPress worth it for a ten-page site?

Most of the time, no. A small site with static content gains almost the same from adequate hosting, trimmed plugins, caching and optimized images, without inheriting two deploys. Headless pays off when there is a volume of pages, more than one channel consuming the same content, or a front end with requirements the theme cannot meet.

Does headless make WordPress more secure?

It reduces exposure, it does not eliminate risk. The dashboard stops being the door for public traffic, but it stays online and still needs updates, backups and login protection. Application Passwords help because they record last_used and last_ip per password, which lets you revoke one integration without taking down the others.

Will the editor lose control of the content?

Of the content, no. Of the layout, partly yes. Text, images and existing fields remain editable in the usual admin. What slips out of the publisher's hands is creating a new section by dragging blocks: it now depends on a component in the front end. If marketing builds a new page alone every week, that friction is the main reason not to migrate.

Can I publish without waiting for the full build?

Yes, with incremental revalidation. Next.js ISR revalidates by time or on demand, with revalidatePath and revalidateTag, and the official documentation makes clear that invalidation marks the cache as stale and regeneration happens on the next request. Check the limits: it only runs on the Node.js runtime, it does not work with static export, and with several instances the disk cache is per instance.

Can I use headless on my WooCommerce store?

Technically yes; in practice it adds complexity without attacking the cause. Cart, checkout and real-time stock are dynamic, so the gain from pre-rendered HTML shrinks exactly where the store makes money, and all of WooCommerce keeps running behind it. At that point the discussion is about the platform, not an extra layer.

Conclusion

Headless is a trade, not an upgrade: you buy faster delivery of corporate pages and pay with two environments, two deploys and the layout slipping out of the publishers' hands. The decision comes down to two questions, answered with field data from PageSpeed Insights and with the editors' routine: does the slowness come from the server building the page or from the weight of what the page loads, and how many times a week does someone need to create a new section on their own. For a store, the answer comes before architecture: the path is an e-commerce platform, and the reasoning is in Is WooCommerce still safe? Plugins, piracy, spam and why migrate to Shopify. If what you need is WordPress content feeding your own front end, an app or an internal system, that is a custom integration (REST, GraphQL, revalidation webhook, queue). Describe the site, send the URL and tell me who edits the content today at oailton.dev/en/contato.

Sources

  1. 01For LCP, good is 2.5 seconds or less, poor is above 4.0 seconds and in between needs improvement, measured at the 75th percentile of page loads, segmented by desktop and mobile (read on 2026-09-16) web.dev, Largest Contentful Paint (LCP)
  2. 02An INP of 200 ms or less is considered good responsiveness; above 500 ms is poor; the range between 200 ms and 500 ms needs improvement (read on 2026-09-16) web.dev, Interaction to Next Paint (INP)
  3. 03The Lighthouse performance score is a weighted average of metrics, with ranges 0 to 49 (poor), 50 to 89 (needs improvement) and 90 to 100 (good), and the weights have changed over time (read on 2026-09-16) Chrome for Developers, Lighthouse performance scoring
  4. 04CrUX is the dataset of real Chrome users that Google Search uses to power the page experience ranking factor (read on 2026-09-16) Chrome for Developers, Overview of CrUX
  5. 05To be included in CrUX a page must be publicly discoverable and have enough visitors; Chrome on iOS, Android WebView and other Chromium browsers are not included in the dataset (read on 2026-09-16) Chrome for Developers, CrUX methodology
  6. 06WordPress recommends PHP 8.3 or higher, MariaDB 10.11 or higher or MySQL 8.0 or higher, and HTTPS support (read on 2026-09-16) WordPress.org, Requirements
  7. 07The WordPress REST API delivers data as JSON, is the foundation of the block editor, and the documentation itself says it is not required to build a theme or plugin (read on 2026-09-16) WordPress Developer Resources, REST API Handbook
  8. 08The REST API per_page parameter is capped at 100 records per request, and the response includes the X-WP-Total and X-WP-TotalPages headers (read on 2026-09-16) WordPress Developer Resources, Pagination
  9. 09Application Passwords are managed through their own REST API endpoint and record the last_used and last_ip fields for each application password (read on 2026-09-16) WordPress Developer Resources, Application Passwords
  10. 10WPGraphQL is a free, open-source WordPress plugin that exposes an extendable GraphQL schema for any WordPress site (read on 2026-09-16) WPGraphQL Docs, Introduction
  11. 11Next.js ISR revalidates static pages by time or on demand with revalidatePath and revalidateTag, requires the Node.js runtime, does not work with static export and exposes the x-nextjs-cache header with HIT, STALE, MISS or REVALIDATED (documentation for version 16.3.5, read on 2026-09-16) Next.js Docs, Incremental Static Regeneration (ISR)

Ailton Carvalho

I build custom web systems, internal tools, integrations and stores that sell on mobile. You get working code and someone accountable after launch.

Talk on WhatsApp

Related