← All posts

Comparison

Which is the best headless CMS for an AI? Contentful, Sanity and Strapi, tested

Two colleagues looking at a large screen showing a brain drawn in light.

Contentful allows the most of the three — 10 of our 14 jobs against 9 for Sanity and 7 for Strapi — and the reason is not performance or developer experience but a short list of unglamorous features: scheduling, tags and a way to report what is in the space. All three read, write, edit and publish without complaint. The table below is printed from the three adapters that do the work, so it is a comparison of what the APIs permit rather than of what their marketing pages describe.

·

One thing to say first, because it decides whether this post is about you at all: a headless CMS is where content lives, and this product is a way of talking to one. We are not a headless CMS, we store nothing, and we serve nothing to visitors.

Why these three are not like the others

On WordPress or Joomla, the content system and the website are the same thing at the same address. On these three they are not: your website is whatever somebody built on top of the content store, and the store is somewhere else entirely. So the thing you connect is a space, a dataset or a project — not an address a visitor would ever type.

That has two practical consequences. First, there is no "page" to publish in the sense other platforms mean: publishing marks an entry as available to whatever reads the store, and whether a visitor then sees it depends on a website nobody here controls — Contentful in particular will report something as published that no visitor can reach, because the front end has not been rebuilt. Second, there is no fixed content model. On the other platforms a post is a post; here you invented your own types, and nothing can be written until somebody has said which of your types holds articles and which of its fields is the body. We ask that during setup rather than guessing, which is the one bit of this that is slower than the others and the one bit nobody should automate.

The three, side by side

What each platform lets this product attempt, read from that platform's own adapter.
What you can ask for Contentful Strapi Sanity
Read content Yes Yes Yes
Create content Yes Yes Yes
Edit content Yes Yes Yes
Publish content Yes Yes Yes
Schedule content Yes No No
Manage images and files Yes Yes Yes
Manage categories and tags Yes No No
Edit SEO information No No Yes
Manage menus No No No
Custom content types Yes Yes Yes
Bulk changes No No No
Site information Yes Yes Yes
Manage redirects No No No
Administrative information Yes No Yes

This table is generated from the adapters when the page loads, not typed out. A green cell means the software will attempt that job on that platform; a grey one means it refuses before it tries, because the platform offers no supported way to do it. Bulk work is the one row that is empty for every platform: no adapter claims it yet, and the automation page says so too.

Read this before the table. A green cell means our software will attempt that job — not that anybody has watched it work on a live installation of that platform. That stronger claim is recorded per capability with a date, and so far it has been earned by WordPress, Joomla, Drupal, Craft CMS, Concrete CMS, Webflow, Wix, Contentful and Sanity. Where one of these three is not in that list, its adapter was written from the platform's own documentation and source, every capability row for it says so, and we are not going to blur the difference by leaving it out.

Contentful: 10 of 14, and the only one that can schedule

Contentful's scheduled actions are a real feature of its management API: Contentful holds the booking and publishes the entry itself, rather than something of ours waking up to do it. It also has tags, which is as close as any of the three comes to categories, and enough information about a space to report on it. Two things to know. Its new tags are private by default, and a private tag is invisible to the API that serves your website — so a tag created for filing an article would produce something your own site cannot read; ours are created public, and say so. And a Contentful connection is pinned to one environment of one space: two environments means two connected websites here, which is deliberate, because the alternative is a request landing in the wrong one. Contentful has no SEO metadata of its own, so that row is grey — whatever field you use for a meta description is a field you invented, and writing into somebody's invented field under the name of an SEO capability is a promise we will not make.

Sanity: 9 of 14, and the only one where a draft is a different document

Sanity keeps drafts as separate documents rather than as a state on one, which is clean and catches everybody out once: editing a published article saves to the draft and leaves what visitors read untouched. Our own tool description used to promise the opposite, and it was true everywhere except here. The other Sanity-shaped fact is about its schema. A Sanity schema has traditionally lived in your Studio's code, where nothing outside it can read it — but a recent Studio command stores it in the dataset itself, where it can be read properly. If you have run it, we read your real content model, including types you have defined and not used yet; if you have not, all that is honest is to observe which types your documents actually have, and we label every type with which of the two it came from rather than calling an observation your content model. Sanity can write SEO fields, which Contentful and Strapi cannot, and it cannot schedule: it schedules a release of content, which is a genuinely different thing.

Strapi: 7 of 14, and the one where failures are silent

Strapi is the most self-hosted of the three and the one that asks the most care. Its tokens can be scoped per collection, which is good; the ordinary failure mode is that something is simply not granted, and a token missing a permission produces an answer that reads like an empty site rather than a refusal. So the adapter distinguishes between "that collection is there and your token may not see it" and "nothing is called that", and says which. The bigger trap is between Strapi 4 and Strapi 5: both publish on create by default, and they are stopped from doing so in two different ways — so sending the newer version's instruction to an older one publishes an unfinished draft on a live site. The version is established from the shape of a record before any write, and when it cannot be established, nothing is written. Strapi has no tags or categories of its own and no SEO fields, which is most of the gap between 7 and 10.

How to choose between them, if you are choosing

Nobody picks a content store for how well an assistant can reach it, and they should not. But if the choice is otherwise close, three things in the table are worth real money.

Honest limit: 9 of 11 platforms have had capabilities exercised against a real installation so far — WordPress, Joomla, Drupal, Craft CMS, Concrete CMS, Webflow, Wix, Contentful and Sanity — and each of these three says plainly on its own page which of its rows are in which state. What a real Contentful check still needs is specific and we do not have it: a space with more than one environment, an environment alias, and a default language that is not English, which is the easiest thing in that adapter to get quietly wrong.

Questions we get asked about this

Is CMS AI Agent a headless CMS?
No. It stores no content and serves nothing to visitors. It is a way for an assistant to talk to the content system you already have, headless or otherwise.
Why does publishing not make something appear on my site?
Because on a headless setup publishing makes an entry available to whatever reads the store, and your website is a separate thing that may need to be rebuilt before a visitor sees it. That is your front end's business, not the store's and not ours.
Do I have to tell it which of my types holds articles?
Yes, once, during setup — on all three, and on Craft and Webflow for the same reason. You invented the content model, so nothing can write into it safely until somebody who knows it has said which type and which fields. It is the one step we will not guess at.

Where to go next