A headless CMS looks like a technical choice, but it sets for years how easily your team manages content and how quickly developers ship new features. WordPress and other traditional systems bundle editor and frontend into one package, a headless CMS separates the two so you can use any frontend technology you want: Next.js, Astro, a mobile app or even a physical screen. The four options that really matter for SMBs in 2026 (see also our guide on building custom software) are Strapi, Payload, Sanity and Storyblok.
What is a headless CMS and why do you need it?
A headless CMS is a content system without its own frontend. It serves content through an API (REST or GraphQL) to whichever frontend you use. A traditional CMS like WordPress contains both the editor and the website rendering in one package. With a headless setup the editor lives in one system, and developers build a separate frontend.
For SMBs four reasons usually tip the scales toward headless. The site has to feed content to a mobile app or POS system. WordPress is slow and vulnerable to plugins. The development team wants modern tooling (TypeScript, Git flow). The site is part of a bigger platform.
Which headless CMS options exist for SMBs?
- Strapi: open source, Node.js, self-hostable. Free Community edition. Strong on flexibility and ownership. Site: strapi.io.
- Payload: TypeScript-first, code-driven, part of Figma since 2024. Self-hosted, MongoDB or PostgreSQL. Site: payloadcms.com.
- Sanity: hosted SaaS, real-time collaboration, its own query language GROQ. Generous free tier. Site: sanity.io.
- Storyblok: visual editor with live preview, marketing-team friendly. Hosted SaaS.
Strapi: for whom and when?
Strapi is the best known open source headless CMS in Node.js. The community edition is free, you host it yourself on a VPS. We pick Strapi typically in three scenarios: a client explicitly wants self-hosting, a hybrid of content and custom data models, or budget is tight. Reckon on €4,500 to €8,000 for implementation and €15 to €40 per month for hosting.
Payload: for whom and when?
Payload is the newest serious player. TypeScript-first, code-driven, part of Figma. For developers it is often the nicest to work with. We pick Payload when a custom platform is being built where content is one of the modules. See custom platforms. Reckon on €4,500 to €8,000 for implementation and €20 to €50 per month for hosting.
Sanity: for whom and when?
Sanity is hosted SaaS, real-time collaboration, its own query language GROQ. The free tier is very generous for SMB sites: 100,000 API calls per month, 3 users. We pick Sanity in 50 to 60 percent of our content-driven projects. Marketing sites, blogs, product catalogues. Reckon on €4,500 to €8,000 for implementation.
Storyblok: for whom and when?
Storyblok stands out with its visual editor. Editors see directly how a page will look. We pick Storyblok when the marketing team is the driver. For example a retail chain where 5 to 10 marketers build landing pages every week. Reckon on €4,500 to €8,000 for implementation.
Comparison matrix: features, hosting and pricing
| Feature | Strapi | Payload | Sanity | Storyblok |
|---|---|---|---|---|
| Hosting | Self-host or Cloud | Self-host | SaaS (US/EU) | SaaS (US/EU) |
| Database | PostgreSQL/MySQL | MongoDB/Postgres | Sanity-owned store | Storyblok-owned store |
| Schema definition | UI or code | Code (TypeScript) | Code (JS/TS) | UI |
| Visual editor | Limited | Limited | Custom in React | Strong visual |
| Real-time collab | No | Limited | Yes | Yes |
| Free tier | Unlimited (self-host) | Unlimited (self-host) | 100k req/month | 1k entries |
| Learning curve dev | Low | Medium (TS knowledge) | Medium (GROQ) | Low |
| Learning curve editor | Medium | Medium | Low | Very low |
When should you not pick a headless CMS?
- Simple corporate site with 5 to 15 pages and quarterly updates: WordPress or a static site is enough.
- Marketing site run by one person: a static site (Astro or Next.js) with content in Markdown works fine.
- Webshops with standard products: Shopify or WooCommerce cover 80 percent better than headless.
Our pick in 80 percent of cases
Of the four options we pick Sanity or Payload in 80 percent of our projects. We go with Strapi when self-hosting is a requirement. We see Storyblok mainly with retail and hospitality clients that have large marketing teams. See our websites and dashboards and CMS solution pages for how we deploy this stack.
Strapi deep dive: version 4 versus version 5
Strapi v4 was the stable workhorse version between 2022 and 2024. Since late 2024 v5 is the default. The biggest change is the Document Service API and a native draft and publish workflow per locale. For existing v4 projects migration is not a push button action. The data structure is different, plugin compatibility is fragile and the admin UI has been rewritten. We migrated three v4 projects in 2025. Time per migration: 40 to 70 hours, depending on the number of custom plugins.
- Strapi pros: open source, your own hosting, strong REST and GraphQL out of the box, big community with over 60 thousand GitHub stars.
- Strapi cons: plugin ecosystem varies in quality, breaking changes between majors are tough, admin UI feels less polished than Sanity or Storyblok.
- When v5: all new projects from 2025, especially if you need draft and publish per language.
- When still v4: only when you have a running project where migration fits in a later quarter.
Payload deep dive: TypeScript schema in code
The strongest argument for Payload is that your full content model lives in TypeScript, next to your app code, under version control. No separate admin UI that clicks and mutates data. A schema definition for a blog post collection looks like this.
import type { CollectionConfig } from 'payload/types'
export const Posts: CollectionConfig = {
slug: 'posts',
admin: { useAsTitle: 'title' },
access: { read: () => true },
fields: [
{ name: 'title', type: 'text', required: true },
{ name: 'slug', type: 'text', required: true, unique: true },
{ name: 'author', type: 'relationship', relationTo: 'users' },
{ name: 'body', type: 'richText' },
{ name: 'publishedAt', type: 'date' },
],
}
For developers this is the nicest working experience of the four options. For editors the bar sits a little higher than Sanity or Storyblok because the admin UI has less visual finish. In return you get type safety across your whole stack and you can code review the entire content model in a pull request.
Sanity deep dive: GROQ versus GraphQL
Sanity has its own query language called GROQ. At first sight that is a hurdle, but in practice one of the reasons teams pick Sanity. GROQ is more expressive than GraphQL for nested content work and projects exactly the fields you need, in the shape you decide. For clients who only know GraphQL Sanity also offers a GraphQL endpoint, but in 90 percent of our projects we use GROQ directly.
| Topic | GROQ | GraphQL |
|---|---|---|
| Learning curve | Medium (1 to 2 days) | Low if you know it |
| Nested content | Strong | Works, more setup |
| Field projection | Inline in query | Requires fragments |
| Tooling | Sanity Vision in studio | GraphQL Playground |
| Performance | One API call, one response | One API call with overhead |
Storyblok deep dive: how the visual editor works in practice
The Storyblok visual editor is the differentiator. Marketers open a page, see the live preview on the left and a field panel on the right. Edits show up in the preview right away. That sounds easy but asks for a component library on the developer side where every block is its own Vue or React component with a matching schema. We usually build that in a separate 2 to 3 week sprint before we start modelling content.
- What works well: marketing teams ship without developer intervention, A B tests via plugin, multi language out of the box.
- What works less well: the developer has to maintain two things per block, the schema in Storyblok and the component in code.
- When Storyblok: marketing team of 4 plus people, or a retail or hospitality chain with weekly landing page launches.
- When not: developers prefer working in code, or the team is small.
What does a migration between headless CMS providers cost?
In 2024 and 2025 we migrated four clients. Twice Strapi to Sanity, once WordPress to Payload, once Contentful to Sanity. Costs vary considerably based on content volume, number of content types and how much custom logic sat in the old system.
| From | To | Content volume | Cost | Lead time |
|---|---|---|---|---|
| WordPress | Payload | 500 posts | €8,500 to €14,000 | 4 to 6 weeks |
| Strapi v4 | Sanity | 300 entries, 5 types | €7,000 to €11,500 | 3 to 5 weeks |
| Contentful | Sanity | 1500 entries, 12 types | €12,000 to €18,000 | 5 to 8 weeks |
| Storyblok | Payload | 200 pages with blocks | €10,000 to €15,000 | 4 to 7 weeks |
Editor experience compared: roles, permissions, draft and preview
For SMBs editor features often weigh heavier than the tech choice. A marketer without preview, or without the ability to save a draft, stops using the CMS after a week. Below the four options on the editor features that actually make the difference in practice.
| Feature | Strapi | Payload | Sanity | Storyblok |
|---|---|---|---|---|
| Draft and publish | Yes (v5) | Yes | Yes, real time | Yes, with visual preview |
| Role and permission model | Granular (Enterprise) | Granular (code) | Granular (UI) | Granular (UI) |
| Preview function | Works via custom setup | Works via custom setup | Real time next to editor | Visual inside editor itself |
| Multi user collab | Limited | Limited | Real time multi cursor | Real time multi cursor |
| Version history | Limited | Versions plugin | History per document | History per page |
Hosting and infrastructure: self hosted versus SaaS
Strapi and Payload are primarily self hosted, Sanity and Storyblok are SaaS. That has consequences for performance, availability and monthly cost. Self hosted gives you control and lower costs at scale, SaaS gives you a team that stands ready 24 by 7 without you arranging it.
- Strapi self host: a VPS at Hetzner or Cloudflare with 4 GB RAM handles 100 plus thousand page views per month. Cost 15 to 40 euros per month plus monitoring.
- Payload self host: same profile as Strapi, MongoDB or Postgres separate. Cost 20 to 50 euros per month.
- Sanity SaaS: free up to 100 thousand API calls per month, after that 99 euros per month. Multi region CDN built in.
- Storyblok SaaS: from 99 euros per month for the Entry plan, higher tiers for teams or multi space.
Real TopDevs client case: which CMS we picked and why
For a Dutch real estate client in 2025 we picked Payload over Sanity. The reasons were concrete: the client wanted all data on premise because of contractual agreements with tenants, the content model had 14 types with deep relations, and the in house dev team was TypeScript first. Had the same criteria not applied at an SMB marketing site, Sanity would have been the pick. For Mastone the trade off was different and we picked a combination of Payload with a custom frontend.
- Client profile: real estate firm, 8 staff, 4 editors.
- Deciding criteria: data on premise, complex content model, in house TypeScript expertise.
- Time to live: 9 weeks including schema, migration and frontend integration.
- Cost: 11 thousand euros implementation, 35 euros per month hosting at Hetzner.
- Outcome: editors publish weekly without developer help, code in ownership in Git repository.
How do you start in practice?
- Step 1: write down who uses the editor and how often. One marketer who publishes monthly is a different world than a team of 6 that ships daily.
- Step 2: build a mini prototype. Sanity and Storyblok are set up within a day.
- Step 3: plan an intake call for the final choice.
Plan a free intake call. Our way of working and guarantees sit in our terms and conditions.