sbtsdev/laravelclickuperrorreports
Laravel package that automatically sends application error reports to ClickUp, creating tasks with exception details so your team can track and resolve issues without leaving their workflow.
This assessment is based on the package metadata and the conventions of Laravel exception-reporter packages. Class names, env keys, and publish tags below are the shape of the integration — verify the exact spelling against the repo README and
src/before wiring it in, because this package has little public usage to cross-check against.
1. Install and pin
composer require sbtsdev/laravelclickuperrorreports
Because the package has 2 stars and 0 dependents, avoid floating constraints. Pin the exact tag in composer.json and commit composer.lock.
2. Confirm auto-discovery
Check composer.json in the vendor package for extra.laravel.providers. If it's absent, register manually:
bootstrap/providers.phpconfig/app.php providers array3. Publish the config
php artisan vendor:publish --tag=clickup-config
# or: --provider="Sbtsdev\ClickUpErrorReports\ClickUpErrorReportsServiceProvider"
4. Set environment variables
CLICKUP_API_TOKEN=pk_xxxxxxxx
CLICKUP_LIST_ID=901234567890
CLICKUP_ERRORS_ENABLED=true
Then php artisan config:clear. The most common "it silently does nothing" cause with small packages is a config key that doesn't match what the README claims — open config/ and read the actual keys before trusting the docs.
5. Smoke test
php artisan tinker
>>> throw new RuntimeException('clickup smoke test');
or hit a throwaway route. You should get a task in the target ClickUp list within a few seconds.
First real use case: wire it into the global exception handler so unhandled exceptions in production become ClickUp tickets, gated to production only. That's the one thing this package buys you that a log file doesn't: an assignable, triageable inbox item.
Where to look first:
README.md — env keys and publish tagconfig/clickup-error-reporting.php — toggles, queue settings, formatter classsrc/ — the reporter class and its HTTP client (it's likely small; read all of it)Laravel 11+ (bootstrap/app.php):
->withExceptions(function (Exceptions $exceptions) {
$exceptions->report(function (Throwable $e) {
if (app()->isProduction()) {
app(\Sbtsdev\ClickUpErrorReports\ClickUpReporter::class)->report($e);
}
});
})
Laravel 10 and below: the report() method of App\Exceptions\Handler.
If the package registers itself with Laravel's reporting pipeline, plain report($e) from anywhere will work — check src/ for a register() call before assuming that.
For expected-but-notable failures, report explicitly so you control the threshold:
try {
$this->charge($order);
} catch (PaymentGatewayException $e) {
app(ClickUpReporter::class)->report($e);
throw $e; // still bubble it — don't swallow
}
The bare exception is rarely enough to act on. Attach the identifiers your team actually searches by:
app(ClickUpReporter::class)->withContext([
'user_id' => auth()->id(),
'tenant' => tenant('id'),
'route' => request()->route()?->getName(),
'release' => config('app.version'),
])->report($e);
If the package doesn't expose withContext, its formatter/transformer class (usually configurable) is the extension point — subclass it rather than forking.
An exception handler must not add latency or failure modes to a request that's already failing. Wrap the reporter in a job:
class ReportToClickUp implements ShouldQueue
{
public int $tries = 3;
public array $backoff = [10, 60, 300];
public function __construct(private Throwable $e) {}
public function handle(): void { /* app(ClickUpReporter::class)->report($this->e) */ }
}
During an outage you'll generate one exception per request. Without a fingerprint guard you'll create thousands of identical tasks and get rate-limited:
$key = 'clickup:'.md5($e::class.$e->getFile().$e->getLine());
if (Cache::add($key, true, now()->addHour())) {
ReportToClickUp::dispatch($e);
}
Map exception classes to different ClickUp list IDs in config: fatal/500s to an on-call list, recoverable warnings to a backlog list. This is the difference between a signal you read and a list you mute.
ClickUp is a ticket inbox, not Sentry or Telescope. Use it for failures a human must own. Keep it in addition to your monitoring, not instead of it.
NOASSERTION. There's no SPDX identifier. Get legal sign-off before this touches production, or vendor the two or three classes you need. This is the single biggest blocker for a commercial codebase.composer show -a sbtsdev/laravelclickuperrorreports and confirm a tag actually exists before pinning to one.try/catch and swallow.Authorization headers land in a tool your whole team — and possibly a client workspace — can read. Scrub before sending.APP_ENV guards, PHPUnit will file tickets..env change: php artisan config:cache (or config:clear). Stale config is the top cause of "it was working yesterday."QUEUE_CONNECTION=sync in production, the reporter is a synchronous third-party HTTP call on every exception. Verify the driver.Retry-After and keep the job backoff generous. Cap the payload — describe stack traces in a fenced block and truncate around 30k characters.src/ before trusting README. At this maturity level, the code is the spec. It's a small package — half an hour of reading tells you exactly what it does and what it doesn't.How can I help you explore Laravel packages today?