BuildWithMatija
  1. Home
  2. Blog
  3. Payload
  4. Payload CMS vs WordPress: 7 Critical Mental-Model Shifts

Payload CMS vs WordPress: 7 Critical Mental-Model Shifts

Why Payload CMS uses collections, Blocks fields and Next.js — rethink themes and plan WordPress-to-Payload migrations

14th August 2026·Updated on:18th August 2026··
Payload
Payload CMS vs WordPress: 7 Critical Mental-Model Shifts

Evaluating Payload CMS Implementation Costs?

Scope design, content structure, and migration hours to estimate a realistic production timeline and hosting setup.

Try the Cost EstimatorGet a Second Opinion

📚 Comprehensive Payload CMS Guides

Detailed Payload guides with field configuration examples, custom components, and workflow optimization tips to speed up your CMS development process.

No spam. Unsubscribe anytime.

📄View markdown version
0

Frequently Asked Questions

About the author

Matija Žiberna

Matija Žiberna

Full-stack developer, co-founder

AboutResume

Self-taught full-stack developer sharing lessons from building software and startups.

I'm Matija Žiberna, a self-taught full-stack developer and co-founder passionate about building products, writing clean code, and figuring out how to turn ideas into businesses. I write about web development with Next.js, lessons from entrepreneurship, and the journey of learning by doing. My goal is to provide value through code—whether it's through tools, content, or real-world software.

Contents

  • The question that gives it away
  • Why WordPress developers reach for a theme
  • What Payload asks instead
  • Collections model data. Blocks model composition. Components render it.
  • There's no theme, because presentation moved outside the CMS
  • Choosing how a listing renders per brand
  • Migrating without reproducing wp_posts
  • FAQ
  • The takeaway
On this page:
  • The question that gives it away
  • Why WordPress developers reach for a theme
  • What Payload asks instead
  • Collections model data. Blocks model composition. Components render it.
  • There's no theme, because presentation moved outside the CMS
Build with Matija logo

Build with Matija

Senior-led B2B websites, applications, content systems, and digital infrastructure. Business-first, full-stack, AI-assisted, no handoffs.

Services

  • B2B Website Development
  • CMS Architecture Review & Platform Blueprint
  • Next.js + Payload Advisory
  • AI Integration & Implementation

Resources

  • CMS Hub
  • B2B Website Strategy
  • E-commerce Hub
  • Blog
  • Case Studies

Payload CMS

  • Payload CMS Developer
  • Payload CMS Migration
  • Payload CMS Demos
  • All Payload CMS Resources

Discuss your project

Planning a rebuild, migration, application, workflow change, or platform decision? Start with the business problem and the system behind it.

Book a discovery callContact me →
© 2026Build with Matija•All rights reserved•Privacy Policy•Terms of Service
BuildWithMatija
Get In Touch

WordPress developers moving to Payload tend to ask the same question early on: which theme controls how a site looks? I've fielded that question from more than one experienced WordPress team, and it always points to the same gap. Payload organizes a site around three ideas instead: explicit collections that define your data, a Blocks field that defines page composition, and a Next.js application that owns presentation.

This guide walks through that model directly: how WordPress's generic post table compares to Payload's explicit collections, how a Blocks field turns into rendered React components, why there's no theme switcher to look for, and what an honest WordPress-to-Payload migration actually requires.

The question that gives it away

The theme question carries a WordPress assumption: that a CMS owns the public site and hands out presentation through a theme. Payload works from a different premise. Collections model data. A Next.js application renders it. There's no theme picker in Payload's core, because nothing in Payload plays that role.

Here's the quick map I give teams before we touch any code:

WordPress conceptPayload equivalentKey difference
Post type (wp_posts + post_type)CollectionEach collection has its own explicit schema, not a shared table
Custom field (wp_postmeta)Typed field on a collectionFields are declared in code, not registered by a plugin at runtime
Taxonomy (wp_terms)Relationship fieldModeled as a typed relationship to another collection
Active themeNext.js applicationPresentation lives in application code, not inside the CMS
Template hierarchyBlock-to-component mappingA block's blockType selects a React component directly

The rest of this guide fills in why each row works the way it does.

Why WordPress developers reach for a theme

WordPress grew from a blogging tool into a general-purpose CMS, and its data model still shows that history. Pages, posts, attachments, revisions, and custom post types all live in the same wp_posts table, separated only by a post_type column, as WordPress's own Theme Handbook documents. Most custom fields sit in wp_postmeta as key-value rows, taxonomies spread across wp_terms and two join tables, and plugins add whatever additional tables they need.

That structure is genuinely flexible. A plugin can register a new post type, attach metadata to it, and hand rendering to the active theme, all without touching WordPress core. Years of working inside that pattern train a very specific instinct: put the content somewhere generic, attach fields after the fact, and let the theme decide how it looks. It's a reasonable instinct. It just doesn't carry over.

What Payload asks instead

Payload describes itself as a config-based, code-first CMS and application framework, and that framing matters more than it sounds. You don't start with a generic bucket and layer meaning onto it later. You start by defining the domain directly.

A site managing products, recipes, and events gets three separate collections, each with its own schema:

text
Products   → SKU, brand, ingredients, variants, regulatory content
Recipes    → ingredients, instructions, allergens, prep time
Events     → date, location, capacity, related products

A Payload collection is a group of documents that share one schema, defined once in TypeScript. From that definition, Payload generates the admin interface and the REST and GraphQL APIs for managing those documents. The question a Payload collection answers isn't "what kind of post is this?" It's "what entity does this application actually manage?"

Collections model data. Blocks model composition. Components render it.

The next mix-up is treating collections, blocks, and frontend components as the same thing. Each one has a distinct job:

