bugsnag/bugsnag-laravel
Bugsnag's Laravel and Lumen notifier automatically reports unhandled exceptions and crashes, lets you report handled exceptions via Bugsnag::notify(), and attaches user info and custom diagnostic data to show how many people are affected.
Architecture fit
Bugsnag for Laravel is a thin, idiomatic integration layer rather than a framework extension. It registers a service provider, exposes a Bugsnag facade, and hooks into the framework's exception handler and Monolog stack. That means adoption is a configuration exercise, not an architectural change: no base classes, no mandatory interfaces, no changes to how the application throws or catches. For a TPM this is the strongest argument for it — the blast radius of adding or removing it is contained to config/bugsnag.php, the exception handler wiring, and a few Bugsnag::notify() call sites. It also composes cleanly with an internal error-reporting abstraction if we want to keep the vendor swappable.
Integration feasibility
Low effort. Composer install, config publish, API key via environment/secret manager, and exception-handler wiring gets unhandled crash reporting live for a typical Laravel app in under a day. The package auto-discovers on Laravel 5.5+; Lumen requires manual provider registration and facade aliasing. Higher-value capabilities are incremental and independently shippable: handled-exception reporting at business-critical boundaries, bugsnag:deploy in CI for release correlation, queue/job context, breadcrumbs, and the newer feature-flag/experiment APIs. Estimated 2–5 engineer-days to production-grade, with most of that spent on redaction policy and noise tuning rather than plumbing.
Technical risk
The dominant risk is commercial, not technical. The package is MIT, but the value is entirely in the SaaS backend: API keys, event volume, seats, and data residency are vendor-controlled, and switching cost grows with the number of notify() call sites and dashboards built on top. Second-order risks: default capture of session and user context is a PII exposure surface (the filters option is deprecated in favor of redactedKeys, which is more expressive but must be configured deliberately); event volume directly drives spend on high-traffic or retry-heavy workloads; the Monolog and Laravel version matrix is broad but requires attention at each major upgrade; and there is a history of subtle state bugs (breadcrumbs leaking across Vapor-queued jobs, handled/unhandled misclassification in Lumen, incomplete-container crashes in the OOM bootstrapper), all fixed, but indicative of the integration's surface area. The reported 903 stars and "0 dependents" should be read carefully — vendor SDKs are distributed via Composer to applications, not depended on by other libraries, so both metrics understate real adoption and are weak proxies for health. The changelog through v2.28 with Laravel 11 and Monolog 3 support is the more reliable maturity signal.
Key questions
Stack fit
Covers Laravel 4 (via the 1.7 branch) through Laravel 11, plus Lumen, with PHP 7.3+ and Monolog 1/2/3 support landing incrementally. Guzzle 5/6 are supported, and the package will reuse an existing bugsnag.guzzle binding if one is registered — useful in egress-restricted or proxy-mediated environments. Laravel Vapor and queue-based deployments are explicitly handled. For a Laravel-centric estate this is close to a drop-in; for polyglot estates it forces a second error platform alongside whatever the non-PHP services use, which is the main "fit" objection to raise early.
Migration path
Run dual-reporting for one to two sprints rather than a hard cutover. Keep the existing tool live while Bugsnag runs in parallel behind a feature flag, then compare on three axes: grouping quality, time-to-diagnosis for a seeded incident, and event volume/cost. Populate discardClasses and redactedKeys before the parallel run so the comparison isn't polluted by noise. Decommission the incumbent only after alert routing, runbooks, and dashboards are ported — that porting, not the install, is the real migration cost.
Compatibility
Laravel 5.5+ auto-discovery removes the manual provider step; Lumen needs $app->register() plus a facade alias. Laravel 11 projects wire exception handling through bootstrap/app.php with withExceptions() rather than a Handler class — confirm the integration guide reflects this for the target version. If the application has a custom Monolog channel stack, verify handler ordering so Bugsnag doesn't swallow or duplicate records. The OOM bootstrapper is opt-in and should be added to the HTTP kernel deliberately (it reserves ~5 MiB); treat it as a separate change from the base integration.
Sequencing
.env committed to the repo.redactedKeys, discardClasses, max_breadcrumbs, notifyReleaseStages) and get security sign-off before any production traffic flows.bugsnag:deploy to the CI/CD pipeline so releases correlate with error onset.Maintenance
Vendor-maintained with a continuous changelog and predictable versioning; the practical burden is upgrading in step with Laravel and Monolog majors. Pin to ^2.x, subscribe to releases, and fold notifier upgrades into the existing framework-upgrade runbook rather than treating them as standalone projects. The application owns config/bugsnag.php, so each upgrade needs a config diff review — the filters → redactedKeys deprecation is the template for the kind of small migration that accumulates silently if unowned. Assign a named owner; unowned notifier configs drift into either over-reporting (cost) or under-reporting (blind spots).
Support Official documentation is good and version-specific for both Laravel and Lumen, with an active issue tracker. The commercial support SLA depends on the plan tier, so confirm what we're actually buying before relying on it during an incident. Internally, we need a short runbook covering API key rotation, per-environment project setup, event-quota monitoring, and alert-routing changes. Budget for one engineer to become the notifier owner.
Scaling
Delivery is asynchronous over Guzzle, so the notifier shouldn't sit on the request path, but outbound volume still scales with traffic and with retry behavior on queue workers — one failing job with an aggressive retry policy can generate disproportionate event counts and cost. Control levers are discardClasses, release-stage filtering, breadcrumb caps, and grouping/deduplication. The OOM bootstrapper's memory reserve is negligible on typical containers but should be checked against tight Lambda/Vapor memory ceilings. Cost scales with events, not seats, so the volume dial is the one to monitor continuously rather than annually.
Failure modes
Ramp-up
A Laravel-fluent engineer reaches baseline productivity in roughly half a day for install and configuration, and one to two days to configure redaction properly. Team-wide fluency — reading grouped exceptions, using breadcrumbs and release-stage filters, understanding handled vs. unhandled semantics, knowing when not to call notify() — takes about a week of real incidents. The underestimated cost is the multi-week "signal quality" period after go-live: without dedicated tuning time and an owner, the tool's perceived value drops sharply within two months regardless of how clean the integration was.
How can I help you explore Laravel packages today?