Outbox plugin screenshot
Dark mode ready
Multilingual support
Supports v5.x

Outbox

Community

Discord, Slack and signed-webhook notification channels for Laravel, with a Pro admin panel for managing endpoints, send history with one-click retries, test-sends and model-event triggers.

Tags: Developer Tool
Supported versions:
5.x
Boris Stiner avatar Author: Boris Stiner

Package health

Beta

Automated checks of this plugin's Composer package

92 / 100
Security 85
Maintenance 100
Ecosystem 100
13 checks
  • Passed: Current Laravel version supported — Package dependencies resolve together with current Laravel 13.0.
  • Passed: Current PHP version supported — Constraint ^8.3 supports current PHP 8.5.
  • Skipped: Current Symfony version supported
  • Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
  • Passed: Commit and release recency — Active: last commit 0 days ago; last release 4 days ago.
  • Passed: composer.lock not committed by library composer.lock is absent from the released dist archive.
  • Passed: Dist archive is lean
  • Skipped: GitHub Actions pinned to SHA
  • Passed: Open security advisories
  • Passed: Dependabot PR responsiveness — No open Dependabot PRs.
  • Skipped: Dependabot or Renovate configured
  • Skipped: Dependency update cooldown configured
  • Failed: Provides a security policy View details on Plumb
Third-party plugin. This is built by the community, not the Filament team. Filament does not review, endorse, or vet the security of plugins outside the filament/ namespace. Review the source and install at your own risk. Found malware or an unresolved security issue the author won't address? Report it .
Powered by Plumb Last scanned 10 hours ago

Documentation

Configurable notification channels for Laravel — Discord, Slack, and generic signed webhooks — built on Laravel's native notification system. No new APIs to learn: write a normal Notification class, return a message object, done.

Need an admin UI? Filament Outbox Pro adds a Filament v5 panel on top: endpoint management, send history with retry, test-send buttons, and model-event triggers.

#Requirements

  • PHP 8.3+
  • Laravel 13

#Installation

composer require stboris/filament-outbox

Optionally publish the config:

php artisan vendor:publish --tag="filament-outbox-config"

#Usage

#Discord

use Stboris\FilamentOutbox\Messages\DiscordMessage;
use Stboris\FilamentOutbox\Messages\DiscordEmbed;

class TradeOpened extends Notification
{
    public function via(object $notifiable): array
    {
        return ['discord'];
    }

    public function toDiscord(object $notifiable): DiscordMessage
    {
        return DiscordMessage::make()
            ->username('Trading Bot')
            ->embed(fn (DiscordEmbed $embed) => $embed
                ->title('LONG opened — BTCUSDT')
                ->color('#2A78D6')
                ->fields([
                    'Entry price' => '$100.00',
                    'Invested' => '$500.00',
                ])
                ->timestamp());
    }
}

The webhook URL is resolved in this order:

  1. ->to($url) on the message
  2. routeNotificationForDiscord() on the notifiable
  3. config('filament-outbox.discord.webhook_url') (env OUTBOX_DISCORD_WEBHOOK_URL)

#Slack (incoming webhook)

use Stboris\FilamentOutbox\Messages\SlackMessage;

public function via(object $notifiable): array
{
    // The 'slack' alias is only claimed when laravel/slack-notification-channel
    // is not installed; the class name always works.
    return [\Stboris\FilamentOutbox\Channels\SlackChannel::class];
}

public function toSlack(object $notifiable): SlackMessage
{
    return SlackMessage::make('Trade closed — +$42.00')
        ->section('*LONG closed — BTCUSDT*');
}

#Generic webhook

use Stboris\FilamentOutbox\Messages\WebhookMessage;

public function via(object $notifiable): array
{
    return ['webhook'];
}

public function toWebhook(object $notifiable): WebhookMessage
{
    return WebhookMessage::make([
        'event' => 'trade.closed',
        'symbol' => 'BTCUSDT',
        'pnl' => 42.0,
    ])->header('X-Source', 'my-app');
}

When a secret is configured (OUTBOX_WEBHOOK_SECRET or ->secret(...) on the message), the raw JSON body is signed with HMAC-SHA256 and the hex digest is sent in the X-Outbox-Signature header, so receivers can verify authenticity:

hash_equals($request->header('X-Outbox-Signature'), hash_hmac('sha256', $request->getContent(), $secret));

#Testing an endpoint

Verify any endpoint from the command line before relying on it:

php artisan outbox:test discord --to="https://discord.com/api/webhooks/..."
php artisan outbox:test slack                     # uses the configured default URL
php artisan outbox:test webhook --message="Custom check"

#Resilient sending

Transient failures — connection errors, HTTP 429 rate limits, and 5xx responses — are automatically retried with exponential backoff (2 attempts by default, configurable via http.retry in the config). Permanent client errors (4xx) fail immediately with a descriptive CouldNotSendNotification exception.

#Filament Outbox Pro

The Pro package adds a Filament v5 admin layer on top of these channels.

Test-send from the Filament panel The test notification arriving in Discord

  • Endpoint management — named destinations managed in the panel instead of .env files: URL, per-environment scoping, enable toggle, channel defaults (bot username, extra headers, …), webhook signing secrets. Reference them from code with ->endpoint('team-alerts') on any message.
  • Send history — every send attempt recorded with status, HTTP code, and payload preview; failed sends can be retried from the panel, with retries recorded as new, linked rows.
  • Test-send — a button on every endpoint to verify it end to end.
  • Model-event triggers — notify on created/updated/deleted for any model, with {placeholder} message templates and optional queued sending with retry/backoff. No notification class needed.

Pro is a separate, commercial package that plugs into this one — nothing in your notification code changes when you add it.

#Testing

composer test

#License

MIT.

The author

Boris Stiner avatar Author: Boris Stiner

I'm a Laravel developer who enjoys building powerful admin panels and business applications with Filament. I love exploring new features, solving real-world problems, and sharing tips, tutorials, and best practices with fellow developers.

Plugins
1