A complete guide to setting up and using Sentinel for error tracking across your Laravel applications.
Sentinel does not have public registration. An administrator creates your account via the command line:
php artisan sentinel:create-user
You'll be prompted for your name, email, and password. The command outputs your public status page URL — save it for later.
Each Laravel application you want to monitor is a "project" in Sentinel. Create one from the dashboard by clicking "New Project", or via CLI:
php artisan sentinel:create-project "My Laravel App"
This generates a unique API token that identifies this project. The token is shown once — copy it immediately. You'll need it in the next step.
See the Install the Package section below for complete setup instructions. Once configured, verify it works:
php artisan tinker
# Check the connection
>>> app(\UpgradeLabs\SentinelLaravel\SentinelClient::class)->isConfigured()
=> true
# Send a test error
>>> $r = app(\UpgradeLabs\SentinelLaravel\SentinelClient::class)->testReport()
>>> $r->status()
=> 201
Open your Sentinel dashboard — you should see the test error appear immediately.
composer require upgradelabs/sentinel-laravel
The only required config is the API token:
SENTINEL_TOKEN=your-project-api-token
Optional settings you can add to .env:
| Variable | Default | Description |
|---|---|---|
SENTINEL_TOKEN | — | Required. Your project API token. |
SENTINEL_ENABLED | true | Set to false to disable all reporting. |
SENTINEL_ENVIRONMENTS | all | Comma-separated list of environments to report from. Example: production,staging |
SENTINEL_QUEUE | null | Queue name for async reporting. Recommended for production: default |
SENTINEL_HEARTBEAT | true | Set to false to disable automatic heartbeat pings. |
php artisan vendor:publish --tag=sentinel-config
This creates config/sentinel.php where you can customize ignored exceptions, filtered fields, breadcrumb settings, and more.
Every unhandled exception in your Laravel app is sent to Sentinel with:
Error, warning for warnings, notice for notices)The following fields are automatically redacted from request data before sending:
password, password_confirmationtoken, secretcredit_card, card_number, cvv, ssnYou can customize the filtered fields in config/sentinel.php.
By default, these exceptions are not reported:
NotFoundHttpException (404 errors)ValidationExceptionAuthenticationExceptionMethodNotAllowedHttpExceptionCustomize in config/sentinel.php under ignored_exceptions.
For production apps, send error reports via a queue to avoid blocking requests:
SENTINEL_QUEUE=default
Reports are dispatched as queued jobs with 3 retries and 10-second backoff. If all retries fail, the failure is silently discarded (no infinite loops).
For older Laravel versions where automatic reportable() registration may not work, add the trait to your exception handler:
// app/Exceptions/Handler.php
use UpgradeLabs\SentinelLaravel\ReportsToSentinel;
class Handler extends ExceptionHandler
{
use ReportsToSentinel;
public function register(): void
{
$this->reportable(function (\Throwable $e) {
$this->reportToSentinel($e);
});
}
}
The dashboard is your control center. It shows a real-time overview of all your monitored applications.
A red banner appears at the top if any of your applications have stopped sending heartbeats for more than 10 minutes. Each offline project is listed with its last heartbeat time.
Four cards showing:
A 14-day line chart showing error occurrence volume. Hover over any point to see the exact count for that day.
A horizontal bar chart showing unresolved errors grouped by severity: Fatal, Error, Warning, Notice, Info.
Quick-access cards for your top 6 projects, showing name, environment, Laravel version, error count, and a red/green badge for unresolved errors.
The last 8 errors across all projects with status dot (pulsing red = unresolved, green = resolved, gray = ignored), project name, exception class, message, severity badge, occurrence count, and relative time.
The search bar in the sidebar searches across all your errors in all projects by exception class, message, or file name. Results appear in a dropdown with direct links to the error detail page.
Click "New Project" on the Projects page. Enter a name, and Sentinel generates a unique API token. The token is shown once in a yellow banner — copy it immediately.
Each project shows:
The error table supports:
Select multiple errors using the checkboxes, then use the batch action bar to:
Use "Select All" checkbox in the header to select all errors on the current page.
Click the gear icon to open settings:
Click any error to see the full detail page.
Shows the full exception message, file:line, and a link back to the project.
Total occurrence count, first seen date, and last seen date with relative time.
Click "Analyze Error" to get an AI-powered analysis streamed in real-time. Includes root cause, how to fix (with code examples), and prevention tips. Can be re-analyzed anytime.
If the same exception class appears in other projects, an amber banner shows which projects are affected — with links to each.
Add annotations that persist across occurrences. Use them for "known issue — waiting for vendor fix" or any context your team needs. Each note shows author and relative time.
Every status change (resolve, ignore, reopen) is logged with who did it and when. Shows as a timeline below the notes.
Each time the error happens, a new occurrence is recorded. Each occurrence shows:
Individual occurrences can be deleted without affecting the error log itself.
Sentinel integrates with Claude (by Anthropic) to provide AI-powered error analysis. You need an Anthropic API key — set it up in Settings > Integrations.
On any error detail page, click "Analyze Error". Claude receives the full error context (exception, stack trace, request data, environment) and streams back:
On any project page, click "Generate Report". Claude analyzes all errors from the last 5 days and produces:
Click "Analyze" in the Smart Grouping card. Claude examines all unresolved errors and identifies ones that likely share the same root cause, even when the exception classes or files differ.
Every Monday at 8:00 AM, Sentinel generates an AI-powered weekly summary and emails it to all users. Includes error stats, top offenders, and the most important thing to fix.
Record deployments so you can correlate errors with releases.
# Auto-detect from git (tag, commit hash, branch)
php artisan sentinel:deploy --auto
# With explicit values
php artisan sentinel:deploy --tag=1.2.0 --deployer="GitHub Actions"
# All options
php artisan sentinel:deploy \
--auto \
--tag=1.2.0 \
--environment=production \
--deployer="Forge" \
--description="Fix payment bug"
--auto detects the current git tag (as version), commit hash, and branch name automatically.
GitHub Actions:
- name: Notify Sentinel
run: php artisan sentinel:deploy --auto --deployer="GitHub Actions"
Laravel Forge deploy script:
php artisan sentinel:deploy --auto --deployer="Forge"
Deploys appear on the project detail page in two places:
The Sentinel package automatically pings the dashboard every 5 minutes via the Laravel scheduler. This tells Sentinel your app is alive.
* * * * * php artisan schedule:runWhen a project goes offline:
Alerts are sent only once per offline event — no spam. The flag resets when the project comes back online.
Each user gets a unique public status page URL:
https://sentinel.upgradelabs.pt/status/your-slug-abc123
The page shows all your active projects with their heartbeat status:
The page auto-refreshes every 60 seconds. Share it with clients or teammates.
php artisan tinker
>>> app(\UpgradeLabs\SentinelLaravel\SentinelClient::class)->heartbeat()
// Returns: {"message": "pong", "project": "...", "timestamp": "..."}
Configure in Settings > Notifications.
Toggle the master switch to enable/disable all email notifications. Configure either:
Set the "From" address and name. Use "Send Test Email" to verify your configuration.
Add Slack and/or Discord webhook URLs. New errors send rich formatted messages with:
Create threshold-based rules per project: "Alert if X errors occur in Y minutes." When triggered, the webhook fires (with cooldown to prevent spam).
In Settings > General, configure how many days of inactivity before errors are auto-resolved. Default: 14 days. Set to 0 to disable.
Add custom data that gets attached to any error occurring during the request:
use UpgradeLabs\SentinelLaravel\SentinelContext;
// In a controller, middleware, or service
SentinelContext::set([
'order_id' => 123,
'payment_method' => 'stripe',
'subscription_plan' => 'pro',
]);
The data appears in the error occurrence's "Context" section. Automatically cleared after each error report.
Breadcrumbs track the sequence of events leading up to an error. They're enabled by default.
Auto-captured:
Manual breadcrumbs:
SentinelContext::breadcrumb('payment', 'Charging customer', ['amount' => 99.99]);
SentinelContext::breadcrumb('api', 'Called Stripe API', ['endpoint' => '/charges']);
Up to 50 breadcrumbs per request. Oldest are dropped when the limit is reached.
Add the middleware to track request duration and memory usage:
// bootstrap/app.php (Laravel 11+)
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\UpgradeLabs\SentinelLaravel\Middleware\TrackSentinelPerformance::class,
]);
})
Each error report will include duration_ms and memory_peak_mb in the context.
Send Laravel log entries to Sentinel alongside your regular log files:
// config/logging.php
'channels' => [
'sentinel' => [
'driver' => 'custom',
'via' => \UpgradeLabs\SentinelLaravel\SentinelLogChannel::class,
'level' => 'error',
],
],
Then add it to your stack or use it directly:
// .env — add sentinel to the stack
LOG_STACK=daily,sentinel
// Or log explicitly
Log::channel('sentinel')->error('Payment failed', ['order_id' => 123]);
Log levels are mapped to Sentinel severities: emergency/alert/critical = fatal, error = error, warning = warning, notice = notice, info/debug = info.
Pull data from Sentinel into external tools like Grafana or custom dashboards. Read API must be enabled per project in the project settings.
All endpoints use Bearer token authentication (same token as the reporting package).
| Method | Endpoint | Description |
|---|---|---|
POST | /api/v1/report | Send error report (always available) |
POST | /api/v1/deploy | Record deployment (always available) |
GET | /api/v1/health | Heartbeat ping (always available) |
GET | /api/v1/stats | Project statistics (requires read access) |
GET | /api/v1/errors | List errors, paginated (requires read access) |
GET | /api/v1/deploys | Deployment history (requires read access) |
GET | /api/v1/downtime | Downtime periods (requires read access) |
# Unresolved errors only
GET /api/v1/errors?status=unresolved
# Fatal severity
GET /api/v1/errors?severity=fatal
# Custom page size
GET /api/v1/errors?per_page=50
curl -H "Authorization: Bearer YOUR_TOKEN" \
https://sentinel.upgradelabs.pt/api/v1/stats
# Response:
{
"project": "My App",
"environment": "production",
"laravel_version": "13.0",
"total_errors": 847,
"unresolved_errors": 23,
"last_error_at": "2026-03-29T...",
"last_heartbeat_at": "2026-03-30T...",
"is_online": true
}
Update your name and email address.
Change your password, configure two-factor authentication (TOTP), and manage passkeys for passwordless login.
Theme settings (dark mode is the default).
Auto-Resolve — set the number of days after which errors that haven't recurred are automatically resolved. Set to 0 to disable.
Anthropic API Key — required for AI analysis features. Get your key from console.anthropic.com. The key is stored encrypted in the database.
Sentinel supports multiple users. Each user has their own isolated workspace:
User A cannot see User B's data. There is no public registration — administrators create accounts via:
php artisan sentinel:create-user
The entire UI is available in 6 languages:
Switch language from the user menu in the sidebar, or from the language selector on the login and homepage. Your preference is saved to your account.
| Command | Description |
|---|---|
sentinel:create-user | Create a new user account (interactive) |
sentinel:create-project {name?} | Create a project and show its API token |
sentinel:projects | List all projects |
sentinel:projects --regenerate=slug | Regenerate API token for a project |
sentinel:auto-resolve | Auto-resolve stale errors (runs daily) |
sentinel:check-heartbeats | Check for offline projects (runs every 5 min) |
sentinel:weekly-digest | Send AI weekly digest email (runs Mondays 8am) |
| Command | Description |
|---|---|
sentinel:deploy --auto | Notify Sentinel of a deploy (auto-detects from git) |
sentinel:deploy --tag=1.0 --deployer="Forge" | Deploy with explicit values |