Backend guides
Personal user notifications
A live personal inbox, localized email, daily digests, quiet hours and user-controlled delivery preferences.
On this page
A personal inbox alongside operator alerts
Personal notifications are product messages addressed to users. They are separate from admin notifications, which tell operators about registrations, billing and system events. The app bell combines both unread counts when a user has access to both.
Users read personal messages at /notifications and set delivery preferences at
/settings/notifications. Server-sent events update badges and show toasts; polling provides a
fallback. Rows can be marked read or unread and link to the relevant product surface.
Delivery users control
The system supports immediate email, daily digests at the user’s local hour, quiet hours and per-event preferences. Inbox messages render in the request language; background emails use the user’s saved language. Duplicate messages update an occurrence count and resurface the row as unread. Retention and delivery retries are configurable.
Add your product events
The template ships a test event and the reusable NotifyUserCommand entry point. Add your own
catalog definitions for title and body templates, category, deep link, email defaults and opt-out
rules. Translate domain events into notification commands beside the feature that owns them.
Application-specific events and mute controls are yours to add.
Notifications, delivery attempts and preferences are included in data export and erasure. Keep
those paths synchronized when extending the model. The repository references are
docs/api/user-notifications.md and docs/frontend/user-notifications.md.
Scaffold with --no-notifications or run scripts/remove-user-notifications.sh to omit personal
notifications. The independent operator alert system remains installed.
Verify
- Send a test notification with two tabs open and confirm both unread badges update.
- Change language and confirm the next inbox message and email use that locale.
- Check delivery preferences, quiet hours and digest timing with your product events.