guide

Best Headless CMS Options : An Engineering Comparison

Best Headless CMS Options : An Engineering Comparison
NC 15 min read

Most headless CMS comparisons rank platforms with scores that nobody can reproduce. This one doesn't, because the ranking depends entirely on constraints that differ between teams — and the platform that's obviously right for a TypeScript team with three developers is obviously wrong for a publisher with forty editors.

What follows is a comparison on characteristics you can verify yourself: API style, hosting model, schema approach, and where each platform's design actually points. Then a selection framework based on your constraints rather than a feature checklist.

The decision splits on three axes before you look at any individual platform — managed SaaS vs. self-hosted, GraphQL vs. REST vs. query-language, and schema-in-UI vs. schema-as-code. Answer those three and most platforms eliminate themselves. Then test with your actual editors before committing, because editor adoption fails more CMS projects than API limitations do.


Three Decisions That Narrow the Field

Work through these before evaluating individual platforms. They eliminate most options quickly.

1. Managed or self-hosted?

Managed SaaS

Self-hosted

You operate

Nothing

Database, storage, CDN, monitoring, patching

Data location

Vendor's infrastructure

Yours

Scaling

Handled

Your responsibility

Customization

Within platform limits

Unlimited

Cost shape

Predictable subscription

Infrastructure plus engineering time

Compliance

Depends on vendor certifications

Depends on your controls

The honest trade: self-hosting is cheaper on licensing and more expensive in attention. A self-hosted CMS needs a database, object storage for media, a CDN, monitoring, backups, and someone to apply security patches. That's real ongoing work, and it's the cost most comparisons omit.

Self-hosting becomes clearly right when you have data residency requirements, need deep customization, or already run infrastructure and have the operational capacity.

2. What query interface do you want?

REST is simple and universally understood. The cost is over-fetching and multiple round trips for related content — fetching an article, then its author, then related posts.

GraphQL lets clients request exactly the shape they need in one request. The cost is complexity: query depth limits, caching that's harder than REST, and a learning curve.

