1. What changed in headless CMS 2024–2026
The headless CMS market matured in three ways since 2023.
First: pricing pressure from open-source. Strapi and Payload both reached production maturity, putting downward pressure on Contentful and Sanity's enterprise tiers. Several Series-B SaaS companies migrated off Contentful in 2024–2025 to save $40K–$120K/year in CMS spend.
Second: editor UX caught up. The 'engineers love it but content team hates it' problem of 2020-era headless was real. By 2026, Sanity Studio, Storyblok's visual editor, and Payload's admin UI are all good enough for non-technical editors. Editor velocity is no longer a discriminator between the top tier.
Third: AI-assisted content. Every major CMS now has either built-in AI content suggestions (Contentful AI Actions, Sanity Canvas), or first-party MCP server integration (Payload). For programmatic SEO and content velocity at scale, this matters.
WordPress is not in this comparison. WordPress can be used headlessly via WPGraphQL or REST API, but the editor experience and content modeling assumptions don't compete with purpose-built headless. We use WordPress when the use case justifies it — see our /services/development/wordpress page.
2. The five contenders — at a glance
| Sanity | Contentful | Payload | Strapi | Storyblok | |
|---|---|---|---|---|---|
| Hosting | Cloud (managed) | Cloud (managed) | Self-host or Cloud | Self-host or Cloud | Cloud (managed) |
| Schema definition | Code (JS/TS) | UI | Code (TS) | Code or UI | UI + JSON |
| Editor preview | Embedded (good) | Side-by-side (very good) | Embedded (good) | Basic | Visual editor (best in class) |
| Pricing — startup | Free → $99/mo | $489/mo (Basic) | Free (self-host) | Free (self-host) | $108/mo |
| Pricing — enterprise | Custom | Very expensive | Self-host scales free | Self-host or Cloud $99+ | Custom |
| TypeScript support | Native | Generated types | Native (best) | Native | Generated types |
| Best for | Engineering-heavy teams | Enterprise + multi-team | TS shops, custom admin | Cost-sensitive self-host | Marketing-heavy, visual |
3. Decision tree (pick one in 2 minutes)
- 1Need self-hosting (compliance, data residency, cost)? → Payload (if you're a TS shop) or Strapi (if you need a UI to build schemas).
- 2Marketing team needs to see live previews / drag-and-drop? → Storyblok.
- 3Engineering team wants schema-as-code, GROQ for queries, and a strong dev experience? → Sanity.
- 4Enterprise procurement, multiple business units, big budget? → Contentful.
- 5If two of these apply, the dominant requirement wins. Don't try to be perfect.
4. Sanity — the engineer's CMS
Sanity is a managed cloud CMS with a code-first schema and a customizable admin UI (Sanity Studio). The query language is GROQ — a JSON-shaped query language that's more flexible than GraphQL for content fetching. We've shipped 14 production sites on Sanity in the last 24 months.
- Strengths: schema is code (TypeScript), so version control and PR review work the way they should. Studio is highly customizable. GROQ is excellent for complex content queries. Content Lake (their backend) handles real-time collaboration and is genuinely fast.
- Weaknesses: pricing scales with API requests + dataset size; large sites can hit unexpected bills. The 'visual editor' (overlay preview on your live site) requires implementation work. Embedded media handling is fine but not best-in-class.
- When we recommend it: TypeScript-first teams, content models that change frequently (so schema-as-code matters), sites with structured content (not just blog posts).
// schemas/article.ts
import { defineType, defineField } from 'sanity';
export const article = defineType({
name: 'article',
type: 'document',
title: 'Article',
fields: [
defineField({
name: 'title',
type: 'string',
validation: (Rule) => Rule.required().max(80),
}),
defineField({
name: 'slug',
type: 'slug',
options: { source: 'title', maxLength: 96 },
validation: (Rule) => Rule.required(),
}),
defineField({
name: 'author',
type: 'reference',
to: [{ type: 'author' }],
}),
defineField({
name: 'body',
type: 'array',
of: [{ type: 'block' }, { type: 'image' }, { type: 'codeBlock' }],
}),
],
});
// Frontend query (GROQ)
const articles = await client.fetch(`
*[_type == "article"] | order(publishedAt desc) [0...10] {
title,
"slug": slug.current,
"authorName": author->name,
body
}
`);5. Contentful — the enterprise default
Contentful is the incumbent enterprise headless CMS. Its strength is multi-team coordination — content models can be reused across spaces, granular permissions are deep, and the platform handles localization at scale better than anyone else.
- Strengths: enterprise procurement is straightforward. SOC 2 + HIPAA + GDPR compliance documented. Reliability is excellent. AI Actions (their LLM features) are well-integrated. Localization is best-in-class — multi-locale content with field-level translation workflows.
- Weaknesses: pricing. The Basic plan is $489/mo for 50K records and 10 users. Real enterprise usage hits $50K–$200K/year quickly. UI is dated relative to Sanity / Storyblok. Schema is defined through the UI, not code — version control becomes a workaround.
- When we recommend it: Series-C+ companies with multiple BUs, multi-language sites at 10+ locales, organizations where procurement matters more than per-engineer DX.
6. Payload — the TypeScript-native challenger
Payload is a TypeScript-native, self-hostable CMS. Schema is TypeScript code, the admin UI is generated from the schema, and it ships with first-class auth, file uploads, hooks, and access control. Reached genuine production maturity in 2024.
Acquired by Figma in 2025; remains open-source and self-host-friendly. The acquisition added engineering polish without changing the open-source posture.
- Strengths: TypeScript end-to-end. Schema, admin UI components, hooks, access control — all TS. Self-hosted means $0 in licensing for content scale. Excellent custom-admin extensibility — you can render any React component into the admin.
- Weaknesses: self-host means YOU run Postgres + S3-compatible storage + the Node app. That's ~$60–$300/month in infra and an on-call obligation. Editor experience is solid but not as polished as Sanity / Storyblok for non-technical content teams.
- When we recommend it: TypeScript shops with engineering capacity to operate it, projects with strict data-residency requirements (self-host on EU servers, etc.), high content volume where Sanity/Contentful pricing would balloon.
// collections/Articles.ts
import type { CollectionConfig } from 'payload/types';
export const Articles: CollectionConfig = {
slug: 'articles',
admin: { useAsTitle: 'title' },
access: {
read: () => true,
create: ({ req: { user } }) => Boolean(user),
},
fields: [
{ name: 'title', type: 'text', required: true },
{ name: 'slug', type: 'text', required: true, unique: true,
hooks: { beforeValidate: [({ value, data }) =>
value || data?.title?.toLowerCase().replace(/[^a-z0-9]+/g, '-')] },
},
{ name: 'author', type: 'relationship', relationTo: 'users' },
{ name: 'body', type: 'richText' },
{ name: 'publishedAt', type: 'date' },
],
hooks: {
afterChange: [
async ({ doc, operation }) => {
if (operation === 'create' || operation === 'update') {
await fetch('https://my-frontend/revalidate', {
method: 'POST',
body: JSON.stringify({ slug: doc.slug }),
});
}
},
],
},
};7. Strapi — the cost-sensitive self-host
Strapi is the OG open-source headless CMS. Self-hostable, free to run, with a UI for building content models. Strapi v5 (2024) was a major improvement; the platform is more stable and the admin UI more polished than its 2020 reputation suggests.
- Strengths: free self-host, mature plugin ecosystem, content modeling via UI is approachable for non-engineers. GraphQL and REST APIs out of the box. Decent localization.
- Weaknesses: customization beyond the basics requires diving into Strapi's plugin architecture which is more complex than Payload's. UI extension is harder. Performance at very large scale (millions of content items) requires care with database indexing and query optimization.
- When we recommend it: budget-constrained projects, teams with mixed technical/non-technical content modelers, or projects where the admin UI being editable by non-engineers is more valuable than schema-as-code.
8. Storyblok — the visual-editor specialist
Storyblok's differentiator is its Visual Editor — a side-by-side iframe of your live site where editors can click any element to edit it in place. For marketing-led teams that want true WYSIWYG, Storyblok is genuinely best-in-class.
- Strengths: best visual-editor experience in the category. Component-based content modeling (think 'Bloks') maps cleanly to React/Vue/Svelte components. Excellent localization. Strong CDN.
- Weaknesses: pricing is mid-tier (between Sanity and Contentful). Schema definition is mixed UI + JSON, which has a learning curve. Engineering experience is fine but not as TypeScript-native as Payload/Sanity.
- When we recommend it: marketing-heavy sites where the editor team will use the visual editor daily, brands with high content velocity (10+ pages/week), companies migrating from a Webflow-style editor and wanting to keep the visual workflow.
9. Patterns we avoid (regardless of CMS)
- Massive single 'Page' content type with 50+ optional blocks. Editors get analysis paralysis; engineering gets type bloat. Use distinct content types per page archetype, even if it means more schemas.
- Reference loops: A → B → A. Most CMSs don't enforce DAG constraints, but the editor UI becomes confusing and the API responses become recursive. Model with explicit one-way references.
- Storing computed values (e.g., 'Article published count' on the Author entity). These get stale immediately. Compute at query time or via a separate read model.
- Building your own custom CMS. The temptation is real — 'just a few content types and a basic UI'. Six months later you're building admin auth, draft/publish workflows, image processing, locale handling, and your engineering team is bored. Pick a CMS off this list.
- Using a relational database directly + a Retool admin. Works for internal tools. Doesn't work for public-facing content because there's no preview, no draft state, and no editorial workflow.
Before committing to a CMS, model the migration FROM it. If migrating away would take 3+ months, you're locked in. Sanity, Payload, Contentful all have export tools. Storyblok and Strapi do too but with more friction. Plan for migration before you commit.