config/notification-center.php.
Time windows
Every strategy can restrict delivery to specific days of the week and hours of the day. The system only dispatches and times deliveries while inside the configured window.Days
Thedays field accepts an array of integers representing days of the week:
| Value | Day |
|---|---|
0 | Sunday |
1 | Monday |
2 | Tuesday |
3 | Wednesday |
4 | Thursday |
5 | Friday |
6 | Saturday |
Hours
Thehours field takes a two-element array of HH:MM strings in 24-hour format defining the delivery window for each allowed day:
Retry interval escalation
Theretry_interval field controls how long the system waits between delivery attempts on the same channel. Providing multiple values creates an escalating backoff schedule.
$backoff property on the underlying notification class. The first failed attempt waits retry_interval[0] seconds, the second waits retry_interval[1] seconds, and so on. If there are more retry attempts than values in the array, the last value is reused.
Max attempts per channel
Themax_attempts field sets the maximum number of times the system will try to deliver a notification on a single channel before giving up on that channel:
$tries on the queued notification job. Once the limit is reached, the delivery is marked as failed on that channel. The system then waits for timeout_per_channel business hours before escalating to the next channel.
Channel timeout and escalation flow
Channel escalation is driven bytimeout_per_channel — the number of business hours (within the days and hours window) that must elapse before the system tries the next channel.
The ExecuteNotificationStrategy job runs hourly via the Laravel scheduler and evaluates every published, non-expired notification. For each recipient profile, it:
- Checks whether the latest delivery has reached a terminal state (
OpenedorVerified). If so, no further action is taken. - Looks up the current channel’s position in the
channelslist and identifies the next channel. - Calculates how many business hours have elapsed since the last delivery was created, counting only time within the
daysandhourswindow. - If elapsed time is less than
timeout_per_channel, it waits. If elapsed time meets or exceeds the threshold, it creates a new delivery for the next channel.
How the scheduler works
The package registers an hourly scheduled task inToolServiceProvider. Every hour it queries all notifications with:
status = Published- No expiration, or expiration date in the future
ExecuteNotificationStrategy job onto the strategy’s configured queue.
You must run the Laravel scheduler for delivery to work. Add
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1 to your server’s crontab.Queue configuration per strategy
Each strategy’squeue field determines which Laravel queue worker processes its jobs. You can use this to apply different worker counts, timeouts, or priorities:
Practical examples
Aggressive retry for alerts
For urgent notifications, use short retry intervals, a tight channel timeout, and 24/7 delivery:Conservative retry for marketing
For promotional messages, send once per day and restrict to weekday business hours to avoid spamming recipients:max_attempts set to 1, the email is attempted once. There are no retries. The 24-hour timeout means the system will not escalate to another channel for a full business day — and since there is only one channel, no escalation will occur at all.
Related pages
Delivery strategies
Full reference for every strategy field and all five built-in strategies.
Channel configuration
Register notification classes for each delivery channel.