goldnead/statamic-notifications
A Statamic addon that brings a flexible notification system to your control panel, making it easy to send, manage, and display notifications for users and editors without custom code.
notification_deliveries row per channel written atomically). This is the decision point where "notifications occasionally vanish when the mail provider hiccups" becomes a solved problem instead of a backlog item. It is the strongest argument yet for keeping notifications in this package rather than hand-rolling a queue-plus-audit-table layer.DeferredChannel to push/SMS/chat.notifications:dispatch-pending. This is a product decision we must make explicitly: who owns the cron/supervisor entry, who gets paged when the pending backlog grows, and what the retry budget (max_attempts, backoff_seconds) should be per environment. It also drives whether we expose these as deployment defaults or leave them per-app.notification_deliveries table, a migration, and per-channel rows per notification. That is real storage growth and a schema dependency in every consuming app — worth pricing before we commit broadly.Adopt when:
Look elsewhere / delay when:
notification_deliveries that the package does not provide.Decision gate before rollout: confirm scheduler ownership, set max_attempts/backoff_seconds defaults, add a backlog-size alert, and define a retention policy for delivery rows.
To executives: This release closes a reliability gap that today shows up as customer-facing support tickets — missed confirmations and security emails. Sends are now written durably in the same transaction as the notification itself and retried with exponential backoff, so a mail provider outage delays messages instead of losing them, and we get a per-message record of what happened for support and audit. No new infrastructure: it is a config change, one migration, and one scheduled command.
To engineering: We now have a transactional outbox: Notifications::notifyDeferred() commits the notification and one delivery row per channel atomically; notifications:dispatch-pending drains them under a lock with configurable retries. Scope is intentionally narrow — only DeferredChannel implementations (in-app, mail) qualify, and recipients are resolved at send time via DeferredRecipientResolver. Two things to own on our side: the scheduler entry (the package schedules nothing) and monitoring the pending backlog plus terminal failed/cancelled outcomes. Claim-under-lock gives single-claim, not exactly-once — treat duplicates as possible and make handlers tolerant. Migration adds notification_deliveries; plan retention before volume ramps.
How can I help you explore Laravel packages today?