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

FeatureStrapiPayloadSanityStoryblok
HostingSelf-host or CloudSelf-hostSaaS (US/EU)SaaS (US/EU)
DatabasePostgreSQL/MySQLMongoDB/PostgresSanity-owned storeStoryblok-owned store
Schema definitionUI or codeCode (TypeScript)Code (JS/TS)UI
Visual editorLimitedLimitedCustom in ReactStrong visual
Real-time collabNoLimitedYesYes
Free tierUnlimited (self-host)Unlimited (self-host)100k req/month1k entries
Learning curve devLowMedium (TS knowledge)Medium (GROQ)Low
Learning curve editorMediumMediumLowVery 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.

TopicGROQGraphQL
Learning curveMedium (1 to 2 days)Low if you know it
Nested contentStrongWorks, more setup
Field projectionInline in queryRequires fragments
ToolingSanity Vision in studioGraphQL Playground
PerformanceOne API call, one responseOne 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.

FromToContent volumeCostLead time
WordPressPayload500 posts€8,500 to €14,0004 to 6 weeks
Strapi v4Sanity300 entries, 5 types€7,000 to €11,5003 to 5 weeks
ContentfulSanity1500 entries, 12 types€12,000 to €18,0005 to 8 weeks
StoryblokPayload200 pages with blocks€10,000 to €15,0004 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.

FeatureStrapiPayloadSanityStoryblok
Draft and publishYes (v5)YesYes, real timeYes, with visual preview
Role and permission modelGranular (Enterprise)Granular (code)Granular (UI)Granular (UI)
Preview functionWorks via custom setupWorks via custom setupReal time next to editorVisual inside editor itself
Multi user collabLimitedLimitedReal time multi cursorReal time multi cursor
Version historyLimitedVersions pluginHistory per documentHistory 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.