Simplify your stack and build anything. Or everything.
Build tomorrow’s web with a modern solution you truly own.
Code-based nature means you can build on top of it to power anything.
It’s time to take back your content infrastructure.

New in Payload: Dashboards, Developer Control, and Next.js 16

Release Roundup Jan
Release Roundup Jan

v3.66 through v3.75 introduced one of Payload's most-requested admin features — a fully customizable dashboard — alongside meaningful controls for background jobs, Next.js 16 compatibility, and new extension points in the admin UI.

Modular dashboards— v3.69

The Payload admin dashboard is now fully customizable using a widget system. Developers can add, remove, and arrange components on the dashboard — data visualizations, quick-action panels, custom summaries, whatever the project needs. Each widget is a standard React component, making this straightforward to build and maintain.

1
// payload.config.ts
2
export default buildConfig({
3
admin: {
4
dashboard: {
5
widgets: [
6
{
7
slug: "recent-orders",
8
Component: "@/components/widgets/RecentOrdersWidget",
9
label: "Recent Orders",
10
minWidth: "medium",
11
maxWidth: "full",
12
},
13
{
14
slug: "revenue-chart",
15
Component: "@/components/widgets/RevenueChartWidget",
16
label: "Revenue (30 days)",
17
minWidth: "large",
18
maxWidth: "full",
19
},
20
],
21
defaultLayout: [
22
{ widgetSlug: "revenue-chart", width: "full" },
23
{ widgetSlug: "recent-orders", width: "large" },
24
],
25
},
26
},
27
});
1
// components/widgets/RecentOrdersWidget.tsx
2
"use client";
3
4
export default function RecentOrdersWidget() {
5
return (
6
<div>
7
<h3>Recent Orders</h3>
8
{/* your widget UI */}
9
</div>
10
);
11
}

Job queue concurrency controls — v3.71

You can now configure how many jobs run simultaneously and define "supersedes" relationships between tasks — ensuring a newer job cancels an older pending one of the same type. This is especially useful for user-triggered workflows where only the most recent request should execute.

1
// payload.config.ts
2
export default buildConfig({
3
jobs: {
4
enableConcurrencyControl: true,
5
workflows: [
6
{
7
slug: "exportUserData",
8
concurrency: {
9
// One active export per user at a time
10
key: ({ input }) => `export-${input.userId}`,
11
// New export request supersedes any queued ones
12
supersedes: true,
13
},
14
handler: async ({ job, tasks }) => {
15
await tasks.buildExport({ input: { userId: job.input.userId } });
16
},
17
},
18
],
19
},
20
});

Next.js 16 support — v3.73

Payload is now fully compatible with Next.js 16, including support for the latest routing and rendering changes. You can upgrade your Next.js version without waiting on Payload to catch up.

beforeNav and afterNav component slots — v3.75

Two new component slots have been added to the admin layout: one before the navigation sidebar and one after. This gives developers a clean, supported way to inject custom UI into the admin — environment indicators, announcements, custom navigation items, or anything else that belongs in the shell.

1
// payload.config.ts
2
export default buildConfig({
3
admin: {
4
components: {
5
beforeNav: ["@/components/admin/EnvironmentBadge"],
6
afterNav: ["@/components/admin/SupportLink"],
7
},
8
},
9
});
10
// components/admin/EnvironmentBadge.tsx
11
export default function EnvironmentBadge() {
12
const env = process.env.NEXT_PUBLIC_ENV ?? "development";
13
14
return (
15
<div
16
style={{
17
padding: "8px 16px",
18
background: env === "production" ? "#ff4444" : "#44aa44",
19
}}
20
>
21
{env.toUpperCase()}
22
</div>
23
);
24
}