Laravel Echo with Reverb Not Listening to Events in Real-Time and Showing Pusher Errors

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Laravel Echo with Reverb: Solving Real-Time Broadcasting Headaches

Dealing with real-time communication in Laravel applications can be incredibly rewarding, but integrating broadcasting systems like Laravel Echo, Pusher, or Reverb often introduces subtle configuration pitfalls. When you switch from a managed service like Pusher to a self-hosted solution like Reverb, unexpected errors and delayed events are common.

This post dives deep into the specific issue you are facing—Laravel Echo not listening to events in real-time with Reverb, coupled with persistent Pusher errors. As a senior developer, I can tell you that this is almost always an issue of configuration bleed-through or an incorrect assumption about how Laravel's broadcasting layer interacts with the frontend client.

The Root Cause: Configuration Bleed and Misdirection

Your symptoms—events only appearing upon page reload and seeing Pusher errors even when using Reverb—strongly suggest that while you have correctly set the BROADCAST_DRIVER=reverb in your .env, Laravel’s underlying broadcasting mechanism is still defaulting or attempting to communicate via the legacy Pusher stack.

The error message itself, cURL error 7: Failed to connect to localhost port 8080, is a huge clue. It indicates that some part of the system (likely an internal service trying to initiate a broadcast) is trying to connect to the default Pusher endpoint, rather than the Reverb server you have explicitly configured.

Laravel relies on configuration and service providers to determine which broadcasting driver to use. If these settings are not perfectly isolated, conflicts arise.

Step-by-Step Diagnosis and Solution

To resolve this conflict and ensure seamless real-time communication with Reverb, follow these critical steps:

1. Strict Configuration Isolation

First, confirm that your environment variables are exclusively pointing to the Reverb configuration and nothing else related to Pusher.

Your .env setup looks correct for setting the driver:

BROADCAST_DRIVER=reverb
BROADCAST_CONNECTION=reverb
# ... Reverb specific keys are set correctly

The key is ensuring that no other configuration files or service providers are accidentally referencing Pusher settings. When working with custom broadcasting solutions, it’s essential to treat the setup as entirely self-contained.

2. Ensuring Asynchronous Processing (Queues)

Broadcasting events in Laravel is inherently asynchronous; they are typically pushed onto a queue system before being broadcasted. If you are not running your queue workers, or if the broadcasting process relies on a queue that isn't being processed correctly, events will appear delayed or fail entirely.

Ensure you are actively running your queue worker:

php artisan queue:work
# Or for production/robustness:
php artisan queue:listen

This step is crucial because the event must be successfully published to Reverb before the client can receive it.

3. Client-Side Echo Configuration for Reverb

The final piece of the puzzle involves how Laravel Echo connects to the broadcasting server. When using Pusher, Echo automatically knows where to connect. With Reverb, you need to explicitly tell Echo where your new application lives.

You must configure the Echo client initialization to point to your Reverb server address. This is typically done in your main JavaScript file or Blade view setup. Even though you set the driver, the frontend needs the correct endpoint URL for the WebSocket connection.

Here is how you might initialize Echo to connect to your Reverb host:

// Example initialization for Laravel Echo connecting to Reverb
import Echo from 'laravel-echo';

window.Pusher = require('pusher-js'); // Keep this if you need compatibility, but focus on the driver connection

window.Echo = new Echo({
    broadcaster: 'reverb', // Explicitly tell Echo to use the reverb broadcaster type
    key: import.meta.env.VITE_REVERB_APP_KEY,
    wsHost: import.meta.env.VITE_REVERB_HOST, // Points to your Reverb server (e.g., http://localhost:8080)
    wsPort: import.meta.env.VITE_REVERB_PORT,
    wssPort: import.meta.env.VITE_REVERB_PORT,
    forceTLS: false // Set based on your setup (http vs https)
});

// Now listen to the channel
window.Echo.channel('order.' + orderId)
    .listen('SmsOTPUpdated', (e) => {
        // Handle the real-time data here
        console.log('New SMS received:', e);
    });

Conclusion: Embracing Laravel's Ecosystem

The experience you are having is a classic example of managing multiple layers in a framework like Laravel. By moving to a self-hosted solution like Reverb, you gain control, but you must manage the integration points carefully. The key takeaway is that while configuration files define how Laravel broadcasts, the client-side Echo setup defines where it listens.

By ensuring strict isolation of your environment variables and explicitly configuring the Echo client to point to your Reverb endpoint, you eliminate the legacy Pusher errors and achieve reliable, real-time event delivery. Keep leveraging the power of the Laravel ecosystem; understanding these deep integration points is what separates basic development from robust, enterprise-level architecture. For more insights into building scalable applications with Laravel, check out the official documentation at https://laravelcompany.com.