thomasjohnkane/laravel-scheduled-notifications
thomasjohnkane/laravel-scheduled-notifications lets you schedule Laravel notifications for later delivery with a simple, database-backed API. Delay sends, set recurring schedules, cancel or reschedule pending alerts, and manage queued user notifications from one place.
Architecture fit
Snooze is a thin, in-process scheduling layer for Laravel notifications: it persists "remind me later" records in a snoozes table and relies on the framework's own scheduler, queue, and notification pipeline to deliver them. That fits well with codebases that already standardize on Laravel notifications for user-facing messaging — it adds a small Eloquent-backed data model and one scheduled entry rather than a new runtime dependency, external service, or broker. It does not fit teams without a reliable scheduler/queue topology (e.g. serverless or shared hosting with traffic-driven cron), since delivery correctness is delegated entirely to host operations.
Integration feasibility
Low-to-moderate effort and fully reversible: composer require, publish config/migrations, run migration, add the trait to the models that need reminders, and register the package's run command in Kernel::schedule. No data model changes to existing tables, no API surface changes to consumer code. The primary integration work is operational (guaranteeing the scheduler runs and the queue drains) rather than code.
Technical risk
2.9.1 is a single-change release: it adds support for Laravel 13. Risk is low but not zero, and three things need confirmation: (1) whether supporting Laravel 13 raised the minimum Laravel/PHP constraint and silently dropped frameworks we currently run — a patch-level release that narrows supported ranges would be a de facto breaking change for consumers; (2) whether the Laravel 13 compatibility path has meaningful test coverage in CI, since a single external contribution is the only stated evidence. A "feat" shipped on a patch version (2.9.1) is also a mild SemVer hygiene signal — it suggests version numbers are not a trustworthy contract here, so pin exact versions and read the diff rather than relying on ^2.9. Pre-existing risks are unchanged and dominate: single-maintainer project with limited bus factor, and a delivery mechanism that fails silently if the scheduler stops.
Key questions
composer.json retain support for our current Laravel and PHP versions, or was the floor raised? Which versions are in the CI matrix?Stack fit
Best suited to a conventional Laravel monolith or modular monolith on a standard LAMP/VM or container platform with a real cron-driven schedule:run and a supervised queue worker. It is a poor fit for architectures where per-minute cron is unavailable, where the queue is optional, or where notification delivery is already centralized in a separate service (in which case snooze becomes a second, competing scheduling source of truth).
Migration path Adopt as an additive capability, not a rewrite. Sequence: (1) pin the exact version currently compatible with our Laravel release — do not jump to 2.9.1 unless we are on, or imminently moving to, Laravel 13; (2) ship the migration and trait to a single low-risk model in a non-critical flow; (3) verify end-to-end delivery in staging with the scheduler running; (4) only then expand to customer-visible reminders. If we are on an older Laravel, 2.9.0 is functionally equivalent for us and is the safer pin today.
Compatibility Validate PHP version floor against our runtime before anything else; Laravel 13 support typically implies a recent PHP minimum. Confirm the published config keys and command signature haven't shifted from our pinned version, and confirm the migration is additive and safe to run on a live database.
Sequencing Treat this release as a forward-compatibility gate rather than a feature: it should be consumed as part of a Laravel 13 upgrade workstream, bundled with the framework upgrade and its regression suite, not merged on its own. If no Laravel 13 upgrade is planned in the next two quarters, log the assessment and take no action beyond confirming our pinned version remains installable.
Maintenance Near-zero ongoing code maintenance — the package is small and stable. The real maintenance burden is dependency tracking: we must monitor this repo for framework-compatibility releases (this one being the archetype) and re-validate at each Laravel major. Budget a recurring, small review per Laravel upgrade cycle.
Support No commercial support; a single primary maintainer plus drive-by contributors. Escalation path for a production bug is a GitHub issue. Mitigate by vendoring or forking rights under the MIT license and keeping the integration surface small enough that a fork is a day of work, not a quarter.
Scaling
The snoozes table grows monotonically with every scheduled reminder; it needs an archival or pruning policy or it becomes a slow, bloated table and a backup/restore cost. Volume scales with reminder creation rate, not user count, so forecast from expected reminder-per-user-per-month. Dispatch throughput is bound by queue worker capacity, not by the package.
Failure modes The dominant failure is silent non-delivery: scheduler not running, queue worker down, a crashed job with no retry, or a missed window — none of which surface as errors to the application. Secondary modes: duplicate notifications if a run overlaps or retries without idempotency, timezone drift producing off-by-hours reminders, and unbounded table growth. Instrument this with a delivery-latency metric and an alert on "snoozes due but undispatched beyond N minutes" before it touches a customer-facing flow.
Ramp-up Low for engineers — the API is idiomatic Laravel and a mid-level developer is productive in under a day. The non-obvious cost is teaching the team the operational contract: reminders are only as reliable as the scheduler, and every new reminder type needs a test that proves it actually fires. Document the scheduler dependency and the delivery monitoring in the same place as the integration, or the next team will assume it is a guaranteed-delivery service.
How can I help you explore Laravel packages today?