Skip to content

Webhooks · Open source

Laravel Webhook Console

A dashboard and replay tool for the webhooks spatie/laravel-webhook-client stores in your Laravel app.

Laravel 12 and 13 PHP 8.3+ v1.0.0 Free · MIT
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
The Webhook Console dashboard for the webhook_calls table: counters for 11 calls stored, 1 failed with a stored exception, 1 failed in queue and 11 in the last 24 hours, filters for config, status, dates and a payload search, Replay selected and Retry failed buttons, and a list of GitHub, Stripe, Shopify and Paddle calls with their event names and statuses.
The Webhook Console dashboard for the webhook_calls table: counters for 11 calls stored, 1 failed with a stored exception, 1 failed in queue and 11 in the last 24 hours, filters for config, status, dates and a payload search, Replay selected and Retry failed buttons, and a list of GitHub, Stripe, Shopify and Paddle calls with their event names and statuses.

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. 1 composer require amjadiqbal/laravel-webhook-console
  2. 2 Open /webhook-console locally.
  3. 3 Define the three gates before using it anywhere else.
  4. 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.

Need something built?

Free quote in 60 seconds