Skip to main content
A delivery strategy is a named configuration block that controls the full lifecycle of notification delivery for a given notification type. It specifies which channels to use, in what order, when delivery is allowed, and how to handle retries and timeouts. Strategies are defined in config/notification-center.php under the strategies key. Each notification type (marketing, transactional, system, alert, reminder) maps to exactly one strategy.

Configuration Fields

FieldTypeDescription
queuestringLaravel queue name used to process deliveries for this strategy.
channelsstring[]Ordered list of channel identifiers to attempt. The first channel is tried first; subsequent channels are used for escalation.
retry_intervalint[]Seconds between retry attempts. Provide an array for escalating delays (e.g., [300, 1800] = 5 min then 30 min).
max_attemptsintMaximum number of delivery attempts per channel before giving up.
timeout_per_channelintHours to wait (within allowed time windows) before escalating to the next channel.
daysint[]Days of the week on which delivery is permitted. 0 = Sunday, 6 = Saturday.
hoursstring[2]Time window for delivery in 24-hour format: ['HH:MM', 'HH:MM'].
timeout_per_channel is measured in effective hours — time that falls within the allowed days and hours window. Downtime outside the window does not count toward the timeout.

Built-in Strategies

'strategies' => [
    'marketing' => [
        'queue'               => 'notifications-marketing',
        'channels'            => ['email'],
        'retry_interval'      => [3600],
        'max_attempts'        => 1,
        'timeout_per_channel' => 24,
        'days'                => [1, 2, 3, 4, 5],
        'hours'               => ['09:00', '18:00'],
    ],
    'transactional' => [
        'queue'               => 'notifications-transactional',
        'channels'            => ['nova'],
        'retry_interval'      => [300, 1800],
        'max_attempts'        => 3,
        'timeout_per_channel' => 2,
        'days'                => [0, 1, 2, 3, 4, 5, 6],
        'hours'               => ['00:00', '23:59'],
    ],
    'system' => [
        'queue'               => 'notifications-system',
        'channels'            => ['webpush', 'email'],
        'retry_interval'      => [1800, 3600],
        'max_attempts'        => 2,
        'timeout_per_channel' => 12,
        'days'                => [1, 2, 3, 4, 5],
        'hours'               => ['08:00', '20:00'],
    ],
    'alert' => [
        'queue'               => 'notifications-alert',
        'channels'            => ['webpush', 'whatsapp', 'card'],
        'retry_interval'      => [30, 300, 900],
        'max_attempts'        => 3,
        'timeout_per_channel' => 1,
        'days'                => [0, 1, 2, 3, 4, 5, 6],
        'hours'               => ['00:00', '23:59'],
    ],
    'reminder' => [
        'queue'               => 'notifications-reminder',
        'channels'            => ['webpush', 'whatsapp'],
        'retry_interval'      => [1800],
        'max_attempts'        => 2,
        'timeout_per_channel' => 6,
        'days'                => [1, 2, 3, 4, 5],
        'hours'               => ['09:00', '19:00'],
    ],
],

Strategy Breakdown

Single channel (email), one attempt, weekdays 09:00–18:00 only. Suitable for bulk campaigns where a single send is sufficient and off-hours delivery is undesirable.
Nova in-app feed, up to 3 attempts with escalating retries (5 min, then 30 min), 24/7. Designed for high-fidelity delivery of account and order messages.
Tries webpush first; if not opened within 12 effective hours (weekdays 08:00–20:00), escalates to email. Good for maintenance notices and platform updates.
webpush → whatsapp → card, with fast retry intervals (30 s, 5 min, 15 min), 1-hour channel timeout, 24/7. Use for urgent, time-critical messages.
Two-channel escalation with a 6-hour effective timeout, weekdays 09:00–19:00. Suitable for task and event reminders.

How Channel Escalation Works

When a notification is published, the ExecuteNotificationStrategy job runs and processes each profile in the attached audiences:
1

First delivery

A Delivery record is created for the first channel in the strategy’s channels array with status Pending, and the notification is dispatched.
2

Strategy job reruns

On subsequent runs of the strategy job (e.g., on a schedule or re-queue), the job checks the latest delivery for each profile.
3

Escalation check

If the latest delivery has not reached Opened or Verified, the job checks whether timeout_per_channel effective hours have elapsed since that delivery was created.
4

Next channel

If the timeout has passed and a next channel exists in the list, a new Delivery record is created for that channel and dispatched.
5

Terminal states

A profile is skipped entirely if its latest delivery is Opened or Verified. Escalation stops if there are no remaining channels.
Elapsed time is calculated only within the permitted days and hours window. A 1-hour timeout_per_channel for the alert strategy means 1 hour of window-time, not 1 wall-clock hour if the window is inactive.

Escalating Retry Intervals

The retry_interval array maps directly to Laravel’s backoff property on the queued notification. Providing multiple values creates an escalating back-off:
// alert strategy: 30 s, then 5 min, then 15 min
'retry_interval' => [30, 300, 900],

// transactional strategy: 5 min, then 30 min
'retry_interval' => [300, 1800],
If the array is shorter than max_attempts, Laravel repeats the last value for remaining attempts.

Build docs developers (and LLMs) love