A package to simplify automating future notifications and reminders in Laravel

Last update: May 11, 2022

Laravel Snooze

Schedule future notifications and reminders in Laravel

Build Status styleci

Latest Stable Version Total Downloads License

Why use this package?

  • Ever wanted to schedule a future notification to go out at a specific time? (was the delayed queue option not enough?)
  • Want a simple on-boarding email drip?
  • How about happy birthday emails?

Common use cases

  • Reminder system (1 week before appt, 1 day before, 1 hour before, etc)
  • Follow-up surveys (2 days after purchase)
  • On-boarding Email Drips (Welcome email after sign-up, additional tips after 3 days, upsell offer after 7 days)
  • Short-Term Recurring reports (send every week for the next 4 weeks)

Installation

Install via composer

composer require thomasjohnkane/snooze
php artisan migrate

Publish Configuration File

php artisan vendor:publish --provider="Thomasjohnkane\Snooze\ServiceProvider" --tag="config"

Usage

Using the model trait

Snooze provides a trait for your model, similar to the standard Notifiable trait. It adds a notifyAt() method to your model to schedule notifications.

use Thomasjohnkane\Snooze\Traits\SnoozeNotifiable;
use Illuminate\Notifications\Notifiable;

class User extends Model {
    use Notifiable, SnoozeNotifiable;

    // ...
}

// Schedule a birthday notification
$user->notifyAt(new BirthdayNotification, Carbon::parse($user->birthday));

// Schedule for a week from now
$user->notifyAt(new NextWeekNotification, Carbon::now()->addDays(7));

// Schedule for new years eve
$user->notifyAt(new NewYearNotification, Carbon::parse('last day of this year'));

Using the ScheduledNotification::create helper

You can also use the create method on the ScheduledNotification.

ScheduledNotification::create(
     Auth::user(), // Target
     new ScheduledNotificationExample($order), // Notification
     Carbon::now()->addHour() // Send At
);

This is also useful for scheduling anonymous notifications (routed direct, rather than on a model).

$target = (new AnonymousNotifiable)
    ->route('mail', '[email protected]')
    ->route('sms', '56546456566');

ScheduledNotification::create(
     $target, // Target
     new ScheduledNotificationExample($order), // Notification
     Carbon::now()->addDay() // Send At
);

An important note about scheduling the snooze:send command

Creating a scheduled notification will add the notification to the database. It will be sent by running snooze:send command at (or after) the stored sendAt time.

The snooze:send command is scheduled to run every minute by default. You can change this value (sendFrequency) in the published config file. Available options are everyMinute, everyFiveMinutes, everyTenMinutes, everyFifteenMinutes, everyThirtyMinutes, hourly, and daily.

The only thing you need to do is make sure schedule:run is also running. You can test this by running php artisan schedule:run in the console. To make it run automatically, read here.

Note: If you would prefer snooze to not automatically schedule the commands, you can set the scheduleCommands config value to false

Setting the send tolerance

If your scheduler stops working, a backlog of scheduled notifications will build up. To prevent users receiving all of the old scheduled notifications at once, the command will only send mail within the configured tolerance. By default this is set to 24 hours, so only mail scheduled to be sent within that window will be sent. This can be configured (in seconds) using the SCHEDULED_NOTIFICATION_SEND_TOLERANCE environment variable or in the snooze.php config file.

Setting the prune age

The package can prune sent and cancelled messages that were sent/cancelled more than x days ago. You can configure this using the SCHEDULED_NOTIFICATION_PRUNE_AGE environment variable or in the snooze.php config file (unit is days). This feature is turned off by default.

Detailed Examples

Cancelling Scheduled Notifications

$notification->cancel();

Note: you cannot cancel a notification that has already been sent.

Rescheduling Scheduled Notifications

$rescheduleAt = Carbon::now()->addDay(1)

$notification->reschedule($rescheduleAt)

Note: you cannot reschedule a notification that has already been sent or cancelled. If you want to duplicate a notification that has already been sent or cancelled, pass a truthy second parameter along with the new send date; reschedule($date, true), or use the scheduleAgainAt($date) method shown below.

Duplicate a Scheduled Notification to be sent again

$notification->scheduleAgainAt($newDate); // Returns the new (duplicated) $notification

Check a scheduled notification's status

// Check if a notification is already cancelled

$result = $notification->isCancelled(); // returns a bool

// Check if a notification is already sent

$result = $notification->isSent(); // returns a bool

