Failure Notifications
LaraWebhook can automatically notify you when webhooks fail repeatedly.
Why Notifications?
- Detect outages early: Know immediately when a webhook provider has issues
- Reduce downtime: React quickly to integration problems
- Team collaboration: Send alerts to Slack channels for instant visibility
Configuration
php
// config/larawebhook.php
'notifications' => [
'enabled' => env('WEBHOOK_NOTIFICATIONS_ENABLED', true),
'channels' => array_filter(explode(',', env('WEBHOOK_NOTIFICATION_CHANNELS', 'mail'))),
'slack_webhook' => env('WEBHOOK_SLACK_WEBHOOK_URL'),
'email_recipients' => array_filter(explode(',', env('WEBHOOK_EMAIL_RECIPIENTS', ''))),
'failure_threshold' => (int) env('WEBHOOK_FAILURE_THRESHOLD', 3),
'failure_window_minutes' => (int) env('WEBHOOK_FAILURE_WINDOW', 30),
'cooldown_minutes' => (int) env('WEBHOOK_NOTIFICATION_COOLDOWN', 30),
],Environment Variables
env
# Enable notifications
WEBHOOK_NOTIFICATIONS_ENABLED=true
# Channels: mail, slack (comma-separated)
WEBHOOK_NOTIFICATION_CHANNELS=mail,slack
# Email recipients (comma-separated)
WEBHOOK_EMAIL_RECIPIENTS=admin@example.com,devops@example.com
# Slack incoming webhook URL
WEBHOOK_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
# Number of failures before alerting (default: 3)
WEBHOOK_FAILURE_THRESHOLD=3
# Time window for counting failures (default: 30 minutes)
WEBHOOK_FAILURE_WINDOW=30
# Cooldown between notifications (default: 30 minutes)
WEBHOOK_NOTIFICATION_COOLDOWN=30How It Works
┌─────────────────┐ ┌──────────────────────┐ ┌─────────────────────┐
│ │ │ │ │ │
│ Webhook Fails │────▶│ FailureDetector │────▶│ Send Notification │
│ (3rd time) │ │ - Count failures │ │ - Email │
│ │ │ - Check threshold │ │ - Slack │
│ │ │ - Check cooldown │ │ │
└─────────────────┘ └──────────────────────┘ └─────────────────────┘
│
│ Below threshold
│ or in cooldown
▼
┌──────────────────────┐
│ No notification │
│ (prevents spam) │
└──────────────────────┘- Failure Detection: Counts consecutive failures for each service/event
- Threshold Check: Only triggers after N failures (configurable)
- Time Window: Only counts failures within the last X minutes
- Cooldown: Prevents spam by waiting between alerts
Slack Setup
- Go to Slack API
- Click Create New App → From scratch
- Name your app and select workspace
- Go to Incoming Webhooks → Toggle On
- Click Add New Webhook to Workspace
- Select a channel (e.g.,
#alerts) - Copy the webhook URL to your
.env
Email Setup
Configure Laravel mail in .env:
env
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME="LaraWebhook"Notification Content
Email
- Subject:
Webhook Failure Alert: {service} - Service and event name
- Number of consecutive failures
- Last attempt timestamp
- Error message (if available)
- Link to dashboard
Slack
- Red alert color
- Service and event details
- Failure count
- Error message
- Direct link to dashboard
Custom Event Handling
LaraWebhook dispatches an event when a notification is sent:
php
use Proxynth\Larawebhook\Events\WebhookNotificationSent;
// In EventServiceProvider
protected $listen = [
WebhookNotificationSent::class => [
YourCustomListener::class,
],
];
// Your listener
class YourCustomListener
{
public function handle(WebhookNotificationSent $event): void
{
// $event->log - The WebhookLog model
// $event->failureCount - Number of failures
// Log to external monitoring
Http::post('https://monitoring.example.com/webhook-failure', [
'service' => $event->log->service,
'event' => $event->log->event,
'failures' => $event->failureCount,
]);
}
}Preventing Spam
Built-in spam prevention:
- Failure Threshold: Only notifies after N failures (default: 3)
- Time Window: Only counts failures in last X minutes (default: 30)
- Cooldown Period: Won't notify for same service/event within X minutes (default: 30)
Example scenario:
- Stripe
payment.failedfails 3 times in 10 min → Notification sent - 5 more failures in next 20 min → No notification (cooldown)
- After 30 min, 3 more failures → Notification sent again
Disable Notifications
env
WEBHOOK_NOTIFICATIONS_ENABLED=falseOr only in production:
php
'notifications' => [
'enabled' => env('WEBHOOK_NOTIFICATIONS_ENABLED', app()->environment('production')),
],