A headless CMS for web apps that lets youfocus on what matters.

Unlike other headless CMS, Payload doesn't stop at websites. It can power ecommerce apps, SaaS, video game backends, and any other web app you can dream up.

My290 Web App

01

Code Driven

Payload's is entirely driven from a code-based configuration, all fully typed in TypeScript. No fumbling around with a GUI. All code is stored in your version control - exactly how it should be.

02

Instant APIs

Get instant and fully-featured REST, GraphQL, and server-side Node APIs based upon the shape of your data. Extend them easily with hooks, access control, and more.

03

Customize with hooks

Payload's hooks enable an unprecedented amount of control over your data and logic flow. Inject your custom business logic wherever you need.

04

Access Control

Deep access-control written purely with code for maximum flexibility. Want to integrate with another auth provider? No problem, drop in your code.

04

Admin Panel

Admin UI back-office that is automatically generated based upon your data configuration. Easily swap in custom React components and add additional views.

06

Authentication

Make use of highly secure and customizable user auth out of the box, including function-based access control.

Retain full control

Keep full control over your Express app.

Nothing is imposed on the structure of your app. Just initialize Payload and pass it your Express app. Maintain your own functionality outside of Payload.

1
const payload = require('payload');
2
const express = require('express');
3
4
const app = express();
5
6
// Just pass your app into Payload and everything
7
// will be scoped to Payload routers.
8
9
payload.init({
10
secret: 'XXXXXXXXXXXXXXXXXXXXXXXXX',
11
express: app,
12
});
13
14
app.listen(process.env.PORT, () => {
15
console.log(\`Application listening on \${3000}...\`);
16
});
17

Extend via Hooks

Implement custom business logic with Hooks.

Both collection and field-level hooks enable an unprecedented amount of control over your data and logic flow. Customize output, sanitize incoming data, or easily integrate with third-party platforms.

Learn about Hooks
1
const Customers = {
2
// ...
3
hooks: {
4
beforeChange: [
5
// Before the Customer is created or updated,
6
// sync it to Hubspot
7
syncCustomerToHubspot,
8
],
9
afterChange: [
10
// Send the new Customer a welcome email
11
// after it's successfully created
12
sendWelcomeEmail,
13
],
14
afterRead: [
15
// Dynamically append user's active subscriptions
16
// straight from Stripe
17
addStripeSubscriptions,
18
],
19
},
20
};
21

Powerful Access Control

Secure your app with function‑based access control.

Access control functions give you control based on either a document or field level. Build out your own RBAC or any access control pattern you need.

Read about access control
1
const Orders = {
2
// ...
3
access: {
4
create: () => true, // Everyone can create
5
read: ({ req: { user } }) => {
6
if (user) {
7
return { // Users can only read their own
8
owner: { equals: user.id, },
9
};
10
}
11
12
return false; // Not logged in? Can't read any
13
},
14
update: ({ req: { user } }) => {
15
// Only Admins can update Orders
16
if (user.roles.includes('admin')) return true;
17
return false;
18
},
19
delete: () => false, // No one can delete
20
},
21
};
22

Auto-generated admin panel

Don't build an admin panel to manage your app from scratch.

An Admin UI back-office is automatically generated based upon your data configuration. Fully-extensible, easily modify an existing component or swap in your own custom React components.

Learn about the Admin UI
Web app admin panel created with Payload

Payload provides solutions, not roadblocks.

You can host it yourself, or let us handle hosting for you on Payload Cloud.