Conditionally interrupt a scheduled notification

If you'd like to stop an email from being sent conditionally, you can add the shouldInterrupt() method to any notification. This method will be checked immediately before the notification is sent.

For example, you might not send a future drip notification if a user has become inactive, or the order the notification was for has been canceled.

public function shouldInterrupt($notifiable) {
    return $notifiable->isInactive() || $this->order->isCanceled();
}

If this method is not present on your notification, the notification will not be interrupted. Consider creating a shouldInterupt trait if you'd like to repeat conditional logic on groups of notifications.

Scheduled Notification Meta Information

It's possible to store meta information on a scheduled notification, and then query the scheduled notifications by this meta information at a later stage.

This functionality could be useful for when you store notifications for a future date, but some change in the system requires you to update them. By using the meta column, it's possible to more easily query these scheduled notifications from the database by something else than the notifiable.

Storing Meta Information

Using the ScheduledNotification::create helper

ScheduledNotification::create(
     $target, // Target
     new ScheduledNotificationExample($order), // Notification
     Carbon::now()->addDay(), // Send At,
     ['foo' => 'bar'] // Meta Information
);

Using the notifyAt trait

  $user->notifyAt(new BirthdayNotification, Carbon::parse($user->birthday), ['foo' => 'bar']);

Retrieving Meta Information from Scheduled Notifications

You can call the getMeta function on an existing scheduled notification to retrieve the meta information for the specific notification.

Passing no parameters to this function will return the entire meta column in array form.

Passing a string key (getMeta('foo')), will retrieve the specific key from the meta column.

Querying Scheduled Notifications using the ScheduledNotification::findByMeta helper

It's possible to query the database for scheduled notifications with certain meta information, by using the findByMeta helper.

  ScheduledNotification::findByMeta('foo', 'bar'); //key and value

The first parameter is the meta key, and the second parameter is the value to look for.

Note: The index column doesn't currently make use of a database index

Conditionally turn off scheduler

If you would like to disable sending of scheduled notifications, set an env variable of SCHEDULED_NOTIFICATIONS_DISABLED to true. You will still be able to schedule notifications, and they will be sent once the scheduler is enabled.

This could be useful for ensuring that scheduled notifications are only sent by a specific server, for example.

Enable onOneServer

If you would like the snooze commands to utilise the Laravel Scheduler's onOneServer functionality, you can use the following environment variable:

SCHEDULED_NOTIFICATIONS_ONE_SERVER = true

Running the Tests

composer test

Security

If you discover any security related issues, please email instead of using the issue tracker.

