Sanity Content Agent vs. Payload: An Open-Source Alternative, Tested on 31 Real Editorial Tasks

Sanity Content Agent vs. Payload: An Open-Source Alternative, Tested on 31 Real Editorial Tasks

A couple of months ago I built an MVP of a content agent for Payload and wrote about it in a separate article. There I put it next to Sanity’s agent on simple tasks: finding links, verifying a list of articles, and running a bulk replacement. The results were very close, and I promised to come back with a more honest test - not on tasks I made up, but on the ones editors ask for every day.

After that article, we handed the agent to two of our content managers as an internal beta. For five weeks, they used it as part of their normal work. I refined the agent based on their requests and deliberately did not coach them on how to phrase things “correctly”. From those requests, I picked 31 tasks and ran them through both agents - ours and Sanity Content Agent - word for word, exactly as the editors wrote them. This article is the result: a table with the time and outcome for every task, plus a closer look at cases where the agents’ differences turned out to be differences between the CMSs themselves.

Who this article is for

If you are choosing a headless CMS and see Sanity as the platform that already ships an AI agent, but you are also looking at Payload as the more flexible, independent alternative - this is a chance to compare how the two agents actually handle the same tasks, not what the decks promise. Good news if you lean towards Payload: a content agent is coming there too. We are working on taking ours out of internal beta. And if you simply want to know what content agents inside a CMS can do today, skip to the table: every task in it comes from real editorial work.

One important detail about the setup. Both agents worked on identical documents. The content of focusreactive.com - 148 articles and 123 landing pages - exists in two copies, one in Payload and one in Sanity, with the same texts, blocks and references between documents. Each agent received its task inside its own CMS, on its own copy. Payload Content Agent ran on OpenAI models in the same configuration we use in production: the orchestrator runs on gpt-5.4 - it reads the request, builds a plan and hands out work; the sub-agents that edit text and rich text, and the reviewer that checks the result, run on gpt-5.4-mini; background memory tasks run on gpt-5.4-nano. That is our configuration, not the only one possible. The plugin supports multiple providers out of the box - OpenAI and Anthropic - so you bring your own API key and pick the model for each role based on budget and quality. Which model runs inside Sanity Content Agent, the platform does not disclose: it picks the model itself, and the cost is folded into the credit price.

TL;DR: AI Content Agent Battle

Two content managers worked with the agent for five weeks. I consolidated their work into 30 sessions: 31 documents changed, roughly $20 in model cost.

From their requests, we’ve assembled 31 tasks and gave them to both agents word for word. Payload Content Agent was faster on 20 tasks, Sanity Content Agent on 11; median time 2:29 vs. 3:02.

Each does something the other cannot. Sanity resizes images and generates new ones. Payload Content Agent runs as a plugin inside the Payload admin and connects to external tools over MCP: in our case Ahrefs, so the agent answers SEO questions with real search volumes right in the chat. That makes it more than a chat for edits - it is an editor’s workbench inside Payload that you can wire up to any service your team uses.

The heaviest task - appending a paragraph to each of 148 articles - went to Sanity: one operation across the whole dataset versus 18 minutes of document-by-document work on our side. Landing page clones, reference handling and assembling pages from blocks went to Payload, faster and more precisely.

The 31 tasks cost $12.50 on the Payload agent, about $0.39 per task. Sanity’s billing only shows a total for all runs, including repeats, so we do not derive a per-task price. Both agents write drafts only. A human always publishes.

Five Weeks of Pilot

The two editors work in different styles on different kinds of tasks, and together they give a complete picture of what a content team actually does. That shaped the task set more than any test of mine could.

The first one runs the blog. His requests are short and practical: “change all Jamstack to JAMstack”, “check the grammar”, “write a meta description for the article”. He rarely opens the document before writing to the agent and expects it to figure out which article he means.

The second one builds landing pages. His language is different: “take the Official Partner block from page X and put it on Y”, “replace the case studies and testimonials with the ones from the Framer page”, “make a copy of this landing, but about Strapi”. He thinks in blocks and references between documents, and almost every task of his is assembling a page from ready-made parts.

Five weeks in numbers:

