Webhooks · Open source
Laravel Webhook Console
A dashboard and replay tool for the webhooks spatie/laravel-webhook-client stores in your Laravel app.
What it solves
spatie/laravel-webhook-client stores every webhook your app accepts in the webhook_calls table, but has no screen to look at them.
When your process job throws on a real queue worker, the call keeps no exception and the failure only exists in failed_jobs, with nothing that points back to the webhook.
An unofficial, independent dashboard for spatie/laravel-webhook-client (not made or endorsed by Spatie). It lists every stored call with its status, links failed_jobs rows back to their calls, shows payloads and headers with secrets masked, and replays one call or every failure from the dashboard or artisan.
- List and filter stored calls by config, status, date range, or a search inside the payload and URL
- Failures include process jobs that failed on a queue worker, linked from failed_jobs without unserializing them
- Payload keys, header names and URL parameters such as password, secret, token or signature are shown masked
- Replay one call, the selected calls, or every failure: the call's process_webhook_job is dispatched again
- Three gates for viewing, replaying and pruning, local environment only until you define them
- webhooks:failed --strict exits 1 when anything failed, for CI, cron and monitoring
Install
Requires PHP 8.3+ and Laravel 12 and 13.
composer require amjadiqbal/laravel-webhook-console
Usage
// app/Providers/AppServiceProvider.php: who may use /webhook-console outside local
use App\Models\User;
use Illuminate\Support\Facades\Gate;
Gate::define('viewWebhookConsole', fn (User $user) => $user->is_admin);
Gate::define('replayWebhookCalls', fn (User $user) => $user->is_admin);
Gate::define('pruneWebhookCalls', fn (User $user) => false); // view and replay only
Setup
This is an independent package, not made by Spatie. It requires spatie/laravel-webhook-client 3.4+ (installed for you) that is already receiving webhooks. After installing, open /webhook-console in your local environment. Queue failures are read from the database or database-uuids failed job driver; with other drivers the dashboard says why they are missing.
- 1 composer require amjadiqbal/laravel-webhook-console
- 2 Open /webhook-console locally.
- 3 Define the three gates before using it anywhere else.
- 4 Optional: php artisan vendor:publish --tag=webhook-console-config
Access: three gates
viewWebhookConsole allows the dashboard, payloads, headers and failures. replayWebhookCalls allows Replay, Replay selected and Retry failed. pruneWebhookCalls allows deleting old calls. Each defaults to the local environment only, for everyone who can reach the app there, and denies everyone elsewhere until you define it. Someone who can view but not replay sees the dashboard without replay buttons, and the replay and prune routes return 403. The view gate is always added after dashboard.middleware.
Failure statuses
- Failed: webhook-client stored an exception on the call.
- Failed in queue: the process job failed on a queue worker and is in failed_jobs. The console links the row to its call from the serialized job's model id, read with a regex and never unserialized.
- No error: nothing failed that the console can see.
- After a replay, an older failed_jobs row no longer counts against the call; the failed_jobs rows themselves are never changed or deleted.
Replay and bulk retry
Replay dispatches the call's configured process_webhook_job again, the way webhook-client does for a new webhook. Nothing is sent over the network and the signature is not checked again, so your job should be safe to run twice for the same event. Retry failed replays every failure matching the current filters, oldest first, up to bulk_limit (100). From artisan, webhooks:replay asks before replaying, needs --force when not interactive, and exits 1 when any replay could not be dispatched.
php artisan webhooks:replay 41 42
php artisan webhooks:replay --failed --dry-run
php artisan webhooks:replay --failed --since=2h --force
Monitoring and pruning
Schedule webhooks:failed with --strict to be told about failures. The dashboard can delete calls older than N days, for all configs or one; for scheduled pruning, webhook-client's own model:prune uses its delete_after_days setting. Masking applies to what the dashboard shows; stored rows are not changed. Exception messages and stack traces are shown as stored, not masked.
// routes/console.php
Schedule::command('webhooks:failed --since=1h --strict')->hourly()->emailOutputOnFailure('[email protected]');
php artisan model:prune --model="Spatie\WebhookClient\Models\WebhookCall"
Hire me
Need this built into your app, or something custom?
I wrote Laravel Webhook Console. I can wire it into your Laravel app, extend it for your case, or build the feature around it. Tell me what you need and you'll get a plan and a quote, free.
Support
Found a bug or want a feature? Open an issue on GitHub. For help adding it to your own project, use the quote form above.
More Laravel packages
All packages
Laravel Driver.js
Build Driver.js product tours in PHP and render them with one Blade component.
Laravel Sonner
Sonner toast notifications for Laravel, sent from PHP and shown without React.
Laravel Ninja Keys
A Cmd+K / Ctrl+K command palette for Laravel, with the actions defined in PHP.
Laravel SweetAlert2
SweetAlert2 popups, toasts and confirm dialogs from Laravel controllers, Livewire and Alpine.
Laravel Grid.js
Turn any Eloquent query into a searchable, sortable, paginated Grid.js data table with one fluent PHP call.
Laralink
Work on a Composer package inside the Laravel app that uses it, then switch back to the Packagist release.
Refresher
A drop-in replacement for Laravel's RefreshDatabase that restores a cached snapshot of your test database instead of running migrate:fresh.
Kiln
Artisan commands and an optional signed HTTP route to clear, warm and inspect OPcache when you deploy.
Laravel Media Viewer
Show private PDFs, video and audio from any Laravel disk without making the files public.
Laravel Swiper
Swiper sliders, carousels and image galleries for Laravel as Blade components.
Laravel MySQL Advisor
Read-only health checks for the MySQL or MariaDB database behind your Laravel app, with the SQL and the Laravel migration to fix a problem wherever a fix applies.
Laravel Pennant Dashboard
A browser dashboard for laravel/pennant feature flags: per-scope toggles, sticky percentage rollouts, purge and an audit log.