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

Outbox

Community

Discord, Slack, Microsoft Teams and signed-webhook notification channels for Laravel, built on the native notification system. Write a normal Notification class, return a message object, done.

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

Package health

Beta

Automated checks of this plugin's Composer package

100 / 100
Security 100
Maintenance 100
Ecosystem 100
15 checks
  • Skipped: GitHub Actions pinned to SHA
  • Skipped: GitLab CI includes pinned to SHA
  • Passed: Open security advisories
  • Passed: Dependabot PR responsiveness — No open Dependabot PRs.
  • Skipped: Renovate MR responsiveness
  • Passed: Dependabot or Renovate configured
  • Passed: Dependency update cooldown configured
  • Passed: Provides a security policy
  • Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
  • Passed: Commit and release recency — Active: last commit 5 days ago; last release 6 days ago.
  • Passed: composer.lock not committed by library composer.lock is absent from the released dist archive.
  • Passed: Dist archive is lean
  • 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
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 2 weeks ago

Documentation

Configurable notification channels for Laravel - Discord, Slack, Microsoft Teams, 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.

#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*');
}

#Microsoft Teams (Workflows webhook)

Sends Adaptive Cards to the webhook URL of a Power Automate workflow (the "When a Teams webhook request is received" trigger) - the mechanism that replaces the retired Office 365 Connector webhooks.

use Stboris\FilamentOutbox\Messages\TeamsMessage;

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

public function toTeams(object $notifiable): TeamsMessage
{
    return TeamsMessage::make('Deploy finished without errors.')
        ->title('Deployment')
        ->color('good')
        ->facts(['Version' => 'v2.14.0', 'Environment' => 'production']);
}

->block([...]) appends raw Adaptive Card elements; ->card([...]) replaces the generated card entirely.

#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 teams --to="https://.../workflows/.../invoke"
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.

#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
2
Stars
3

From the same author