Sessions 30, from two editors
Documents changed 31: 24 articles and 7 landing pages
Model cost over five weeks about $20

Three things I noticed over those five weeks shaped how this comparison turned out.

  1. Firstly, the agent’s work is not only search and audit, as I assumed when I built the MVP. The bulk of the load was page production. Those requests were only a quarter of the total, but they took four-fifths of the agent’s work. Clone a landing page, move a block, swap references - each of those costs as much as a dozen text edits. That is why the set has eight landing page tasks, and they are the heaviest of all.

  2. Secondly, the most expensive mistake an agent can make is not a slow answer or an imprecise edit. It is a confident “done” over a document where nothing changed. That happened during the pilot, and I turned every such case into its own task in the set: the result of each task is verified against the document, not against what the agent says in the chat.

  3. Thirdly, I took the editors’ requests as they were - their wording, their typos, their gaps - and gave them to both agents in that form. An agent should understand people in their everyday phrasing. But prompt engineering still matters, and it is worth keeping in mind: the more precisely an editor names the document, the field and the desired result, the fewer clarifying questions there are and the faster and more predictable the answer is, for both agents. You can see it in the table in the tasks where the first request was too broad and a second turn was needed.

How the runs worked. Sanity Content Agent ran in the Studio side panel, Payload Content Agent in the chat inside the Payload admin. Time was measured from sending the prompt to the agent’s final answer.

In Short

Sanity Content Agent Payload Content Agent
Faster 11 tasks of 31 20 tasks of 31
Median time 3:02 2:29
Only this one can Images: resize and generation External data (Ahrefs) right in the chat
Cost $86.40 for all comparison runs, including repeats (Sanity credits) $12.50 for 31 tasks, ≈ $0.39 per task (OpenAI tokens)

Two tasks neither agent solved. Neither could verify data on a site that blocks bots. And neither CMS gives the agent an editor’s activity history as a log: Sanity shows the content where that person is listed as the author instead.

The Comparison Table

Tasks are grouped by type of work, from simple to complex. Time is minutes:seconds to the agent’s final answer; the faster one is in bold.

Reading and Questions About Content

# Task Sanity Payload What happened
1 List every link in an article 0:29 0:16 Sanity found 5 links in the body. Payload found the same 5 plus 2 in the FAQ block, and named the field for each.
2 An editor’s activity history over a period manual run not run Neither CMS gives the agent a detailed log of an editor’s actions: who changed a document and when is visible only in the document’s own version history. Sanity showed the content where that person is listed as the author, with creation and modification dates, and said plainly that edit history has to be checked in revisions. The Payload agent does not have this capability yet either, and its internal memory of past sessions did not help reconstruct the editor’s activity.

SEO Fields

# Task Sanity Payload What happened
3 Meta description from the article’s content 0:41 0:40 Parity: both wrote the description into the document, Sanity at 157 characters, both within the limit.
4 Meta title no longer than 55 characters 1:07 1:24 Both stayed within the limit.

Edits Inside a Single Article

# Task Sanity Payload What happened
5 Replace punctuation in one article only 2:55 3:41 The request first asked to replace dashes everywhere: Payload found 96 posts and stopped for confirmation; once narrowed to one article, it replaced all 32 dashes in it. Sanity replaced every dash in the same article in 2:55.
6 Make a specific fragment bold 0:33 2:29 “Inoxoft’s stack” is a cell in a table of agencies. The article has two bodies; Payload made it bold in the rich-text copy and left the markdown untouched. Sanity worked on a substitute article.
7 Bold the first word of every sentence in a pasted block 0:21 0:40 The block sits in the middle of the article and had to be found first. Both found and fixed it.
8 Fix a broken markdown table 3:52 1:21 The table was broken in three ways. Both fixed all three and left the cell text alone; Payload also wrote “Criteria” into the empty header cell.
9 Add a 7th FAQ question that is not there yet 3:18 2:42 The FAQ already had seven questions - Payload added an eighth and said so.

Grammar

