Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
upstream: github.com/strapi/strapi (opens in new tab) · github.com/payloadcms/payload (opens in new tab)
Pick Strapi
If editors should shape content types in an admin builder and you want the CMS kept separate from whichever frontend you build.
Pick Payload
If your site is already Next.js and you want collections and access control as TypeScript config in the same codebase, under a plain MIT licence. Neither ships a prebuilt image; both are rated 3 out of 5, and Payload idled at about 100 MB against Strapi's 189 MB in our tests.
Strapi and Payload are the two Node.js headless CMS projects most people compare when they want content types, an admin panel and an API without paying for a hosted service. Both are rated 3 out of 5 to deploy, both run on PostgreSQL, and neither publishes a ready-made production image: in our tests we scaffolded a project with each one's installer and built it ourselves. The difference is where the project lives. Strapi is a standalone Node.js server you scaffold and deploy. Payload is a framework that installs into a Next.js app, so the CMS and your website can be one codebase.
Strapi is built on Node.js, TypeScript and React. You design content types in an admin Content-Type Builder, and Strapi generates a REST API, role-based permissions and a media library for them. GraphQL is available as a plugin.
Payload is code-first. Collections, access control, the admin panel, and the REST, GraphQL and Local APIs are all defined in TypeScript config. The Local API means code running inside the same Next.js app can query content directly instead of going over HTTP.
If you want to click content types into existence and let an editor adjust them, Strapi's builder is the shorter path. If you want the schema reviewed in pull requests like any other code, Payload's config is the better fit.
Payload is MIT. Strapi's core is MIT with proprietary enterprise modules, so read which features you rely on before committing. For a plain self-hosted content API the free core is what you will run; the licence line matters when a feature you need turns out to sit in the enterprise part.
Both installs passed our verification on Ubuntu 26.04, and both took more steps
than a one-file Compose project. Strapi's route is create-strapi pinned to a
version, then a production Dockerfile from Strapi's Docker docs, then Compose
with Postgres. Payload's is create-payload-app with its blank template, after
which we had to turn on standalone output in next.config.ts, copy the
template's .npmrc into the build, and give the unprivileged runtime user a
writable media folder for uploads. Payload also needs a first migration created
and applied for Postgres in production, because schema push is development-only.
None of this is hard, but it is why neither is a two-minute install. Budget an afternoon, not a coffee break.
Our minimum RAM figure is the same for both, 2 GB, and it is an estimate that reflects the build step. Idle on our GCP test box (e2-standard-2) we measured about 189 MB for Strapi and about 100 MB for Payload, with roughly 17.5 GB and 10.5 GB of disk used respectively once the images were built. Treat the 2 GB as headroom, not a prediction of idle use; we did not isolate what drives it.
Choose Strapi if editors need to change the content model from the admin UI, or if you want a CMS that stays separate from whichever frontend you build.
Choose Payload if your frontend is already Next.js and you want the CMS to live in the same app, with the schema in TypeScript and the MIT licence with no enterprise carve-out.
Both are headless CMS options in the Backend & BaaS category; a third approach is layering over an existing database, covered in Strapi vs Directus and Payload vs Directus. Details for each app are on the Strapi and Payload pages, and if you are replacing a hosted backend, see our Firebase alternatives page.
Pick Strapi if editors should design content types in an admin builder and you want a CMS separate from your frontend. Pick Payload if your site is Next.js and you want the schema as TypeScript config in the same app under the MIT licence.
Not one we could install from. Our verified route scaffolds a project with create-strapi, builds it with the production Dockerfile from Strapi's Docker docs, and runs it with Compose beside Postgres.
Payload is MIT-licensed. It installs into a Next.js app and defines collections, access control and the admin panel in TypeScript config.
The blank template's Dockerfile needed standalone output in next.config.ts, the template's .npmrc, and a writable media folder for uploads, and Postgres in production needs a first migration applied because schema push is development-only.
Neither figure is a published requirement; our 2 GB for each is an estimate. We measured about 189 MB idle for Strapi and about 100 MB for Payload on a GCP e2-standard-2 box on 2026-10-14.
Paid link — we earn a commission if you shop through it.
A code-first CMS inside your Next.js app vs. an API and admin layer over a SQL database.
A CMS where you build the content model vs. a data platform that sits on top of your SQL database.
A REST/GraphQL data layer over your own SQL database vs. an all-in-one BaaS with auth, functions, and messaging built in.