Contributing

  1. Fork it (https://github.com/thomasjohnkane/snooze/fork)
  2. Create your feature branch (git checkout -b feature/fooBar)
  3. Commit your changes (git commit -am 'Add some fooBar')
  4. Push to the branch (git push origin feature/fooBar)
  5. Create a new Pull Request

Credits

This package is bootstrapped with the help of melihovv/laravel-package-generator.

GitHub

https://github.com/thomasjohnkane/snooze
Comments
  • 1. unserialize(): Error at offset

    Hey @thomasjohnkane ,

    Thanks for the wonderful package.

    I am having the following issue often while unserialize the content. it clearly shows couldn't unserialize data but serialize & unserialize are via the package.

    when unserialize fails it's crashing, and unserialize has no way to catch the exception as well. It automatically retries N times based on tolerance time and it crashes N times.

    Please let me know is there any work around for this?

    domain/username/Message unserialize(): Error at offset 6079 of 18968 bytes Level ERROR Exception

       "class": "ErrorException",
       "message": "unserialize(): Error at offset 6079 of 18968 bytes",
       "code": 0,
       "file": "/username/web/domain/vendor/thomasjohnkane/snooze/src/Serializer.php:34",
       "trace": [
           "/username/web/domain/vendor/thomasjohnkane/snooze/src/Serializer.php:34",
           "/username/web/domain/vendor/thomasjohnkane/snooze/src/Models/ScheduledNotification.php:66",
           "/username/web/domain/vendor/thomasjohnkane/snooze/src/Console/Commands/SendScheduledNotifications.php:58",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Support/Collection.php:475",
           "/username/web/domain/vendor/thomasjohnkane/snooze/src/Console/Commands/SendScheduledNotifications.php:63",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:90",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:34",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Container/Container.php:576",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Console/Command.php:183",
           "/username/web/domain/vendor/symfony/console/Command/Command.php:255",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Console/Command.php:170",
           "/username/web/domain/vendor/symfony/console/Application.php:1001",
           "/username/web/domain/vendor/symfony/console/Application.php:271",
           "/username/web/domain/vendor/symfony/console/Application.php:147",
           "/username/web/domain/vendor/laravel/framework/src/Illuminate/Console/Application.php:90",
           "/username/web/domain/…
    Reviewed by naran3434 at 2020-07-21 17:36
  • 2. Cancel notifications by target

    I think we should add a way to cancel all future notifications for a target. For example, if they unsub we don't want to continue sending.

    Possible implementation: Add a target_type column to the migration, and method to cancel outstanding notifications for a target.

    Reviewed by atymic at 2019-09-24 23:42
  • 3. Feature/disable scheduling

    Feel free to not accept this, but I have need of being able to turn off the automatic scheduling. I have shared models across multiple repos and I only need the scheduling to run in one repo.

    Reviewed by gborcherds at 2021-03-01 13:57
  • 4. Feature: Meta JSON column for scheduled notifications (Easier Querying)

    Hi @atymic and @thomasjohnkane

    This pr adds in the ability to save meta info for a scheduled notification, and then be able to query for scheduled notifications by some meta fields as needed by the developer.

    The notifyAt and create method's signature changes to include one new optional parameter, which is the meta array.

        public function notifyAt($notification, DateTimeInterface $sendAt, array $meta = []): ScheduledNotification
        {
            return ScheduledNotification::create($this, $notification, $sendAt, $meta);
        }
    

    A new findByMeta function is defined to be able to find scheduled notifications based on some meta info:

    ScheduledNotification::findByMeta('foo', 'bar')
    

    It is also possible to call getMeta on the notification itself to get all meta information or a specific key: (from the tests)

       $this->assertSame($meta, $scheduled_notification->getMeta());
    
            $this->assertSame("bar", $scheduled_notification->getMeta('foo'));
            $this->assertSame("you", $scheduled_notification->getMeta('hey'));
    

    Tests I've added a new testItCanStoreAndRetrieveMetaInfo test and updated testNotificationsCanBeQueried to include querying by meta

    Migrations This pr adds one migration which is the new nullable meta field

    Use case For my use case, we use this package to schedule notifications of upcoming calendar events, which could be anywhere in the future. As the user is the notifiable entity, it's not easy to be able to find all upcoming notifications for a specific event.

    With this pr, it will be able to add meta info like event_id = 1 to an upcoming notification, and then query for all scheduled notifications in the database for this event with ScheduledNotification::findByMeta('event_id', 1)

    I can see many reasons to need to do something like this for future notifications, for instance I need it to be able to easily update already scheduled events if a certain start time of an event has changed, this pr will make this and similar scenarios much easier.

    Reviewed by ricuss at 2021-09-10 11:55
  • 5. Fix for breakage if snooze disabled but pruneAge set

    This PR fixes an issue introduced in https://github.com/thomasjohnkane/snooze/pull/73

    The referenced PR added the ability to disable snoozing, however the package could be left in an error state if snooze is disabled, but there is a pruneAge config value this.

    This is because the instance of the scheduler is only created if snooze is enabled, however the instance is required when snooze.pruneAge has a non-null value.

    The fix in this pr just moves the $schedule = $this->app->make(Schedule::class); line to above the check for snooze enabled, so that the instance is accessible for the prune command.

    Reviewed by ricuss at 2021-08-16 09:12
  • 6. There are no commands defined in the "snooze" namespace

    Hi I'm getting the following error in my schedule:run cron job

    [2020-08-06 13:56:02] local.ERROR: There are no commands defined in the "snooze" namespace. {"exception":"[object] (Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException(code: 0): There are no commands defined in the \"snooze\" namespace. at /home2/foldernamechanged/public_html/testing/vendor/symfony/console/Application.php:597)
    [stacktrace]
    #0 /home2/foldernamechanged/public_html/testing/vendor/symfony/console/Application.php(650): Symfony\\Component\\Console\\Application->findNamespace('snooze')
    #1 /home2/foldernamechanged/public_html/testing/vendor/symfony/console/Application.php(235): Symfony\\Component\\Console\\Application->find('snooze:send')
    #2 /home2/foldernamechanged/public_html/testing/vendor/symfony/console/Application.php(147): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #3 /home2/foldernamechanged/public_html/testing/vendor/laravel/framework/src/Illuminate/Console/Application.php(90): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #4 /home2/foldernamechanged/public_html/testing/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(133): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #5 /home2/foldernamechanged/public_html/testing/artisan(36): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #6 {main}
    "} 
    

    sendFrequency is set to everyMinute so I'm getting this error every minute now.

    When I manually run schedule:run or snooze:send in console it works fine. The issue seems to occur only in the cron job. Running php artisan shows

     snooze
      snooze:prune                  Prune scheduled notifications that have been sent or cancelled
      snooze:send                   Send scheduled notifications that are ready to be sent.
    

    Searching the web, most answers were to run config:clear , cache:clear, composer dump-autoload, but no luck doing that.

    Any ideas on what could be wrong?

    System Details

    php: 7.2.32 laravel: 5.8.38 snooze: 1.0.3 os: CentOS Linux release 7.8.2003 (Core)

    Reviewed by arun07as at 2020-08-06 20:35
  • 7. unserialize(): Error at offset

    in laravel version "version": "v7.14.1", i got this error, i found databse notification field data is not right, O:41:"App\Notifications\AppointmentNotification":10:{s:11:" it's missing something. Why? i have a Appointment model to store user's appoinment, and how can i get the notification by Appointment id? if user change the appointment time, i need to reschedule the notification, i only can get the notification by user id / notification type

    Reviewed by zhengwhizz at 2020-07-07 03:36
  • 8. Laravel 9.x Compatibility

    This is an automated pull request from Shift to update your package code and dependencies to be compatible with Laravel 9.x.

    Before merging, you need to:

    • Checkout the l9-compatibility branch
    • Review all comments for additional changes
    • Thoroughly test your package

    If you do find an issue, please report it by commenting on this PR to help improve future automation.

    Reviewed by laravel-shift at 2022-02-02 16:45
  • 9. Feat: Config option to disable automatically adding `snooze:send` and `snooze:prune` to the schedular

    Hi @atymic and @thomasjohnkane

    Snooze currently automatically adds the snooze:send and snooze:prune commands to the scheduler.

    This is convenient for 95% of the use cases, but becomes a bit of a problem if the project requires turning that off by default.

    For example in our project we are making use of the spatie multi tenant package. If we want to run commands for all our tenants, we need to prefix the command with tenants:artisan (This way the active database will be set for each tenant)

    So to schedule the send command as an example, we require doing the below:

    $schedule->command('tenants:artisan snooze:send')->everyMinute()->onOneServer()->runInBackground();
    

    Not being able to turn off automatically scheduling these commands, results in there always being a snooze:prune or snooze:sendcommand scheduled, and these will fail every time they run as the current database won't be set.

    To get around this currently I need to do some ugly config juggling, and actually disable snooze so it doesn't schedule the command, and the only way to not schedule the prune command is to have pruneAge set to null.

    Since this might be the situation for other users, I thought of introducing a new config option scheduleCommands, which defaults to true to keep current behavior, but can be set to false if you don't want nooze to automatically schedule the commands.

    /*
    * Should snooze automatically schedule the snooze:send and snooze:prune commands
    */
    'scheduleCommands' => env('SCHEDULED_NOTIFICATIONS_SCHEDULE_COMMANDS', true),
    

    Note that the commands are always registered, this config option just determines if it should be added to the scheduler automatically or not.

    There is no breaking change here as it defaults to true for the config option.

    I've also added a note to the readme to indicate this option.

    Reviewed by ricuss at 2021-09-14 07:27
  • 10. Add a way to retrieve underlying Notification

    It would be useful if we had a way to retrieve the underlying Illuminate\Notifications\Notification from the ScheduledNotification class. It's already part of the Eloquent model so it'd be handy to have a getNotification() method. There's already functionality for unserializing it.

    Reviewed by ValCanBuild at 2020-07-28 10:36
  • 11. Reference to $notification for canceling/reschedule

    I'm having this scenario:

    1. User needs to set targetDay
    2. In model I'm listening for "created" event
    3. $user->notifyAt(new TargetDayReminder, $targetDay); Along with that I'm scheduling some more events for the same entry/user - for example BirthdayReminder ...

    This works.

    But I'm having problem when user change $targetDay. I'm listening to models "updated" event and I know there is "reschedule" method available in ScheduledNotifications.

    But to call "reschedule", I need to have reference to $notification. From your example: $notification->reschedule($rescheduleAt)

    What would be the best way to get that reference?

    I guess I should be able to get reference from this 3 parameters:

    • Class name of notifiable class "TargetDayReminder"
    • User
    • SendAt

    Or should I use completely different approach to handle situations like this?

    Reviewed by eAvio at 2020-04-21 15:20
  • 12. The script tried to call a method on an incomplete object...

    Hello, thank you for amazing package. I have started getting lots of sentry errors with internal exceptions. Here is the trace:

    Error: The script tried to call a method on an incomplete object. Please ensure that the class definition "App\Notifications\ReminderOnboard" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
    #19 /vendor/thomasjohnkane/snooze/src/Models/ScheduledNotification.php(103): method_exists
    #18 /vendor/thomasjohnkane/snooze/src/Models/ScheduledNotification.php(103): Thomasjohnkane\Snooze\Models\ScheduledNotification::shouldInterrupt
    #17 /vendor/thomasjohnkane/snooze/src/Models/ScheduledNotification.php(73): Thomasjohnkane\Snooze\Models\ScheduledNotification::send
    #16 /vendor/thomasjohnkane/snooze/src/Console/Commands/SendScheduledNotifications.php(58): Thomasjohnkane\Snooze\Console\Commands\SendScheduledNotifications::Thomasjohnkane\Snooze\Console\Commands\{closure}
    #15 /vendor/laravel/framework/src/Illuminate/Collections/Traits/EnumeratesValues.php(244): Illuminate\Support\Collection::each
    #14 /vendor/thomasjohnkane/snooze/src/Console/Commands/SendScheduledNotifications.php(63): Thomasjohnkane\Snooze\Console\Commands\SendScheduledNotifications::handle
    #13 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}
    #12 /vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\Util::unwrapIfClosure
    #11 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\BoundMethod::callBoundMethod
    #10 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::call
    #9 /vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\Container::call
    #8 /vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Console\Command::execute
    #7 /vendor/symfony/console/Command/Command.php(298): Symfony\Component\Console\Command\Command::run
    #6 /vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Illuminate\Console\Command::run
    #5 /vendor/symfony/console/Application.php(1015): Symfony\Component\Console\Application::doRunCommand
    #4 /vendor/symfony/console/Application.php(299): Symfony\Component\Console\Application::doRun
    #3 /vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application::run
    #2 /vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Illuminate\Console\Application::run
    #1 /vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Foundation\Console\Kernel::handle
    #0 /artisan(37): null
    

    UPDATE: Found the problem. The notification file was moved to another folder, but the records in scheduled_notifications database table had old file path. How this case could be solved?

    Reviewed by SarunasVenvow at 2022-03-16 07:34
  • 13. findByMeta with target

    Hello, great package! But is it possible to get the scheduled_notification by the meta tag but also eager load the target?

    Use case: I have tasks The task has reminder notifications The target is the selected user of the task notification The task is stored in the meta data I get all reminders / notificaitons for a task with findByMeta as a task attribute

    Now a solution could be iterating with a foreach through every notification of the getRemindersAttribute function. But is it build in and i couldnt figure it out?

    Reviewed by callmesupercookie at 2021-12-08 21:13
  • 14. Add Multiple Notifiables

    Hi,

    i was raised an issue #94 using my other account @aneesdev.. i made this pr to be able to create many scheduled notifications just like laravel Notification facade

    $enrolledUsers = User::whereRelation('enrolledCourses', 'course_id', $course_id)->get();
                
    Notification::send($enrolledUsers, new NewLessonNotification($lesson));
    
    Reviewed by aneeskhan47 at 2021-10-30 05:16
  • 15. Bulk/Multiple notifiables

    Hi,

    first of all thank you so much for creating this package.. does this package support bulk, multiple notifiables? just like laravel Notification::send()

    if($request->schedule && !empty($request->scheduled_at))
    {
        $enrolledUsers = User::whereRelation('enrolledCourses', 'course_id', $course_id)->get();
    
        ScheduledNotification::create(
            $enrolledUsers, // Target
            new NewLessonNotification($lesson), // Notification
            Carbon::createFromFormat('d/m/Y h:i a', $request->scheduled_at) // Send At
       ); // gives me error: Collection is not notifiable..
    
    } else {
    
        $enrolledUsers = User::whereRelation('enrolledCourses', 'course_id', $course_id)->get();
        
        Notification::send($enrolledUsers, new NewLessonNotification($lesson));
    }
    
    Reviewed by aneesdev at 2021-10-30 03:02
  • 16. Fix using a custom model

    If use a custom model, the new model would not be injected into Scheduled Notification class, so in order to inject new custom model, should get scheduled notification model name from config file and instantiate it.

    Reviewed by SSEsmaeeli at 2021-07-30 18:20
Larafirebase is a package thats offers you to send push notifications or custom messages via Firebase in Laravel.
Larafirebase is a package thats offers you to send push notifications or custom messages via Firebase in Laravel.

Introduction Larafirebase is a package thats offers you to send push notifications or custom messages via Firebase in Laravel. Firebase Cloud Messagin

May 6, 2022
Laravel package to enable sending push notifications to devices

Laravel Push Notification Package to enable sending push notifications to devices Installation Update your composer.json file to include this package

Apr 25, 2022
This package allows you to send notifications to Microsoft Teams.
This package allows you to send notifications to Microsoft Teams.

Teams connector This package allows you to send notifications to Microsoft Teams. Installation You can install the package using the Composer package

May 6, 2022
Laravel Security Notifications

This package adds security notifications to warn your users when significant security events occur so that they aren't the next victim of an attacker.

Feb 8, 2022
Laravel Subscribable Notifications

Laravel Subscribable Notifications This package allows you to subscribe your app Users to your app Notifications and dispatch them without specifying

Mar 18, 2022
Flexible Flash notifications for Laravel
Flexible Flash notifications for Laravel

Introduction Laravel Notify is a package that lets you add custom notifications to your project. A diverse range of notification design is available.

May 23, 2022
📨 Facebook Notifications Channel for Laravel
📨 Facebook Notifications Channel for Laravel

Facebook Notifications Channel for Laravel This package makes it easy to send notifications using the Facebook Messenger with Laravel. Contents Instal

Apr 13, 2022
Push Notifications using Laravel
Push Notifications using Laravel

laravel-push-notification Push Notifications using Laravel PushNotification::send(['deviceToken1', 'deviceToken2',..], 'Notification Message', 'Action

Apr 6, 2022
✈️ Whatsapp Notifications Channel for Laravel

Whatsapp Notifications Channel for Laravel This package makes it easy to send Whatsapp notification using Venom API with Laravel. This package was cre

Apr 27, 2022
Send Firebase push notifications with Laravel php framework.

FCM Notification Channel for Laravel Send Firebase push notifications with Laravel php framework. Installation You can install this package via compos

May 21, 2022
Standalone PHP library for easy devices notifications push.

NotificationPusher Standalone PHP library for easy devices message notifications push. Feel free to contribute! Thanks. Contributors Cédric Dugat (Aut

May 9, 2022
:computer: Send notifications to your desktop directly from your PHP script
:computer: Send notifications to your desktop directly from your PHP script

About JoliNotif JoliNotif is a cross-platform PHP library to display desktop notifications. It works on Linux, Windows or MacOS. Requires PHP >= 7.2 (

May 12, 2022
A very lightweight library to handle notifications the smart way.
A very lightweight library to handle notifications the smart way.

NAMSHI | Notificator Notificator is a very simple and lightweight library to handle notifications the smart way. It took inspiration from other librar

May 9, 2022
Takes care of Apple push notifications (APNS) in your PHP projects.

Notificato Notificato takes care of push notifications in your PHP projects. Italian: notificato è: participio passato English: notified Why use Notif

Apr 17, 2022
A PHP Library to easily send push notifications with the Pushwoosh REST Web Services.

php-pushwoosh A PHP Library to easily send push notifications with the Pushwoosh REST Web Services. First sample, creating a Pushwoosh message // Crea

Jan 27, 2022
Notifications in PHP (notify-send, growl, etc) like that.

#Nod Notifications in PHP (notify-send, growl, etc) like that. ##Examples Letting Nod figure out the best Adapter to use (not recommend ATM, only work

Mar 26, 2019
Sends notifications via one or more channels (email, SMS, ...).

Notifier Component The Notifier component sends notifications via one or more channels (email, SMS, ...). Resources Documentation Contributing Report

May 21, 2022
Send push notifications to apple devices (iPhone, iPad, iPod).

Apple Apn Push Send push notifications to apple devices (iPhone, iPad, iPod). Support authenticators: Certificate Json Web Token Supported protocols:

Apr 26, 2022
Push notifications Library for PHP

Push notifications Library for PHP Supported Protocols Protocol Supported Driver Options APNs (Token Based) ✓ APNs\Token APNs\Token\Option APNs (Certi

Mar 25, 2022