# Task Sanity Payload What happened
10 Proofread and apply every fix 9:34 3:23 The difference between “suggest” and “apply”: the second turn asks to write everything found.
11 Grammar in one field only 11:28 3:38 Sanity’s slowest answer among single-article edits.
# Task Sanity Payload What happened
12 A broken link and citation leftovers 1:56 2:29 One dead link among six live ones, plus three citation artefacts. Both cleaned it up.
13 Repoint a link: same anchor, new URL 5:00 1:18 A link lives in two places - the anchor text and the href. The task checks that only one of them changes.
14 Insert a keyword with a link exactly once 2:00 1:23 Where exactly to insert it is a matter of taste. Both did it.
15 Add a source link with a given anchor 4:31 3:28 A two-line edit: the link in the text and the anchor. Both did exactly that, but spent more time than such an edit calls for.

Bulk Operations Across the Blog

# Task Sanity Payload What happened
16 Replace a term across the whole blog 1:03 1:04 Both show the scope first and ask for confirmation. Payload replaced 5 occurrences in 2 posts and reported that 16 of the 18 matches were already spelled correctly.
17 Append a paragraph with a link to every published article 10:53 ~18:00 The task from the first article. Sanity went through 147 of 148 articles in one operation. Payload completed the task in 18 minutes, document by document. More below.

External Data

# Task Sanity Payload What happened
18 Keyword research through an SEO service 3:02 1:04 Only the Payload agent is connected to external services over MCP and returned real Ahrefs numbers. Sanity answers from the model’s general knowledge.
19 Check the ratings in an article against the live Clutch site 5:55 2:19 Clutch blocks automated requests. Both hit the wall; Payload was quicker to say exactly what it could not verify.

Media

# Task Sanity Payload What happened
20 Resize hero images in three articles 1:30 0:36 The one category where the Payload agent does not operate: it reads images but does not transform them. Sanity resizes and generates new ones.

Landing Pages: Blocks

# Task Sanity Payload What happened
21 Delete two named blocks from a draft 1:45 3:01 Both asked for confirmation before deleting.
22 Copy one block from page A to page B 1:19 0:58 A block with references and partner logos moved over in one step, intact.
23 Copy a block and rewrite it for a new topic 1:39 1:33 Move plus rewrite. A minute and a half for both.
24 Add a comparison block that is not on the page yet 4:54 4:44 A new block type has to be assembled from the schema, not by guessing field names.
25 Replace case studies and testimonials with ones from another page 1:14 0:55 Case studies and testimonials are references to other documents, not text. Both swapped exactly those references.

Landing Pages: Rewrite

# Task Sanity Payload What happened
26 Find duplicated content on a page and remove it 10:32 3:48 Work nobody does by hand: find the repeats and keep each idea in one place.
27 Rewrite all the copy on a page for a new brand 6:01 7:02 Two turns: a full rewrite and a sweep for leftovers of the old topic. Near parity.
28 Find everything off-topic on the page and fix it 3:48 7:11 Analysis plus surgery. Payload took almost twice as long: the page was rewritten field by field.

Landing Pages: Create

# Task Sanity Payload What happened
29 Clone a landing page 1:1 for a new topic 6:53 5:26 Both carried over every block and reference and rewrote the copy. Sanity also generated a hero image; Payload left no mention of the old topic at all. More below.
30 Clone a landing page for a regional variant 7:15 1:35 Sanity carried over all 11 blocks with references and rewrote the copy for the region, down to British spelling. Payload copied the page and rewrote the text in one pass in a minute and a half; 3 mentions of the old topic remained.
31 Assemble a landing page from scratch out of the site’s existing blocks 3:07 3:06 There is no template page; both assemble from the site’s block catalogue. Payload built 10 sections with real case studies and testimonials, but without a hero block. More below.

What This Shows

If you only look at the bottom line, the picture is even: Payload is faster on twenty tasks out of thirty-one, but the medians nearly match - 2:24 vs. 2:37. Two other observations seem more interesting to me. First: over the course of the runs, it felt like Sanity was getting faster at the same requests with each repeat, as if learning from them. I did not measure this separately, so I offer it as an observation, not a fact. Second: each agent has its own strong tasks. Sanity wins the two heaviest - a bulk write across a hundred and fifty articles and checking a whole page against its topic. Payload wins landing page clones, reference handling and anything that requires stepping outside the CMS.