ConceptResponsibility
CollectionDefines a document type and its data model
FieldDefines a value, relationship, or validation rule
Blocks fieldStores an ordered array of typed content sections
Block configDefines the data editors can enter for one section type
React componentRenders that block or document
Next.js routeComposes the full page and application shell

A Payload Blocks field stores an array of typed objects, each with its own schema, so an editor can build a page from sections like a hero, a product listing, or a call to action. Each entry stores a blockType, which is exactly the block's slug. The frontend reads that blockType and maps it to a React component — this is precisely what the RenderBlocks component in Payload's official website template does.

Here's the full pipeline, from request to rendered page:

Payload page rendering pipeline: request a page, fetch the Page document, read the Blocks field, match block type to component, render in Next.jsPayload page rendering pipeline: request a page, fetch the Page document, read the Blocks field, match block type to component, render in Next.js

Payload models the editable structure. Your application renders it. Once that split is clear, most of the remaining confusion clears up with it.

For a working implementation of this exact pattern, see Payload CMS Next.js: Build One Dynamic page.tsx Route, which walks through a single dynamic route handling block rendering and tenant-aware queries together.

There's no theme, because presentation moved outside the CMS

In classic WordPress, the active theme holds template files like single.php and archive.php, and WordPress picks between them using its template hierarchy. With Payload and Next.js, the public interface is application code: headers, footers, product cards, and design tokens are React components and layouts, full stop.

That split becomes obvious once you draw it:

WordPress keeps its theme inside the CMS; Payload hands all presentation to an external Next.js applicationWordPress keeps its theme inside the CMS; Payload hands all presentation to an external Next.js application

This can look like a theme system from the outside, especially once a project supports several brands off one Payload instance. It isn't one. There's no built-in theme switch — it's application architecture that a team designs on purpose.

If one Payload installation serves several brands, some components stay shared and others stay brand-specific:

text
Shared      → product data model, SEO fields, media handling, base blocks
CanPrev     → header, product grid, hero variants, design tokens
Orange Naturals → header, product carousel, hero variants, design tokens

The incoming hostname resolves the active site, and site context determines which navigation loads, which design tokens apply, and which block variants editors can use. For guidance on choosing what counts as a tenant boundary in a setup like this, see Payload CMS Tenant: How to Choose the Right Boundary.

Asking "where is the theme?" points a project in the wrong direction. The more useful question is which presentation decisions belong to application code, which belong to site configuration, and which editors should control directly.

Choosing how a listing renders per brand

A related question comes up almost as often: what if one brand shows products as cards and another shows them as a list? In WordPress, the instinct is to look for a separate archive template. In Payload, the decision comes down to who should control it:

ApproachWho controls itWhen to use it
Variant field on the Product Listing blockEditors, per pageDifferent pages on the same brand need different layouts
Default set in site configurationWhoever manages that brand's settingsEvery listing on a brand should look the same by default
Brand-specific component chosen by routeDevelopersThe decision should never change without a deploy
Fully separate route layoutsDevelopersBrands share little enough that conditionals would be worse than duplication

Payload doesn't prescribe one answer here, because this is application design, not CMS theme selection.

Migrating without reproducing wp_posts

Migration is where the WordPress mental model gets expensive if it survives the move. A weak migration asks how to reproduce every wp_posts row and wp_postmeta key inside Payload. A stronger one asks what the data actually means, where its source of truth lives, and what the target collection should look like.

That means doing the forensic work first: inventory every post type, taxonomy, and plugin-owned table; measure actual field population instead of trusting the admin screen; identify which fields originate outside WordPress entirely; and only then define Payload collections and relationships. The goal isn't rebuilding WordPress inside Payload — it's recovering the business model WordPress was representing and expressing it cleanly in the new system.

Complete 2026 WordPress to Payload Migration Guide covers the step-by-step version of this, including ACF field mapping, HTML-to-Lexical conversion, and keeping redirects SEO-safe.

FAQ

Does Payload CMS have a theme system like WordPress? No. Payload has no built-in theme or template-selection mechanism. Presentation lives entirely in your Next.js application code — headers, footers, and page layouts are React components you own directly.

Can I reuse WordPress plugins in Payload? Not directly. WordPress plugins are PHP and tied to WordPress's hooks and wp_posts structure. Payload's equivalent is a plugin system built for its own config, and most WordPress plugin functionality gets rebuilt as either a Payload collection, a custom field, or application logic in Next.js.

What replaces wp_postmeta in Payload? Typed fields defined directly on a collection. Instead of a plugin registering a meta key at runtime, every field a document can hold is declared in the collection's schema up front, with full TypeScript types.

Do I need Next.js to use Payload CMS? Payload's admin panel and Local API can run without Next.js powering your frontend, but the official templates and most production setups pair Payload with Next.js, since Payload 3.x is built directly on top of it.

Can one Payload installation power multiple brands or websites? Yes. A single instance can serve multiple brands by resolving the active site from the incoming hostname, then using that context to control navigation, design tokens, and which block variants are available — without any of it depending on a theme switch.

The takeaway

WordPress earned its architecture over two decades of supporting an enormous plugin and theme ecosystem, and it still does that job well for content-first sites. Payload was designed later, for a different job: typed application data with a frontend the engineering team owns outright. Recognizing which job you're actually solving for is most of what makes the switch between them straightforward.

Once that's settled, the rest of Payload reads clearly: collections define what the content is, fields define its structure, blocks define composable sections, and your Next.js application decides how all of it looks.

For a grounded look at what running Payload in production actually involves once you're past this first mental shift, see Payload CMS in Production: Honest Answers Developers Need.

Let me know in the comments if you have questions, and subscribe for more practical development guides.

Thanks, Matija