Proprietary query languages (Sanity's GROQ, for instance) can be more expressive than either, at the price of portability and a smaller pool of developers who know them.

For content-heavy applications with deep relationships, GraphQL's single-request fetching matters. For simple content delivery, REST's cacheability is an advantage rather than a limitation.

3. Where does your schema live?

Schema-as-code means content models are defined in your repository, versioned in Git, reviewed in pull requests, and deployed with your application. Changes are auditable and revertible.

Schema-in-UI means models are configured through an admin interface. Faster to start, and non-developers can adjust structure. The cost is that schema changes happen outside version control, which makes environment parity and rollback harder.

For engineering teams, schema-as-code is usually correct. The content model is part of your application's contract, and treating it as configuration that lives somewhere else creates drift between environments that's tedious to diagnose.


Platform Comparison

Compared on characteristics you can verify from documentation, not on scores.

Platform

Hosting

API style

Schema

Points toward

Contentful

Managed SaaS

REST + GraphQL

UI-configured, migration API

Large orgs with governance needs

Sanity

Managed (self-host possible)

GROQ + GraphQL

Schema-as-code

Developer teams wanting real-time collaboration

Strapi

Self-hosted or vendor cloud

REST + GraphQL

Code + UI

Teams needing data ownership and customization

Payload

Self-hosted or vendor cloud

REST + GraphQL

Schema-as-code, TypeScript

TypeScript and Next.js teams

Hygraph

Managed SaaS

GraphQL-native

UI-configured

Federated content across sources

Storyblok

Managed SaaS

REST + GraphQL

UI-configured

Editor-led teams wanting visual editing

Directus

Self-hosted or vendor cloud

REST + GraphQL

Derived from SQL schema

Teams with an existing SQL database

Ghost

Self-hosted or vendor cloud

REST

Fixed, publishing-oriented

Publications and newsletters

On pricing: every platform here publishes current pricing, and all of them change it. Check the vendor's own page rather than any figure in a blog post — including this one. What's worth comparing isn't the headline number but the pricing shape: per-seat, per-API-call, per-record, or flat. A per-seat model penalizes editorial teams; per-call penalizes high-traffic sites. Those structures matter more at scale than the starting price.

On compliance: if you have specific certification requirements — data residency, industry frameworks, audit needs — verify directly with the vendor. Certifications change, scopes differ, and a compliance claim in a comparison article is not something to build a procurement decision on.

Directus deserves a specific note, because it's structurally different from the rest. It layers an API over an existing SQL database rather than owning the schema. If you already have a database with content in it, that's a fundamentally different migration story — often no content migration at all.


What You Need Before Evaluating

A content inventory. Every content type, every field, every relationship. This is tedious and it's where teams discover they have far more content types than anyone needs — the majority frequently turn out to be unused variants that should be consolidated.

A list of delivery targets. Web, mobile apps, email, in-store displays, partner feeds. Each adds API requirements, and some add localization or format requirements you won't discover later at a convenient moment.

Your team's actual skills. Not aspirational ones. A TypeScript-native CMS is an advantage for a TypeScript team and friction for everyone else.

Compliance and residency constraints, identified early. These eliminate options outright, so knowing them first saves evaluating platforms you can't use.

A hosting decision, at least provisionally. It's the largest fork in the decision tree.

A staging environment and rollback plan. Content migrations fail quietly — missing fields, broken references, encoding problems — far more often than they fail loudly.


Selection and Deployment

Step 1: Model your content before you pick a platform

Draw the content graph: entities, relationships, cardinality. Document field types precisely — rich text, references, media, structured data, localization flags.

Model quality determines API quality. A poorly structured model produces awkward queries no platform can fix. And the modeling work is largely platform-independent, so doing it first means you're evaluating platforms against a concrete schema rather than a hypothetical one.

Expect to revise. Localization requirements in particular tend to surface late and force restructuring, because supporting translations well is a modeling decision rather than a feature toggle.

Step 2: Test API performance with realistic load

A platform that responds quickly to manual queries during a trial may behave very differently under concurrent production traffic.

Test with your actual query patterns — your deepest nested query, your largest list, your most-requested page — under concurrent load. Measure p95 and p99 response times, not averages, and check cache hit behavior and webhook latency.

For self-hosted platforms, you're testing your own deployment, which means this is also an infrastructure sizing exercise.

Step 3: Test with real editors, not developers

Developers choose CMS platforms; editors live in them. A brilliant API with an editing experience your team resents produces shadow workflows — content drafted in documents, pasted in at the last minute, structure abandoned.

Put two or three editors in a sandbox with real content and have them publish without training. Watch where they hesitate. Time to publish and clicks per task are useful, but hesitation tells you more.

Visual editing platforms let editors see changes in context. Form-based editors need preview environments you build and maintain — real engineering work that belongs in your estimate.

Step 4: Plan hosting properly

Managed platforms handle scaling, backups, and availability. You're accepting platform constraints in exchange for not operating anything.

Self-hosted platforms need a database, object storage for media, a CDN, monitoring, and a patching routine. The application itself is usually the easy part.

For self-hosted deployments, the workflow that matters is: connect your repository, build and deploy on every merge, keep credentials in environment variables, attach a managed database, and configure scaling bounds with a minimum above one so a restart isn't downtime.

Media belongs in object storage, never on the application node. This is what keeps nodes stateless and makes scaling possible — a new instance won't have files written to a previous instance's disk.

Keep rollback available. A CMS deployment that breaks the admin interface blocks your entire editorial team, and that's a different kind of urgent than a frontend bug.

A reasonable default: start managed for your first headless project. Move to self-hosted once you understand your real traffic and cost drivers. Making the hosting decision before you have data is guessing.

Step 5: Migrate with a tested rollback path

Export existing content, transform it to the new schema, import to staging first. Then:

  • Run both systems in parallel. Serve a small share of traffic to the new system and compare error rates and performance before widening.

  • Diff API responses automatically. A script comparing old and new output catches structural problems — missing fields, broken references, encoding issues — before users encounter them.

  • Keep the old system read-only after cutover. Edge cases surface under real traffic that no staging environment reproduces.

  • Budget generously. Migrations consistently take longer than estimated, because the effort scales with content irregularity rather than content volume. A thousand uniform pages migrate faster than a hundred with inconsistent structure.

If you're migrating from WordPress specifically, note that headless isn't the only path — WordPress can serve as a headless backend via its API, and managed WordPress hosting is a smaller step if your constraint is infrastructure rather than the CMS itself.


Why Headless Architecture Holds Up

Channel fragmentation. Content goes to web, mobile apps, email, partner integrations, in-store systems, and increasingly to AI systems that retrieve and summarize it. A CMS that couples content to page templates can't serve surfaces that don't have pages.

Cacheability. Content delivered as structured data over an API caches at the edge. Traditional CMS requests typically involve database work per request, which is why caching layers get bolted on afterward. Headless makes the cacheable path the default one.

Reduced attack surface. No public admin interface on your content delivery path. The admin can live behind authentication on separate infrastructure entirely. This is a genuine architectural benefit — though it's about topology, not about any platform being inherently more secure.

Independent deployment. Frontend and content layer ship on separate schedules. A redesign doesn't touch content; a content model change doesn't require a frontend release.

The emerging consideration: content as AI input

Worth flagging because it's newly relevant. Increasingly, your content isn't only rendered for humans — it's retrieved and synthesized by AI systems, both external ones and ones you build yourself.

Structured content has a real advantage here. Content stored as discrete fields with explicit relationships is far more usable for retrieval than content stored as page blobs, because you can retrieve the specific piece that answers a question rather than an entire page.

If you're planning to build search or assistance over your own content, vector retrieval works considerably better against well-structured content. Teams that model content properly for their API get this capability almost for free; teams that don't end up parsing their own HTML back into structure.

Takeaway: Structure your content for machines that aren't browsers. That's what headless was always for — the set of machines just got larger.


Choosing Based on Your Constraints

Your situation

Where to look

Small team, minimal budget, developer-led

Self-hosted open source with schema-as-code

Strict compliance or data residency

Self-hosted, or managed vendors whose certifications you've verified directly

TypeScript-heavy stack

Platforms with native TypeScript schema definitions

Large editorial team

Visual editing and mature admin UI outweigh API elegance

Existing SQL database with content

A platform that layers over your schema rather than replacing it

Deeply relational content

GraphQL-native, to avoid round-trip cascades

Publication or newsletter

Purpose-built publishing platforms beat general-purpose CMS

No dedicated ops capacity

Managed SaaS, or self-hosted on a platform that handles the infrastructure

Weigh total cost of ownership, not licensing. A free self-hosted CMS consumes engineering time for patching, scaling, monitoring, and incident response. Whether that's cheaper than a subscription depends on what your engineering hours cost and whether you have them spare.

Don't choose on popularity. The most widely adopted platform is optimized for the median team, and you may not be the median team. Match constraints, not market share.


Common Mistakes

Skipping editor testing. The most common cause of CMS project failure. If editors find the tool painful, they route around it, and your structured content fills with pasted HTML.

Over-modeling the schema. More fields don't produce better content. Start minimal and expand from real editorial need. Every field is something an editor must understand and potentially ignore.

Underestimating migration. Effort scales with content irregularity, not page count. Audit for inconsistency before estimating.

Retrofitting localization. Supporting multiple languages is a modeling decision. Adding it after launch usually means restructuring content models and remigrating. Decide before you build.

Testing performance only in development. Low-concurrency behavior tells you nothing about behavior under load.

Self-hosting without operational capacity. The application is the easy part. Database, storage, CDN, monitoring, and patching are the ongoing commitment.

Storing media on the application node. Breaks statelessness and blocks horizontal scaling.

Ignoring the pricing model's shape. Per-seat pricing penalizes editorial teams; per-API-call penalizes traffic; per-record penalizes large catalogs. The structure matters more at scale than the starting figure.


Frequently Asked Questions

What is a headless CMS and why does it matter now?

A headless CMS stores content as structured data and delivers it through an API, with no opinion about presentation. It matters because content now reaches web, mobile, email, partner systems, and AI retrieval — surfaces that don't share a rendering model. A CMS that couples content to page templates can only serve things that are pages.

Which headless CMS is best for a small team?

Whichever one your team can operate without a dedicated ops function. For developer-led small teams, self-hosted open-source options with schema-as-code give strong capability at low licensing cost — provided you can handle the infrastructure. For publication-style sites, purpose-built publishing platforms include memberships and newsletters you'd otherwise build. The constraint is usually operational capacity, not features.

Is a self-hosted CMS cheaper than managed SaaS?

On licensing, yes. On total cost, it depends on what your engineering time is worth. Self-hosting means you own database management, backups, scaling, monitoring, security patching, and incident response. If you already run infrastructure and have spare capacity, it's often cheaper. If you'd be hiring or diverting someone, frequently not.

How long does a CMS migration take?

Longer than estimated, and the driver is content irregularity rather than volume. A large, uniformly structured site migrates faster than a smaller one with inconsistent legacy content. Audit for irregularity first — mismatched field usage, inconsistent formatting, broken references — because that audit is what makes an estimate meaningful.

Can I migrate from WordPress to headless?

Yes, and it's a common path. Export content, transform to your new schema, import to staging, then run both systems in parallel before cutting over. Worth considering first: WordPress can itself act as a headless backend through its API. If your actual constraint is infrastructure rather than the CMS, that's a much smaller change than a full migration.

Do all headless CMS platforms handle localization well?

No, and implementations differ substantially. Some offer field-level translation natively; others handle it through plugins or require you to model it yourself. Test localization workflows with actual translators before committing, because it's the requirement most likely to force a schema rebuild if you get it wrong.

GraphQL or REST for content delivery?

GraphQL when content is deeply relational and clients need varied shapes — one request instead of a cascade. REST when content delivery is simpler, because REST caches more straightforwardly and every developer already knows it. Many platforms offer both, which makes this less decisive than it once was.

How do I deploy a self-hosted CMS reliably?

Connect your repository so deployments are Git-driven and revertible. Keep credentials in environment variables rather than committed config. Attach a managed database and object storage for media, so application nodes stay stateless. Set scaling with a minimum above one instance. Monitor uptime, error rates, and query latency from the start — a CMS that goes down blocks your entire editorial team, not just visitors.


Getting Started

Answer the three structural questions first — hosting model, query interface, schema location. Most platforms eliminate themselves at that point, and you'll be evaluating three or four rather than fifteen.

Then model your content, test the API under realistic load, and put real editors in front of the admin interface before anyone signs anything. The editor test is the one teams skip and the one that most often determines whether the project succeeds.

For self-hosted deployments, the infrastructure pattern is consistent regardless of platform: Git-driven builds, environment-based configuration, managed database, object storage for media, and stateless application nodes behind autoscaling.

App platform docs · Database docs · Monitoring docs


Key Takeaways

  • Three questions eliminate most options: managed vs. self-hosted, GraphQL vs. REST, schema-as-code vs. schema-in-UI.

  • Editor adoption fails more projects than API limitations. Test with real editors, untrained, before committing.

  • Schema-as-code belongs in Git for engineering teams — the content model is part of your application contract.

  • Migration effort scales with content irregularity, not page count. Audit before estimating.

  • Localization is a modeling decision. Retrofitting it usually means restructuring and remigrating.

  • Self-hosting trades licensing cost for engineering attention. The application is the easy part.

  • Media goes in object storage, always — it's what keeps nodes stateless.

  • Structured content is increasingly machine input, not just page content. Model accordingly.