Below are five stories where this is clearer than in the table. They also explain why the winner in each of them is not so much the agent as the CMS architecture underneath it.

Task 17. A Paragraph at the End of Every Article

In the first article, neither agent finished this task: Sanity reported it done without changing the documents, and our agent stopped on the volume. A month and a half later, the picture is different.

Add this paragraph as the last paragraph of the body of every published blog article: “Editor’s note: …” Link the words “CMS migration guide” to https://focusreactive.com/blog/cms-migration/. Change nothing else.

Sanity - 10:53 Payload - ~18:00
Coverage 147 of 148 published articles All published articles
Precision Paragraph last in the body, exactly once, anchor and URL byte for byte Paragraph last in the body, link in place
Exceptions Skipped only the guide article the link points to Work went in batches with pauses for confirmation
Where the result is In a release, waiting for one confirmation In drafts

Sanity did the task completely: one operation, the whole blog. The only skipped post is the guide article the link points to: the agent decided on its own that linking to itself would be odd. Our agent completed the task in eighteen minutes. It no longer stops on volume, but it takes every article through the full cycle - open, read, decide, write, verify - and a language model runs at every step. Multiply that cycle by a hundred and fifty articles and you get eighteen minutes instead of eleven.

This is the exact bottleneck I wrote about in the first article, before I knew what it looked like in numbers: bulk operations are not solved by how smart the model is, but by how the work is organised. For Sanity it is one mechanical mutation across every document. We do not have that mechanism yet, and it is the next step in development.

Field selection is a separate story. In articles migrated from Sanity to Payload, the text lives in a markdown field, while a field with the telling name content holds a single heading, and the agent has to work out which of the two the site actually renders. Sanity has no such fork: an article has one body. This is the flip side of Payload’s flexibility: the schema can be anything, and the agent has to understand it rather than trust field names.

Task 29. A 1:1 Landing Page Clone for a New Topic

This is the main task of the pilot: landing page clones accounted for a quarter of the requests and four fifths of the agent’s work. If your editors produce pages in series, look here first.

Take this landing /sanity-expert-agency/ as a base and make a copy with exactly the same look, but on the topic of hygraph-expert-agency. Fill it with the matching content, blocks and links.

Sanity - 6:53 Payload - 5:26
Structure 11 of 11 blocks in the original order 12 of 12 blocks, references 1:1 with the source, images in place
Text 4 mentions of the old topic - legitimate comparisons 0 mentions of the old topic (the source has 68)
Links All three links to related articles exist All 8 internal links point to existing pages
Extra Generated a new hero image for the topic Uses the source images, does not create new ones

Both did well here, and the differences are in character. Sanity also draws an image and finishes in seven minutes. Payload is a minute and a half faster and more meticulous: not a single word of the old topic remains, and every link points to a live page. One thing was left to the editor with both: the projects slider kept the old projects under a new heading. Neither agent worked out that “the same projects” and “the matching projects” are not the same thing.

Task 31. A Landing Page From Existing Blocks

This task came from the pilot verbatim. The editor who builds landing pages asked: “build a new page from scratch out of our blocks”. The first version of the agent did not understand what “our” meant: it built blocks from empty schemas and saved nothing in ten minutes. After that I added a block library to the agent - a catalogue of block types with real examples and their references, which it now assembles pages from. It is a good example of how the pilot changed the agent: not according to my plan, but according to what editors asked for.

Make a new landing about headless CMS for e-learning from our existing blocks, with new texts. Slug: headless-cms-for-elearning

Both finished in three minutes, one second apart. Payload assembled ten sections. The intro, case studies and testimonials are references to real documents on the site, not invented text; all the copy is new and about e-learning. One addition is left to the editor: there is no hero section in the set, the page opens straight with the intro, and the header has to be added by hand.

Task 8. A Table Broken Three Ways

A small task, but it shows well how each agent understands the boundaries of a request.

fix my markdown table in the Headless CMS Architecture vs. Traditional CMS

Sanity - 3:52 Payload - 1:21
Form Fixed all three breakages Fixed all three
Content Left the cell text alone Left the cell text alone; wrote “Criteria” into the empty header cell

