A package to simplify automating future notifications and reminders in Laravel

Overview

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.

Comments
  • unserialize(): Error at offset

    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/…
    bug needs more info 
    opened by naran3434 12
  • Cancel notifications by target

    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.

    enhancement 
    opened by atymic 11
  • Feature/disable scheduling

    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.

    opened by gborcherds 8
  • Feature: Meta JSON column for scheduled notifications (Easier Querying)

    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.

    opened by ricuss 7
  • Fix for breakage if snooze disabled but pruneAge set

    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.

    opened by ricuss 6
  • There are no commands defined in the

    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)

    bug 
    opened by arun07as 6
  • unserialize(): Error at offset

    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

    question needs more info 
    opened by zhengwhizz 6
  • Laravel 9.x Compatibility

    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.

    opened by laravel-shift 4
  • Feat: Config option to disable automatically adding `snooze:send` and `snooze:prune` to the schedular

    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.

    opened by ricuss 4
  • Add a way to retrieve underlying Notification

    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.

    enhancement help wanted 
    opened by ValCanBuild 4
  • Reference to $notification for canceling/reschedule

    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?

    question 
    opened by eAvio 4
  • Multi-Tenancy

    Multi-Tenancy

    Hello, first of all thank you so much for creating this package.. How do I implement multitenancy into this package?

    I am currently creating an application that uses the multitenancy feature with the archtechx/tenancy package. I have already created a duplicate of the scheduled_notifications table in the tenant database, but I am unable to perform the php artisan snooze:send command because this actions will trigger to the central database while the notification data is located in the tenant database.

    opened by zinct 0
  • add should reschedule for

    add should reschedule for

    It adds a shouldRescheduleFor check, similar to shouldInterrupt. This would allow using the scheduled notifications for use-cases where we are waiting for a job to be done (my use case was waiting for archiving a lot of photos in and then sending a email notification with a download link)

    opened by cristiancalara 0
  • use custom model in send command

    use custom model in send command

    In the send command, the default model was used even if the model was changed in the configuration file. This change allows the user to extend and overwrite the send function such that the package is more flexible.

    opened by cristiancalara 0
  • Add `shouldRescheduleFor` method (similar to `shouldInterrupt`)

    Add `shouldRescheduleFor` method (similar to `shouldInterrupt`)

    I'm creating a zip in AWS that might take as long as 15m. I'd like to send the notification as soon as possible, so ideally I'd check every minute, and then if it's ready I send the notification, if not, I reschedule.

    I've done this by extending the custom model and overwriting the send method.

    public function send(): void
    {
        // ...
        if ($this->shouldInterrupt($notification, $notifiable)) {
            $this->cancel();
            event(new NotificationInterrupted($this));
    
            return;
        }
    
        if($sendAt = $this->shouldRescheduleFor($notification, $notifiable)) {
            $this->reschedule($sendAt);
    
            return;
        }
        // ...
    
    }
    
    public function shouldRescheduleFor(?object $notification = null, ?object $notifiable = null):
    \DateTimeInterface|string|null
    {
        if (! $notification) {
            $notification = $this->serializer->unserialize($this->notification);
        }
    
        if (! $notifiable) {
            $notifiable = $this->serializer->unserialize($this->target);
        }
    
        if (method_exists($notification, 'shouldRescheduleFor')) {
            return $notification->shouldRescheduleFor($notifiable);
        }
    
        return null;
    }
    

    Created the issue mainly to ask if you think this might be a useful feature for the package. If that's the case, I can create a PR for this.

    Thanks for the package! :)

    opened by cristiancalara 0
  • The script tried to call a method on an incomplete object...

    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?

    opened by SarunasVenvow 0
Releases(2.2.0)
Owner
Thomas Kane
Laravel, Vue, Tailwindcss, AWS enthusiast in Austin, TX. I co-run Flux Bucket's consulting team and am currently working on a few side projects.
Thomas Kane
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

Kutia Software Company 264 Jan 7, 2023
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

Davi Nunes 1.2k Sep 27, 2022
This package makes it easy to send notifications using RocketChat with Laravel 9.0+.

laravel-rocket-chat-notifications Introduction This package makes it easy to send notifications using RocketChat with Laravel 9.0+. Contents Installat

Team Nifty GmbH 25 Dec 1, 2022
This package makes it easy to send web push notifications with Laravel.

Web push notifications channel for Laravel This package makes it easy to send web push notifications with Laravel. Installation You can install the pa

Laravel Notification Channels 564 Jan 3, 2023
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

skrepr 20 Oct 4, 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.

Anteris 5 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

Andrés Santibáñez 132 Nov 10, 2022
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.

Arthur Monney 1.2k Dec 26, 2022
📨 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

Laravel Notification Channels 142 Dec 27, 2022
Push Notifications using Laravel

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

Webelight Solutions 26 Jul 22, 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

Felipe Damaceno Teodoro 63 Dec 7, 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

Ankur Kumar 23 Oct 31, 2022
Notion.so notifications channel for Laravel

Installation composer require astroshippers/notion-notification-channel Usage Inside eloquent model: public function routeNotificationForNotion(): arr

AstroShippers 3 Jul 4, 2022
Event subscriber for Laravel notifications.

Laravel Notification Event Subscriber This package allows you to run any kind of actions while a notification is being sent or after it has been sent

Turan Karatuğ 76 Dec 30, 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

Cédric Dugat 1.2k Jan 3, 2023
: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 (

JoliCode 1.2k Dec 29, 2022
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

Namshi 187 Nov 4, 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

Mathijs Kadijk 223 Sep 28, 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

gomoob 63 Sep 28, 2022