NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
All packages

All events are final readonly and dispatched after the commit (ShouldDispatchAfterCommit), so a send inside a transaction that rolls back fires nothing. The package never broadcasts — see Inbox for the Reverb recipe.

EventPayloadWhen
InboxItemCreateditemA new inbox item — broadcast it with InboxItemResource on your private channel.
InboxItemUpdateditem, previousCountAn event collapsed into an existing item (count raised, latest actor and data).
InboxItemsReadrecipient, idsItems were marked read — one, or many at once with markAllRead().
InboxItemArchived / InboxItemUnarchiveditemAn item was archived / restored from the archive.
NotificationMailSentdeliveryA mail went out.
NotificationMailFaileddelivery, reasonA mail could not be sent — reason is a CancelReason (transport, render, unknown, payload).
NotificationMailHelddelivery, untilA mail is held until quiet hours end.
DigestSentrun, countA digest mail went out.
ReminderScheduled / ReminderRescheduledreminderA reminder row was scheduled / moved with its anchor date.
ReminderCancelledreminderA reminder or escalation was cancelled — see its cancel_reason.
ReminderFired / EscalationFiredreminderA reminder / an escalation went out.
NotificationPreferenceChangeduser, scope, old, newA preference changed; scope is type, category, digest, quiet_hours, timezone or reset. update() fires one per type, category and setting it changed, none when it rolls back.
RecipientSkippedtype, recipient, reasonA recipient got nothing from a send (reason: no_access).
NotificationInteropFailednotification, channel, exceptionThe interop listener failed inside another package’s send; that notification went out untouched. Basenames only.
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Notifications\Events\EscalationFired;
use RoundlyConsulting\Notifications\Events\NotificationMailFailed;
use RoundlyConsulting\Notifications\Events\NotificationPreferenceChanged;

Event::listen(NotificationMailFailed::class, fn (NotificationMailFailed $event) => Log::warning('Mail failed', [
    'delivery' => $event->delivery->getKey(),
    'reason' => $event->reason->value,      // transport, render, unknown, payload, …
]));

Event::listen(EscalationFired::class, fn (EscalationFired $event) => Metrics::increment('escalations'));

Event::listen(NotificationPreferenceChanged::class, fn ($event) => Audit::record($event->user, $event->scope, $event->old, $event->new));

Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

More ways to support, including crypto

By donating, you agree to our donation terms.

Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.