One table, the same three breakages, and both handled it cleanly: not a single cell rewritten. Sanity did exactly what was asked in four minutes. Payload fixed the table in a minute and a half and allowed itself one liberty: it wrote “Criteria” into the empty header cell. Whether that is appropriate is the editor’s call, but it is the only thing they will have to check.

Tasks 18 and 20. What Only One of Them Can Do

Sanity - images (1:30) Payload - Ahrefs (1:04)
What it did Resized hero images in three articles; generated a new hero image in the cloning task Returned real search volumes and related terms from Ahrefs right in the conversation
What the other cannot do The Payload agent reads images but does not transform them The Sanity agent answers SEO questions from the model’s memory, without data

There is nothing to compare here: these are two different views of where an agent ends. For Sanity, the agent is part of the Studio: content, media, generation, all inside the platform. Payload Content Agent is built differently: it is a plugin inside the Payload admin that connects to external tools over MCP. Today that is Ahrefs; tomorrow it could be analytics, an issue tracker or any other service the team works with. The connection is declared in the plugin config, with no separate integration per tool. The result is that the editor gets content edits and data from external systems in one window, and that is what makes the agent a strong working tool specifically inside Payload.

Why the Agents Perform Differently

Sanity Content Agent Payload Content Agent
Where it lives In the Studio side panel, works with the open document In the Payload admin as a plugin; knows the schema of any collection, works with any Payload project
How it saves Changes are collected into a release and reach the Content Lake only after “Confirm all” Writes straight to drafts; the changes panel shows a per-document diff, a human publishes
How it works A few large operations: query the whole dataset, plan, verify, mutate, bulk process, search the web, generate images Many narrow actions and automatic checks: link integrity, table shape, “did anything actually change”
Strengths Bulk operations, media, care with links Single edits, assembling pages from blocks, external data over MCP
Weaknesses A tendency to answer in text instead of changing the document, no access to external services Bulk operations document by document, does not transform images

The safety principles I described in detail in the first article - drafts only, no deletions, an independent reviewer - did not change over the five weeks of the pilot. One thing did: the checks and the reviewer now run inside a single editing session instead of sending the agent around for a second pass. The agent sees exactly what did not add up and fixes only that, remembering what it has already done. For a team choosing a CMS, this means one thing: the agent publishes nothing on its own, and on both platforms the final word stays with a human.

What It Costs

When choosing a platform, the agent’s price matters as much as its speed, but the two are billed differently: Sanity charges credits for the agent’s work, while the Payload agent pays the model provider for tokens. Both figures are real - from Sanity’s billing and from the OpenAI console for the agent’s key - but they cannot be compared directly. During the comparison I ran Sanity more than 32 times: some tasks were repeated while I was debugging the scenarios, and the billing shows only one total for everything. So we do not derive a per-task price for Sanity. On Payload every task ran once, and the cost is counted precisely. The billing model itself is an advantage of the Payload agent: you bring your own OpenAI or Anthropic key, pay the provider directly at its rates, see the spend per request in its console and can manage costs - switch to a cheaper model for edits, move up to a stronger one for planning, cap the budget at the key level. There is no platform fee or vendor margin in the price. Only tokens.

Sanity Payload
Total for the comparison $86.40 - 1,728 credits for all runs, including repeats of heavy tasks $12.50 - 31 tasks, one run each
Per task Not derived: billing shows only the total, and some tasks were run several times ≈ $0.39; median $0.21
What is included Model, platform and vendor margin Model only: gpt-5.4 for planning, gpt-5.4-mini for edits, 84% of input from cache
Most expensive task Unknown The paragraph in 148 articles: $5.66 - almost half the total

For scale: five weeks of the pilot with two editors cost about $20. What costs the agent the most is the same thing that takes it the longest: bulk writes, where the model takes part in every document.

The Takeaway: If You Are Choosing a CMS by Its Agent

The agent does not replace the usual criteria for choosing a CMS: data model, hosting, price, engineering team. But it shows clearly where each platform is heading. In the agent, a platform has nowhere to hide: it can do exactly what its architecture allows.

Let me be upfront: I have no goal of outrunning Sanity’s agent on speed. Sanity was the first to show how a content agent should work inside a CMS, and its agent was my reference point and source of ideas when I built Payload Content Agent. Every measurement in this article serves one purpose: to understand where our agent already delivers at least the same effectiveness, where it does not yet, and what needs finishing to get there. The table is a working tool for development, not a scoreboard.

Sanity built its agent around a single content store and a single query language. One operation covers the whole dataset, releases give you a safe “undo everything”, and on bulk edits that advantage shows immediately. The agent is already built into the platform, with nothing to install or configure. If your editorial team works in large series of changes and does a lot with media, Sanity gives you all of that out of the box.

Payload gave its agent the same things it gives a developer: the schema, the Local API and the ability to connect external services. The agent sees the structure of a page down to every reference and can step outside the CMS - into Ahrefs, into analytics, into any service you connect. If your editors assemble pages from blocks and keep three other tools in their heads besides the CMS, this is your option. And it is not tied to our site: the plugin reads the schema of any Payload project and does not ask you to rework your content model for it.

If you are choosing between these two CMSs right now and the presence of an agent tips you towards Sanity, keep in mind that for Payload this difference is about to disappear. We are working on taking our agent out of internal beta and making it available to other teams. Choose the platform by how it handles content, hosting and development. The agent will be there either way.

Both agents write drafts only, and both make mistakes - the table above leaves no doubt about that. The difference is where those mistakes are visible: Sanity shows them before the write, Payload in the diff afterwards. Which of the two modes suits your team better will tell you more about the choice than a difference measured in seconds.

What It Changes for an Editorial Team

Look at the task list again through a content manager’s eyes. Change the spelling of a term in a hundred articles. Append one paragraph to the end of every published article. Check that a link goes where it should. Fix a table, restore a missing space, write a meta description, bold one fragment in the middle of a long text. None of these tasks takes talent, but every one of them takes time. Maintaining a living content library is made of tasks like these, and for years they ate into an editor’s working day because there was nobody else to do them.

Over the five weeks of the pilot, that routine moved into the chat. The blog editor stopped opening every article to find one dash in it and writes the agent a single sentence instead. The landing page editor stopped assembling a page by hand from fifteen blocks and simply describes what the result should be: take this block from here, replace the case studies with the ones from there, make a copy about another topic. Five weeks of that work cost about $20 in model spend.

What the team gets out of it. Library maintenance stops being postponed: an edit that used to wait “until the next big content refactor” is now done the same day. The site lives in one state instead of three: older articles get the same links, the same terminology and the same formatting as new ones. Content errors are found and fixed before a reader or a search engine notices them.

But the point is not speed. The goal is not to build a tool that beats Sanity’s agent on the clock. It is to take the routine off the editor and do it reliably. The editor spends the freed-up time on what the agent will not do: deciding which topics the site needs, how to position the product, what a reader should take away from a page and why they would want to come back. The content manager stops being a CMS operator and becomes an editor in the original sense of the word: responsible for meaning, not mechanics.

For the business it is a simple trade: routine goes to the tool, strategy stays with the person, and each does what it is better at.

If you want to try both against your own content, let’s talk: we work with both platforms and will help you compare them on your tasks, not ours.

Payload vs. Sanity Content Agent FAQ

No, both agents received them in their original form. The one exception: for Sanity, in three tasks the page or block name had to be swapped for one that exists in its dataset.

It is an architecture question, not a model question. Sanity runs one mutation across the whole dataset; our agent currently takes every document through a full cycle with the model involved. A mechanical bulk write without the model at every step is the next item on the plan.

Not yet: we are working on taking the agent out of internal beta. It is a plugin that reads your Payload project's schema at startup and does not require reworking your content model. If you want to try it before the public release, reach out.

No. Both write drafts only. Sanity collects changes into a release and writes them after a human confirms; the Payload agent creates a draft and shows a diff, and a human publishes. Deletion is absent from the Payload agent at the tool level, not just forbidden in a prompt.

Yes. Payload Content Agent can generate and rewrite content directly inside your CMS, from meta descriptions and article edits to landing-page copy and new pages assembled from existing blocks. But content generation is only part of its role: it can also update references, fix formatting, maintain links, work across multiple documents, and connect to external tools such as Ahrefs. All changes are saved as drafts, so an editor reviews and publishes the final content.