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.

Four serious options for SMBs. In 80% of projects: Sanity or Payload.

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?

  1. 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.
  2. Step 2: build a mini prototype. Sanity and Storyblok are set up within a day.
  3. 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.