Outbox
CommunityDiscord, 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.
Author:
Boris Stiner
Package health
BetaAutomated checks of this plugin's Composer package
13 checks
-
Passed:
Current Laravel version supported
—
Package dependencies resolve together with current Laravel
13.0. -
Passed:
Current PHP version supported
—
Constraint
^8.3supports current PHP8.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.lockis 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
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
.
Documentation
- Requirements
- Installation
- Usage
- Testing an endpoint
- Resilient sending
- Filament Outbox Pro
- Testing
- License
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:
->to($url)on the messagerouteNotificationForDiscord()on the notifiableconfig('filament-outbox.discord.webhook_url')(envOUTBOX_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.
- Endpoint management — named destinations managed in the panel instead of
.envfiles: 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/deletedfor 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.
Featured Plugins
A selection of plugins curated by the Filament team
Blueprint
Filament Blueprint is a premium Laravel Boost extension that helps AI agents produce accurate, detailed implementation plans and security reports for Filament apps.
Filament
Custom Fields
Eliminate custom field migrations forever. Let your users create and manage form fields directly in Filament admin panels with 20+ built-in field types, validation, and zero database changes.
Relaticle
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese