← All posts

Explainer

Draft or published? How each CMS decides, and why it matters when an AI writes

Someone studying work on two screens in a dark office, before deciding anything.

The first question anybody asks before letting an assistant write on their website is whether it will put things live. The answer depends on a word, and the word is different on every platform: WordPress says draft and pending and private and future, Joomla says unpublished and archived and trashed, Ghost has one called sent that cannot be taken back. An assistant that assumed one platform's vocabulary would be unpublishing pages on another. The table below is each platform's own list, in each platform's own order, read from the software that talks to it.

·

This looks like a detail and it is the single most common source of real bugs in software that works across platforms. The one in our own history is instructive: our content screen defaulted to WordPress's word for "any status", and six of the ten platforms we supported at the time refused that word outright — so an ordinary page load failed on more than half the catalogue, and it had nothing to do with permissions.

11 platforms, 11 vocabularies

Each row is what that platform calls the states a piece of content can be in, in the order it puts them. The green word is the one that means a visitor can see it. Nothing here is translated into a shared vocabulary on purpose: a platform's own word is the one its screens show you, and inventing a common language for all of them is how the meaning gets lost.

Platform Its own words, the one a visitor can see first
WordPress Published Draft Waiting for review Private Scheduled
Joomla Published Not published Archived In the bin
Drupal Published Not published
Craft CMS Published Scheduled Expired Not published
Concrete CMS Published Draft
Ghost Published Draft Scheduled Sent
Webflow Published Draft
Wix Published Scheduled Draft Waiting for review
Contentful Published Scheduled Draft Archived
Strapi Published Draft
Sanity Published Draft

Read from each adapter's own status list — the same list your content screen filters on. The green word is the one that means a visitor can see it.

The one thing this table is built on: the first word in each row is the state that means published. That is not a presentation choice, it is a fact the software relies on — the content screen marks a row as live by comparing its status to that first word, and the permission gate uses the same comparison to decide whether editing something counts as changing what visitors see. One fact, read in three places, so they cannot disagree.

Four places the difference bites

None of these is hypothetical. Each one is a bug we have had, or one we designed around after reading a platform's source.

Why we start with drafts, everywhere

Across all 11 platforms, anything an assistant creates arrives as something nobody can see. That is not a safety setting you switch on, it is how the writing tool is built: the tool that creates content creates a draft, and moving something to a state a visitor can see is a different tool that asks for a different permission.

The permission to change what visitors see starts unticked, and — this is the part worth knowing — a connected assistant cannot ask for it. Whatever ChatGPT or Claude requests when it connects, the request for publishing is dropped before you are shown the approval screen, so the box you see unticked is a box nothing but your own click can tick. We did that because the alternative undermines the promise: a permission the client requested appears in the list of things it will be able to do, where there is no box to untick.

What you see on your own screen

Each platform's own words, in each platform's own order, with the live one marked — the same list this post's table is printed from. The filter on your content screen uses it too, which is why asking for "drafts only" means the right thing on a platform that calls them unpublished. It is a small piece of work and it removes an entire class of question from a support inbox: nobody has to learn our vocabulary for their website.

Honest limit: the table is each adapter's own status list, which is what the software sends and filters on. How a given platform behaves when asked to filter by one of those words has been exercised on some and written from documentation on others — Contentful, Webflow and Wix were ignoring the status filter entirely until recently, and their fixes were written from the documentation rather than proved. Their own pages say which state each capability is in.

Questions we get asked about this

Will an assistant publish something by mistake?
It cannot, unless you tick the publishing permission yourself. Creating content creates a draft on every platform here, and the permission that changes what visitors see is separate, starts unticked, and cannot be requested by the assistant.
What if my platform has no draft state?
All 11 have something that means "not visible yet", which is why this works at all. What differs is the word and the mechanism — on one it is a separate document, on another an unapproved version of the page.
Can it schedule a post for next Tuesday?
On 6 of the 11 platforms, yes: WordPress, Joomla, Craft CMS, Ghost, Wix and Contentful. On the rest, the honest answer is no, and you will be told so rather than having it quietly published now.

Where to go next