Build With Abdallah logo Build With Abdallah Software · AI · Automation
Tutorial 7 min read Jun 18, 2026

Implementing Real-Time Notifications in Laravel 13 with Pusher

In this tutorial, we'll build a realtime notification system using Laravel 13 and Pusher. You'll learn how to send notifications from the server to the client in realtime, enabling

A
Abdallah Mohamed
Senior Full-Stack Engineer
Implementing Real-Time Notifications in Laravel 13 with Pusher

Implementing Real-Time Notifications in Laravel 13 with Pusher

In this tutorial, we'll build a real-time notification system using Laravel 13 and Pusher. You'll learn how to send notifications from the server to the client in real-time, enabling a more dynamic and interactive user experience.

What You'll Build

By the end of this tutorial, you'll have a Laravel application where notifications appear instantly on the user's screen without needing to refresh the page. Imagine a social media platform where a user receives a notification as soon as someone likes their post.

Here's a quick look at what the final outcome will look like:

  • Server-Side: A Laravel 13 application that triggers notifications.
  • Client-Side: A web page that listens for these notifications and displays them in real-time.

Why This Matters

Real-time notifications are essential in modern web applications for enhancing user engagement. They are crucial in scenarios such as:

  • Social Media: Notifying users about likes, comments, and shares.
  • E-commerce: Informing customers about order status updates or flash sales.
  • Collaboration Tools: Alerting team members about changes or new messages.

Developers creating applications in these domains can significantly improve user experience and interaction by implementing real-time notifications.

Architecture Overview

The architecture for our real-time notification system will be as follows:

+----------------+      +----------------+      +----------------+
|   Laravel App  | ---> |  Pusher Server | ---> |  Client (JS)   |
+----------------+      +----------------+      +----------------+
      |                      |                       |
      |----------------------|-----------------------|
  1. Laravel App: Triggers events and sends them to Pusher.
  2. Pusher Server: Acts as a real-time messaging service, broadcasting events to subscribed clients.
  3. Client (JS): Listens for events from Pusher and updates the UI accordingly.

Step-by-Step Implementation

Let's dive into the implementation. We'll cover the first three steps to set up a basic real-time notification system.

Step 1: Setting Up Laravel

First, ensure you have Laravel 13 installed. If not, you can install it via Composer:

composer create-project --prefer-dist laravel/laravel real-time-notifications

Navigate into your project directory:

cd real-time-notifications

Next, set up your environment file. Copy .env.example to .env:

cp .env.example .env

Generate a new application key:

php artisan key:generate

Ensure your database is set up in the .env file. For this tutorial, we'll use SQLite for simplicity:

DB_CONNECTION=sqlite
DB_DATABASE=/full/path/to/database.sqlite

Create the SQLite database file:

touch /full/path/to/database.sqlite

Step 2: Installing Pusher

Pusher is the service we'll use to broadcast real-time events. Install the Pusher PHP SDK via Composer:

composer require pusher/pusher-php-server

Next, set up your Pusher credentials in the .env file. You'll need to create a Pusher account and obtain your credentials from the Pusher dashboard.

PUSHER_APP_ID=your_app_id
PUSHER_APP_KEY=your_app_key
PUSHER_APP_SECRET=your_app_secret
PUSHER_APP_CLUSTER=your_app_cluster
BROADCAST_DRIVER=pusher

Update your config/broadcasting.php to ensure Pusher is configured:

'connections' => [
    'pusher' => [
        'driver' => 'pusher',
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'app_id' => env('PUSHER_APP_ID'),
        'options' => [
            'cluster' => env('PUSHER_APP_CLUSTER'),
            'useTLS' => true,
        ],
    ],
    // other connections...
],

Step 3: Creating a Notification Event

Laravel makes it easy to create events. Use the Artisan command to generate a new event:

php artisan make:event NotificationEvent

This will create a new event class in app/Events/NotificationEvent.php. Update the class to include the data you want to broadcast:

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NotificationEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;

    public function __construct($message)
    {
        $this->message = $message;
    }

    public function broadcastOn()
    {
        return new Channel('notifications');
    }
}

This event will broadcast on a channel named notifications. The $message property will hold the notification data.

In this step, we set up a basic Laravel project, installed Pusher, and created a notification event. In the next steps, we'll set up the client-side to listen for these notifications and display them in real-time.

Step 4: Broadcasting the Event

With our event in place, we need to trigger it within our application. Let's create a simple controller to handle this. Use Artisan to generate a new controller:

php artisan make:controller NotificationController

In app/Http/Controllers/NotificationController.php, add a method to dispatch the NotificationEvent:

namespace App\Http\Controllers;

use App\Events\NotificationEvent;
use Illuminate\Http\Request;

class NotificationController extends Controller
{
    public function sendNotification(Request $request)
    {
        $message = $request->input('message');
        event(new NotificationEvent($message));

        return response()->json(['status' => 'Notification sent!']);
    }
}

Next, define a route to access this controller method. Add the following route in routes/web.php:

use App\Http\Controllers\NotificationController;

Route::post('/send-notification', [NotificationController::class, 'sendNotification']);

This setup allows us to send a POST request to /send-notification with a message parameter, which will trigger the broadcast of the notification.

Step 5: Setting Up the Client Side

Now, let's set up the client side to listen for the notifications. First, ensure you have Laravel Mix installed and configured to handle JavaScript. You can run the following command to install the necessary packages:

npm install

Then, install the Pusher JavaScript library:

npm install pusher-js

Add the following code to your resources/js/app.js file to listen for the notifications:

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    forceTLS: true
});

window.Echo.channel('notifications')
    .listen('NotificationEvent', (e) => {
        console.log('Notification received:', e.message);
        // Here you can update the UI to display the notification
    });

Ensure your webpack.mix.js is configured to compile the JavaScript:

const mix = require('laravel-mix');

mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css');

Run the following command to compile your assets:

npm run dev

Include the compiled JavaScript in your main layout file (e.g., resources/views/layouts/app.blade.php):

<script src="{{ mix('js/app.js') }}"></script>

This setup will log the notification message to the console when received. You can replace the console.log with code to update your UI dynamically.

Common Mistakes

  • Pusher Credentials: Ensure your Pusher credentials in the .env file are correct. Incorrect credentials will prevent the connection from being established.
  • Queue Workers: If using queues, make sure your queue workers are running. Otherwise, events may not be dispatched.
  • Broadcast Channels: Double-check your channel names and ensure they match on both server and client sides.
  • Environment Configuration: Ensure BROADCAST_DRIVER is set to pusher in your .env file.

How I Would Use This

I would use this setup in applications where real-time updates are critical, such as chat applications, live notifications for social media, or collaborative tools. However, I would avoid it in applications where real-time updates do not significantly enhance the user experience, as it can add complexity and cost.

In production, consider the cost of using Pusher, especially if your application scales. Monitoring and maintaining the server and client-side code to handle real-time events is also crucial.

Lessons Learned

  • Trade-offs: While real-time notifications improve user experience, they add complexity and cost. Balancing these factors with application needs is important.
  • Unexpected Issues: Network issues or incorrect environment configurations can cause failures in real-time updates. Proper error handling and logging can mitigate these.
  • Real-World Considerations: Scalability and monitoring are essential. As your user base grows, ensure that your Pusher plan and infrastructure can handle the load.

Next Steps

  • Explore Laravel Echo: Dive deeper into Laravel Echo for more advanced real-time features, such as presence channels.
  • Authentication and Authorization: Implement authentication for private channels to secure your notifications.
  • Performance Optimization: Learn about optimizing real-time applications for performance and scalability.

Sources