Admin Notifications and Announcements
Benecaster displays admin notices in two places: a notification bell (🔔) in the Benecaster top bar and a persistent notice bar above all Benecaster screens. What appears where depends on each notice’s display_mode.
Where Notices Appear
Notification bell — the 🔔 icon in the Benecaster top bar shows a badge with the count of unread notices at or above your minimum severity preference. Clicking opens a slide-in panel listing each notice with its tier badge, title, message, timestamp, and dismiss button. A “✓ All” button dismisses all currently visible notices at once.
Persistent notice bar — a full-width colored stripe above all Benecaster admin screens, below the WordPress admin toolbar. Used for high-priority notices that need to stay visible until acknowledged or resolved. When multiple bar-eligible notices exist, only the highest-tier one is shown. A close [✕] button dismisses a dismissible bar notice; non-dismissible bar notices remain until the underlying condition clears.
display_mode controls which surface a notice uses:
| Value | Where it appears |
|---|---|
bell |
Bell panel only (default for most notices) |
bar |
Persistent bar only |
both |
Both surfaces simultaneously |
Critical notices default to both. All others default to bell.
Notice Tiers
| Tier | Color | Always shown | Example |
|---|---|---|---|
| Critical | Red | Yes — cannot be suppressed | Security vulnerability, expired license |
| Warning | Amber | No | PHP approaching end-of-life, feed errors |
| Info | Blue | No | Subscriber milestone, new feature announcement |
| Tip | Purple | No | Setup step incomplete, usage hint |
| Marketing | Teal | No | Add-on promotion, upgrade nudge |
Notification Severity Preference
Settings → Notifications lets you set the minimum notice tier you want to see. The dropdown has four options:
| Option | What it hides |
|---|---|
| Critical only | All notices except critical |
| Warnings and above | Info, tip, and marketing |
| Info and above | Tip and marketing |
| Show all notices (including promotions) | Nothing |
Default is “Show all notices.” Critical notices are always shown regardless of this setting. The preference is stored as benecaster_min_notice_tier in wp_options and is site-wide — it applies to all admin users.
Built-in Health Checks
Benecaster runs a set of health check classes and generates local notices automatically — the tables below are the full list. Most checks run once each time you use the admin area, so they do not slow down every page. The feed health check and license check also run automatically once a day, so they still appear on days when nobody logs in.
PHP Version
| Trigger | Tier | Dismissible |
|---|---|---|
| PHP is below the minimum supported version | Critical | No |
| PHP is within 12 months of its end-of-life date | Warning | Yes |
Feed Health
| Trigger | Tier | Dismissible |
|---|---|---|
| RSS feed has returned errors on 3 or more consecutive checks | Warning | Yes |
Also runs automatically once a day, so feed errors surface promptly without you having to visit the site.
License Server
| Trigger | Tier | Dismissible |
|---|---|---|
| License server unreachable for more than 7 days | Warning | Yes — re-surfaces every 7 days while the condition persists |
| License expires within 30 days | Warning | Yes — re-surfaces every 7 days while the condition persists |
| License has expired and is in the grace period | Critical | No |
Runs automatically once a day, at the same time as the license check. The two dismissible notices re-surface every 7 days as long as the underlying condition is still true — dismissing them is a “remind me later,” not a permanent suppression.
Setup Completion
| Trigger | Tier | Dismissible |
|---|---|---|
| Setup wizard not completed more than 7 days after activation | Tip | Yes |
| No published episodes more than 30 days after activation | Tip | Yes |
Milestones
| Trigger | Tier | Dismissible |
|---|---|---|
| Subscriber count reaches 10, 50, 100, 250, 500, or 1,000 | Info | Yes |
| Episode count reaches 10, 25, 50, or 100 | Info | Yes |
Listener Support Setup
| Trigger | Tier | Dismissible |
|---|---|---|
| Listener Support is enabled but Stripe is not configured (checked weekly) | Warning | Yes |
Feed Request Log
| Trigger | Tier | Dismissible |
|---|---|---|
| Feed request log row count exceeded the configured hard cap and oldest rows were deleted | Warning | Yes — re-surfaces every 7 days while the log remains above cap |
Appears when the nightly check finds that the feed request log has grown past its maximum size. Benecaster automatically trims the oldest rows to 80% of cap when this happens, but the notice re-surfaces every 7 days as long as the log remains near the limit — a prompt to raise the cap or shorten the retention window at Settings → Tools → Feed request log. See Feed Request Log Retention →.
Buy-ups Not Attached to a Show
| Trigger | Tier | Dismissible |
|---|---|---|
| One or more buy-ups are left over from an upgrade with no show attached | Warning | Yes |
Can only happen on an install that had more than one show at the time it upgraded past a version that made buy-ups show-scoped — an install with a single show at that time had its buy-ups assigned automatically. The notice names the affected buy-ups and links directly to the Unassigned buy-ups self-service recovery screen, where you pick a show for each one from a dropdown and click Assign — no need to contact support.
License Server Notices
The license server pushes notices as part of the daily POST /validate response. These cover security alerts, version announcements, deprecation warnings, feature announcements, and promotional messages. Benecaster stores them in the benecaster_notices table with source = 'remote' and processes them alongside local health notices in the bell panel and notice bar.
Remote notices respect your severity preference setting — a marketing promotion from the server is hidden if you have set your minimum to “Warnings and above.”
All dismissals are site-wide. Dismissed License Server notices do not automatically return after a period of time — once dismissed, a notice with the same ID stays gone. The server can re-surface a notice by issuing a new notice ID (for example, appending -reminder to a security alert slug), which is treated as a distinct notice by Benecaster.
Dismissal
Once any admin on the site dismisses a notice, it is gone for the entire installation — with three exceptions. The following notices re-surface every 7 days as long as the underlying condition persists:
- License expires within 30 days
- License server unreachable for more than 7 days
- Feed request log hit the emergency row cap
Dismissing any of these is a “remind me later,” not a permanent suppression. You cannot configure the 7-day cadence — it is set per-notice in code and is not exposed in Settings.
Critical notices are non-dismissible — they remain visible until the underlying condition resolves. When a critical condition clears (for example, you update PHP past the minimum version), the notice is removed on the next health check run.
Timing
Every time in the notice system is UTC, both the moment a notice stops being shown and the moment a “remind me later” dismissal runs out. Nothing here is measured against your site’s timezone setting or your server’s database clock, so a 7-day window is 7 days wherever your site is hosted and whatever your host has configured.
That matters because the alternative is silent in both directions. A notice measured against the wrong clock either disappears from the bell before it has actually expired — taking a warning you were meant to see with it — or lingers after it should have gone.
Notices with an expiry set are removed from the bell as soon as that moment passes. Most notices have no expiry at all: they stay until you dismiss them or the condition behind them clears.
For Developers
The notification system is extensible via a filter hook documented in the Filter Hooks Reference:
benecaster_before_notice_display— modify or suppress a notice per display context (bellorbar) just before it is included in the REST response
The re-surfacing behavior is controlled by a re_dismiss_after field on NoticeManager::publish() data arrays. Pass a positive integer (days) to opt a notice into the 7-day re-dismissal cycle; omit the field or pass 0 to preserve the default “dismiss = suppress forever” behavior for that notice. This field is code-side only — it is not configurable per-user or per-installation.
See Also
Need this built rather than just documented? See our services →