Payload is now completely free and open-source.
If you like what we're doing, stop by GitHub and give us a star!
Alternative to Strapi CMS

If you compare Payload's APIs to Strapi's, you'll instantly see that Payload is a much more simple headless CMS to understand and work with, yet it's still significantly more extensible and easily customizable to meet your business needs.

Code-based Configuration

Payload is fully code-based and can be version controlled easily. No clicking around a GUI to start every project.


Payload is config based, not generated via GUI. If you're going to write code, then write code. Leverage your version control, share fields and functions between projects, and get started without clicking around a GUI for every project.

TypeScript Support

Payload has first-class support for TypeScript, including type generation from your data models. You can be certain that you'll be productive in your IDE without having to go through mountains of documentation.

Simple plugin dev

Thanks to Payload's config-based approach, building plugins could not be easier. Take in a config, return an updated config. To build a plugin for Strapi, you need to learn how to do it the Strapi way which takes a significant amount of learning.

Open-ended access control

Build any type of access control pattern you can dream of with Payload.

Strapi only supports role-based access control (RBAC) which limits you to only being able to control who can perform which actions to your data. However, Payload supports function-based access control which can be used on either a document or field-by-field basis to build any type of control that you can think of.

Learn about Payload's access control
const Orders = {
// ...
access: {
create: () => true, // Everyone can create
read: ({ req: { user } }) => {
if (user) {
return { // Users can only read their own
owner: { equals:, },
return false; // Not logged in? Can't read any
update: ({ req: { user } }) => {
// Only Admins can update Orders
if (user.roles.includes('admin')) return true;
return false;
delete: () => false, // No one can delete
Payload rich text editor showing experience.
Extensible Rich Text

Payload has a true JSON-based Rich Text Editor

Payload's Rich Text editor doesn't store content in markdown or a string of HTML like Strapi's. Instead, it saves JSON, and the best part is that you can build custom elements directly into it with ease. Embed YouTube videos, add custom text treatments and effects, reference other documents, and embed media dynamically.

Read about Payload's Rich Text Editor
More Features

Payload supports many features that Strapi lacks.

Field-Level Localization

Payload features deep field-based localization support. Maintaining as many locales as you need is easy. Only need to localize a few fields? No problem, all other fields will use your fallback locale.

Conditional Logic

Payload has an easy way to show and hide fields based on the value of other fields. For example, you might have an “Enable Link” checkbox, that, when checked, a few more fields should be rendered. Strapi does not support this feature.

More Powerful Hooks

Both document and field-level hooks expose a ton of potential. Customize output, sanitize incoming data, or easily integrate with third-party platforms. A truly-powerful pattern.

Get started with one line.

npx create-payload-app