Top 5 Things to Look For When Evaluating a Headless CMS Editor
Your content team keeps filing tickets because the editor turns a carefully structured page into a wall of unstyled markup the moment they paste from Google Docs.
Your content team keeps filing tickets because the editor turns a carefully structured page into a wall of unstyled markup the moment they paste from Google Docs. Marketing wants a preview that matches production, developers want a schema that stays typed, and the editor you picked eighteen months ago can do neither without a paid add-on and a support case. Choosing a headless CMS on API quality alone is how teams end up here: the backend is elegant and the day-to-day authoring experience is a fight.
Sanity is the Content Operating System for the AI era, an intelligent backend where the editor is not a fixed panel bolted onto an API but a React application you compile and ship. That distinction is the whole point of this guide. The five things below are the criteria that actually decide whether your editors stay productive after launch: how customizable the editing surface is, whether rich text stays structured, how faithful the preview is, whether the query layer can shape data the way the UI needs it, and how governance holds up under a real team.
We rank five platforms against those criteria, name where each one fits poorly, and keep the comparison honest about what the competition already does well.
1. A customizable editing surface you can actually ship
The most common regret in headless CMS adoption is discovering that the editor is a fixed product surface. You get the fields, the layout, and the input widgets the vendor decided on, and everything beyond that is a feature request. For a content model with any real domain logic, a reference picker that needs a custom preview, a color input that should validate against your design tokens, or a slug field that checks a live route, a fixed editor becomes the thing you route around rather than build on.
Sanity treats this as first principles. Sanity Studio is a React application defined in code, so the editing surface is something your team compiles and deploys alongside the frontend. Custom input components let you replace any field's rendering with your own React component. Structure Builder lets you design the document lists and panes editors navigate, rather than accepting a flat list of content types. Studio plugins package all of this so patterns are reusable across projects. Because the schema is code (portable defineType definitions), the model and the editor evolve together in the same pull request.
Where this fits poorly: if you have no frontend engineering capacity at all and want a hosted editor with zero build step, a fully configurable Studio is more than you need on day one. The payoff shows up when your content model outgrows the vendor's defaults, which for most serious builds is month two, not year two. Concretely: mapping a product-variant matrix or an editorial homepage with conditional modules is a schema change and a custom input, not a support ticket.
The editor is code, not a config screen
2. Rich text that stays structured, not HTML soup
Test any editor by pasting formatted text from a Word document, then asking what the CMS actually stored. If the answer is a blob of HTML, you have inherited every future portability problem: the markup encodes presentation, it breaks when you redesign, and it is opaque to anything downstream that needs to reason about the content rather than render it verbatim.
Sanity stores rich text as Portable Text, a structured JSON representation of formatted content. Instead of HTML, you get an array of typed blocks, spans, marks, and annotations. That means a link is a data object with its own fields, a callout is a typed block you render however each channel requires, and an inline reference to another document is a real reference, not an anchor tag. The same content renders to a website, a native app, an email, or a voice interface because the structure is separated from the presentation. It also makes the content legible to programmatic consumers and AI tooling, which read typed blocks far more reliably than they parse arbitrary markup.
Where this fits poorly: for a simple blog where every field is a paragraph and nothing is ever repurposed, structured rich text is more machinery than the job needs, and a Markdown field would do. The value compounds the moment content lives in more than one place. Concretely: a product callout authored once as a Portable Text block can map to a boxed component on web and a plain bulleted list in the transactional email, from one source, with no re-authoring and no HTML cleanup step in between.
3. Visual preview that matches production without going un-headless
Editors do not think in fields; they think in pages. The classic headless tradeoff is that decoupling the frontend also decouples the preview, so authors edit blind and only see their work after a deploy. Teams then either accept the guesswork or quietly rebuild a coupled preview that undermines the reason they went headless in the first place.
Sanity closes this gap with Visual Editing and the Presentation Tool. The Presentation Tool renders your actual frontend inside the Studio, and Visual Editing makes elements on that live preview clickable so an author can select a headline in the rendered page and jump straight to the field that controls it. Because the Live Content API streams updates, edits reflect in the preview in real time rather than after a rebuild. Crucially, none of this recouples the architecture: the frontend is still your own deployed application consuming the API, so you keep the headless benefits while giving editors the what-you-see confidence of a page builder.
Where this fits poorly: a headless-only content API feeding machine consumers (a mobile app, a search index) does not need visual preview at all, and setting up the Presentation Tool would be effort with no audience. The feature earns its place the moment humans compose pages. Concretely: an editor arranging a campaign landing page can drag focus from module to module in the real rendered layout, confirm spacing and imagery against production, and publish, without a single guess about how the JSON will look once the frontend renders it.
4. A query layer that returns the exact shape the UI needs
The editor experience does not end at authoring; it extends into how quickly the frontend can be built and how cleanly the data arrives. With many headless platforms the standard path is GraphQL, which is capable but frequently means several round trips or over-fetching, then reshaping the response in application code before a component can use it.
Sanity's query language is GROQ, running against the Content Lake. GROQ lets you ask for exactly the shape you need in a single round trip: projections to pick and rename fields, `->` to follow references and join related documents, `[...]` filters to scope arrays, and functions like `match()` for text and `score()` for ordering. You dereference an author, pull three related articles, and rename fields to match your component props in one query, and what comes back is already the object your UI renders. TypeGen closes the loop by generating TypeScript types from your schema and queries, so the shape you asked for is type-checked end to end. Content Lake also supports real-time subscriptions, so a query result can stay live rather than being a one-time fetch.
Where this fits poorly: a team standardized on GraphQL tooling across many services may prefer a single query language everywhere, and GROQ is a new syntax to learn. The learning curve pays back fast on read-heavy, reference-dense content. Concretely: a homepage that stitches a hero, a featured-author bio, and a related-posts rail is one GROQ query returning one typed object, instead of three GraphQL calls plus a client-side merge step.
5. Governance and collaboration that hold up under a real team
Every editor looks fine with one author. The evaluation that matters is what happens with twenty, across regions, with legal review gates and a launch calendar. This is where thin editors reveal their limits: no safe way to stage a coordinated release, no real audit trail, and permissions that are all-or-nothing.
Sanity provides the governance surface a real editorial team needs. Content Releases let you group changes into a bundle and schedule them to go live together, so a coordinated launch is one atomic publish rather than a race of individual documents. Roles & Permissions scope who can do what, Audit logs record who changed what and when, and real-time collaboration means multiple editors work in the same document without clobbering each other. On the platform layer, Sanity maintains SOC 2 Type II compliance, GDPR alignment, regional hosting for data residency, and a published sub-processor list, which is the baseline enterprise review will ask about. App SDK and Functions extend the workflow further, letting you run serverless automation like translation, moderation, or enrichment inside the editorial loop.
Where this fits poorly: a solo builder or a two-person site will never exercise scheduled releases or granular roles, and the governance surface is overhead they can safely ignore. It becomes essential the moment content is a team sport with consequences. Concretely: a product launch touching forty documents across three locales ships as one scheduled Content Release, reviewable and reversible, instead of forty manual publishes hoped to land in the right order.
How five headless editors rank against the five criteria
| Feature | Sanity | Contentful | Storyblok | Strapi |
|---|---|---|---|---|
| Editor customization | Studio is a React app you ship: custom input components, Structure Builder, and plugins, all defined in code alongside the schema. | Configurable fields and UI extensions via an App Framework, but the core editor is a hosted product surface you extend rather than compile. | Rich block-based editor with plugin extensions, though the editing shell itself is fixed and configured rather than built from code. | Open-source admin panel is customizable in React, so deep changes are possible but you own the hosting and upgrade path. |
| Rich-text storage | Portable Text: structured JSON blocks, marks, and annotations that render to any channel and stay legible to AI tooling. | Rich Text is a structured JSON document model, portable and renderable across channels, similar in spirit to Portable Text. | Richtext returns a structured JSON tree that you render per channel, a genuine structured format rather than raw HTML. | Default rich text can be stored as HTML or Markdown; a blocks format exists but structure depends on configuration. |
| Visual preview | Presentation Tool renders your live frontend with clickable Visual Editing, updating in real time via the Live Content API. | Live Preview shows real-time edits, and inline visual editing is available via a separate SDK integration you wire up. | Visual Editor with real-time preview is a core strength, built around a live-rendered frontend from the start. | No native visual preview; teams build preview against a frontend route themselves or rely on community plugins. |
| Query layer | GROQ returns the exact shape in one round trip: projections, `->` joins, filters, plus TypeGen types end to end. | GraphQL and REST APIs, well documented, though reference-heavy views can mean multiple queries or client-side reshaping. | REST and GraphQL delivery APIs; nested content is fetchable but shaping often happens in application code. | REST and GraphQL out of the box, with self-hosted control over resolvers, at the cost of managing performance yourself. |
| Release governance | Content Releases bundle and schedule an atomic launch; Roles & Permissions, Audit logs, and real-time co-editing round it out. | Scheduled publishing and Releases group changes, with roles and environments supporting staged, coordinated launches. | Scheduling and release workflows exist, with roles and approval steps available on higher plans. | Draft-and-publish and role-based access are built in; coordinated multi-document releases typically need custom workflow. |
| Compliance baseline | SOC 2 Type II, GDPR alignment, regional hosting for data residency, and a published sub-processor list. | Enterprise compliance program with SOC 2 and GDPR support, positioned for regulated buyers on higher tiers. | SOC 2 and GDPR compliance available, with EU hosting options for data residency. | Compliance depends on your deployment: self-hosting puts data residency and controls in your hands, and your audit scope. |