Adds an admin-alerts collection and a dashboard panel that shows system messages on the Payload admin home page. Alerts can be broadcast to all authenticated users or targeted at selected users, and each user can dismiss them individually. Requires Payload 3, @payloadcms/ui and React, and uses a configurable users collection slug.
Dashboard system alerts for the Payload CMS admin UI — author messages, target audiences, allow per-user dismissals.
Installation
npm i payload-plugin-admin-alerts1
Stars
0
Forks
0
Open Issues
5 months ago
Last Updated
20
Weekly Downloads
v1.0.0
npm Version
130.7 KB
Unpacked Size
0
Dependencies
Trends appear after 7 days of data. Daily snapshots have not started yet.
Trends appear after 7 days of data. Daily snapshots have not started yet.
Each point is npm's rolling 7-day download count.
Health Score
Composite score based on GitHub activity, stars, npm downloads, publish recency, dependency count, and package size.
Badge for your README
[](https://payloaddirectory.dev/plugins/1243726777-root)<a href="https://payloaddirectory.dev/plugins/1243726777-root"><img src="https://payloaddirectory.dev/badge/1243726777-root.svg" alt="Payload Directory"></a>README
Dashboard system alerts for the Payload CMS admin UI. Author messages from the admin panel, target an audience (everyone or specific users), and let users dismiss them individually.
admin-alerts collection for authoring messages (title, content, type, audience, dismissable flag)dismissedBy relationship field — no extra collectioninfo, success, warning, errorPOST /admin-alerts/:id/dismiss)pnpm add payload-plugin-admin-alerts
# or: npm install payload-plugin-admin-alerts
# or: yarn add payload-plugin-admin-alerts
Peer requirements: payload ^3.0.0, @payloadcms/ui ^3.0.0, react ^18 || ^19, react-dom ^18 || ^19.
Add the plugin to your payload.config.ts:
import { buildConfig } from 'payload'
import { payloadAdminAlerts } from 'payload-plugin-admin-alerts'
export default buildConfig({
plugins: [
payloadAdminAlerts({
// defaults shown
disabled: false,
usersCollectionSlug: 'users',
}),
],
// ...
})
That's it. After Payload restarts you'll see a System → Admin Alerts entry in the admin nav and a new alerts panel on the dashboard.
type PayloadAdminAlertsConfig = {
/**
* Disable the runtime behavior (dashboard UI + endpoints) while keeping
* the collections registered, so the database schema stays consistent.
* @default false
*/
disabled?: boolean
/**
* Auth collection slug used for alert authors and audience targeting.
* @default 'users'
*/
usersCollectionSlug?: string
}
| Option | Type | Default | Notes |
|---|---|---|---|
disabled | boolean | false | Skips registering the dashboard component and endpoints. Collections stay so migrations don't break. |
usersCollectionSlug | string | 'users' | Used by the createdBy and targetUsers relationship fields, and by access control checks. |
Alerts are a normal Payload collection (admin-alerts). Create them from any collection hook, job, or endpoint with the Local API — for example, notify editors when content goes live:
import type { CollectionAfterChangeHook, CollectionConfig } from 'payload'
const alertOnPublish: CollectionAfterChangeHook = async ({
doc,
operation,
previousDoc,
req,
context,
}) => {
// Only run once per publish, not on every save
if (context.skipAdminAlert) return
if (operation !== 'update') return
if (doc._status !== 'published' || previousDoc?._status === 'published') return
await req.payload.create({
collection: 'admin-alerts',
data: {
title: `Published: ${doc.title}`,
content: 'A new post is live. Review it from the dashboard if needed.',
type: 'success',
status: 'active',
audience: 'all',
dismissable: true,
},
req, // pass req so the alert stays in the same transaction
user: req.user, // createdBy is auto-set from the authenticated user
})
}
export const Posts: CollectionConfig = {
slug: 'posts',
versions: { drafts: true },
hooks: {
afterChange: [alertOnPublish],
},
fields: [
{ name: 'title', type: 'text', required: true },
// ...
],
}
Target a specific user (for example, the post author) instead of broadcasting:
await req.payload.create({
collection: 'admin-alerts',
data: {
title: 'Your draft was rejected',
content: 'An editor left feedback on your submission.',
type: 'warning',
status: 'active',
audience: 'selected',
targetUsers: [authorId],
dismissable: true,
},
req,
user: req.user,
})
Notes
req into nested create calls so the alert participates in the same database transaction as the triggering operation.user: req.user when the hook runs in an authenticated request; the plugin sets createdBy automatically on create.req.user, use overrideAccess: true and set createdBy yourself if you need an author for update/delete access.req.context flags (for example context.skipAdminAlert) if your hook chain could re-trigger itself.admin-alertsAuthored from the admin panel. Fields:
| Field | Type | Purpose |
|---|---|---|
title | text, required | Heading shown on the dashboard card |
content | textarea, required | Body text |
type | select | info / success / warning / error — drives the styling |
status | select | active / inactive — only active alerts are surfaced |
dismissable | checkbox | If true, users can dismiss the alert for themselves |
audience | select | all or selected |
targetUsers | relationship[] | Shown only when audience === 'selected' |
createdBy | relationship | Auto-populated on create, read-only |
dismissedBy | relationship[] | Users who have dismissed this alert; edit to re-show or pre-dismiss for specific users |
alertPreview | ui field | Live preview of how the alert will render on the dashboard |
Dismissals live on the alert itself as the dismissedBy relationship array — no separate collection. POST /admin-alerts/:id/dismiss appends the requesting user to the field; the dashboard query filters out alerts where the current user appears in dismissedBy. To re-show an alert to a specific user, remove them from dismissedBy. To re-broadcast to everyone who'd dismissed it, clear the field.
The plugin registers two endpoints (mounted under your Payload API route, typically /api):
| Method | Path | Description |
|---|---|---|
| GET | /admin-alerts/dashboard | Returns { alerts: DashboardAlert[] } for the current user |
| POST | /admin-alerts/:id/dismiss | Records a dismissal for the current user |
Both require an authenticated request.
createdBy)Dismissals are write-only and scoped to the requesting user.
pnpm install
pnpm dev # starts the dev/ Payload app on http://localhost:3000
pnpm test:unit # vitest unit tests
pnpm test:e2e # playwright e2e tests
pnpm check # typecheck + lint + tests
The dev/ directory contains a minimal Payload app preconfigured with the plugin.
pnpm publish
prepublishOnly cleans dist/ and rebuilds. publishConfig swaps the source-pointing exports for the compiled dist/ outputs at publish time, so consumers always get the built files.
MIT
This plugin was tested and developed in relation to my upcoming fairytale builder app.

payload nav studio
Replace the Payload admin sidebar with a drag-and-drop navigation that each user can customize
640/wk13v3
payload enhanced sidebar
Tabbed sidebar navigation for the Payload admin panel that groups collections, globals and custom links
630/wk29v3
payload plugin search replace
Find and replace text across collections, including Lexical rich text, with a preview before saving
250v3
payload theme
shadcn-style redesign of the Payload admin panel driven by one accent color, with dashboard, command palette and dark…
69909/wk26v3
payload nested docs page tree
Drag-and-drop page tree with status badges for Payload nested docs collections in the admin list view
690/wk35v3
payload plugin info tooltip
Show field help as an info icon tooltip next to the label instead of a description under the field
670/wk6v3 v4