Headless & Composable
Drupal or WordPress as a content API behind React front ends — when it is worth it, and when it is not.
Decoupling the CMS from the front end buys multi-channel delivery, independent release cycles and rendering flexibility. It also costs you preview, layout tooling, menus, redirects and forms — things the CMS previously gave you free. This is what the work actually involves on both sides of that trade.
The first deliverable is usually a recommendation rather than a build. Headless earns its cost where content genuinely feeds several consumers — a website, an app, signage, a partner feed — or where the front end has its own team and release cadence.
For a single web front end it typically means rebuilding capability you already had. I have advised against decoupling more than once, and it is a cheaper conversation to have during discovery than three months into a build.
Drupal ships JSON:API in core, which handles filtering, includes and sparse fieldsets without custom endpoints and covers most requirements. GraphQL suits front ends that need to shape queries precisely, at the cost of more setup and real care around caching and query complexity limits. Custom REST endpoints remain right where a purpose-built payload matters.
Whichever is chosen, the same concerns follow: authentication, rate limiting, response caching with correct invalidation, and versioning so front-end and back-end deploys do not have to be simultaneous.
The choice that determines both performance and how much there is to operate. Static generation performs best and is most resilient, but needs a build on content change — which becomes painful above a certain page count. Server-side rendering handles frequently changing content and puts a Node process in the critical path. Incremental regeneration sits between them and is usually the pragmatic answer.
Caching gets harder rather than easier: there are now layers in Drupal, at the API, in the front end and at the CDN, and invalidation has to propagate through all of them. Getting Drupal cache tags to drive CDN purges is a specific piece of engineering worth planning for rather than discovering late.
The most underestimated part of any headless build, and the one that most often decides whether the platform is adopted or resented. Editors need unpublished changes rendered as they will appear, which means the front end fetching draft content with authentication and a preview deployment existing at all.
Menus, redirects, sitemap generation, forms and search each become explicit tasks too. A content team that cannot see what they are publishing will route around the system, and no amount of architectural elegance compensates for that.
Decoupled sites rank fine when pages are rendered server-side or statically with correct metadata, structured data, canonical URLs and a sitemap. The failure mode is a purely client-rendered front end where crawlers receive an empty shell — a decision to make deliberately at the start rather than discover when traffic falls.
Client identities and confidential implementation details are intentionally omitted here. Happy to talk through the specifics of your situation directly.
Start a conversation