PHPackages                             quendistudio/monitoring - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Logging &amp; Monitoring](/categories/logging)
4. /
5. quendistudio/monitoring

ActiveWinter-plugin[Logging &amp; Monitoring](/categories/logging)

quendistudio/monitoring
=======================

Report Winter CMS exceptions to a configurable HTTP webhook

1.2.0(1mo ago)01MITPHPPHP &gt;=8.1

Since Jun 23Pushed 1mo agoCompare

[ Source](https://github.com/quendistudio/monitoring)[ Packagist](https://packagist.org/packages/quendistudio/monitoring)[ Docs](https://github.com/quendistudio/monitoring)[ RSS](/packages/quendistudio-monitoring/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (1)DependenciesVersions (2)Used By (0)

Quendistudio.Monitoring
=======================

[](#quendistudiomonitoring)

Winter CMS plugin — reports application exceptions to a configurable **HTTP webhook endpoint** (JSON POST + Bearer token).

Lightweight, no external dependencies: ideal for hooking up a custom worker, n8n, Zapier, or any API that accepts JSON.

Installation
------------

[](#installation)

### Composer (recommended)

[](#composer-recommended)

```
composer require quendistudio/monitoring
php artisan winter:up
```

### Manual

[](#manual)

Clone into `plugins/quendistudio/monitoring`, then:

```
php artisan winter:up
```

Backend → **Settings** → **Monitoring** (QuendiStudio Plugins category). Full documentation is also available in the **Documentation** tab of the settings page.

Grant the `quendistudio.monitoring.access_settings` permission to the relevant administrators.

Configuration
-------------

[](#configuration)

FieldDescriptionEnable reportingMaster switchSite identifierUnique slug (e.g. `mywebsite-www`) — useful for multi-site setupsSite URLEmpty = `APP_URL`Webhook URLPublic HTTP/HTTPS endpoint only (local/private addresses rejected)Webhook secretKey sent as `Authorization: Bearer …`Deduplication (minutes)Do not resend the same error before this intervalHTTP timeoutMax duration of the call (seconds)Log lines to includeTail excerpt from `storage/logs/system*.log`Log file (optional)Custom path **inside `storage/logs/`** onlyVerify SSL**Off** = skip certificate check (local dev). **On** = always verify (production)Report console errorsIncludes CLI exceptions (artisan, cron)Allow test routeDebug route (see Tests)Which exceptions are reported?
------------------------------

[](#which-exceptions-are-reported)

Winter’s built-in `$dontReport` list (in `Handler.php`) tells the core **not to log** certain exception types to the application log — it does **not** mean they are unimportant. This plugin hooks **`exception.beforeReport`**, which runs **before** that filter, so the following are included when they reach the exception handler:

- `ApplicationException`, `ValidationException`, `AjaxException`
- HTTP, authentication, and model-not-found exceptions
- Any other `Throwable` passed to `Handler::report()`

**Not reported:** exceptions caught and handled before `report()` is called (expected control flow, successful validation redirects, etc.).

Sensitive data in payloads
--------------------------

[](#sensitive-data-in-payloads)

The JSON payload is designed for automated analysis. It may contain:

- Full exception messages and stack traces
- Request URL including **query string** (tokens, emails, etc.)
- Tail of `storage/logs/system*.log` (may include secrets from log context)

Ensure the webhook endpoint and downstream services (agent, email provider) are trusted and secured. Restrict backend access to Monitoring settings.

JSON schema
-----------

[](#json-schema)

Each exception triggers a **POST** to `webhook_url` with headers:

```
Content-Type: application/json
Authorization: Bearer {webhook_secret}
User-Agent: Quendistudio.Monitoring/1.0

```

### Root fields

[](#root-fields)

FieldTypeDescription`event`stringAlways `winter.exception``source`stringAlways `quendistudio.monitoring``site_id`stringSite identifier (settings or hostname)`site_url`stringSite URL`platform`stringAlways `wintercms``occurred_at`stringISO 8601 timestamp`exception`objectException details (see below)`request`objectHTTP context (empty in CLI)`logs_tail`stringLast lines of the system log file`test`boolPresent and `true` only for test payloads### `exception` object

[](#exception-object)

FieldTypeDescription`class`stringException FQCN`message`stringError message`file`stringSource file`line`intSource line`code`intError code`trace`stringStack trace (truncated per settings)### `request` object

[](#request-object)

FieldTypeDescription`url`stringFull request URL`method`stringHTTP method`ip`stringClient IP address`user_agent`stringUser-Agent (max 500 characters)### Example (real exception)

[](#example-real-exception)

```
{
  "event": "winter.exception",
  "source": "quendistudio.monitoring",
  "site_id": "mywebsite-www",
  "site_url": "https://www.example.com",
  "platform": "wintercms",
  "occurred_at": "2026-06-15T14:30:00+02:00",
  "exception": {
    "class": "Winter\\Storm\\Exception\\ApplicationException",
    "message": "Something went wrong",
    "file": "/var/www/plugins/vendor/plugin/SomeClass.php",
    "line": 42,
    "code": 0,
    "trace": "#0 /var/www/index.php(42): ..."
  },
  "request": {
    "url": "https://www.example.com/page",
    "method": "GET",
    "ip": "203.0.113.1",
    "user_agent": "Mozilla/5.0 ..."
  },
  "logs_tail": "[2026-06-15 14:29:58] production.ERROR: ..."
}
```

### Example (test payload)

[](#example-test-payload)

Same as above, plus `"test": true` and a simulated message.

Adapting your endpoint
----------------------

[](#adapting-your-endpoint)

The plugin sends a **generic JSON format**. Your endpoint (or an intermediary) is responsible for:

- validating the Bearer token;
- parsing the `exception`, `request`, and `logs_tail` fields;
- triggering the desired action (email, ticket, centralized logging, etc.).

**Integration examples:**

- **Serverless worker** (Cloudflare Workers, AWS Lambda): receive the POST, format an email or alert.
- **n8n / Zapier / Make**: webhook trigger → map JSON fields to Slack, email, database.
- **Internal API**: store errors in your own monitoring system.

Extension plugins for native formats (Slack, Discord, Sentry, etc.) may be developed later; this plugin deliberately focuses on the generic webhook.

Tests
-----

[](#tests)

```
# Test JSON payload (without throwing an exception)
php artisan monitoring:testwebhook
```

Intentional exception route (Development tab):

1. Enable **Allow test route**
2. Ensure `APP_DEBUG=true`
3. Open `/quendistudio/monitoring/test-exception`

Do not enable the test route in production.

Application flow
----------------

[](#application-flow)

```
Winter Handler::report()
  → exception.beforeReport (this plugin)
  → ExceptionPayloadBuilder (JSON)
  → ErrorReporter (deduplication after successful POST, async at end of request)
  → Your webhook

```

Appendix: Cursor Automation integration
---------------------------------------

[](#appendix-cursor-automation-integration)

[Cursor Automations](https://cursor.com) can act as a webhook receiver with a **Webhook** trigger:

1. Create an automation with a Webhook trigger.
2. Copy the URL and authentication key into **Webhook URL** and **Webhook secret**.
3. Configure the agent prompt to analyze the JSON payload (`exception`, `logs_tail`, `request`).
4. Optional: chain a second webhook (email, Resend, Slack, etc.) from the automation.

The JSON schema documented above can be used directly by the Cursor agent — no transformation on the plugin side is required.

License
-------

[](#license)

MIT — see [LICENCE.md](LICENCE.md).

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance90

Actively maintained with recent releases

Popularity1

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

45d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/589cf09b9bf5835534b4c5219aec0b54f91364a87d07ed1d12871a6769132684?d=identicon)[quendistudio](/maintainers/quendistudio)

---

Top Contributors

[![quendistudio](https://avatars.githubusercontent.com/u/20945117?v=4)](https://github.com/quendistudio "quendistudio (1 commits)")

---

Tags

exceptionsmonitoringwebhookwintercmswintercms-pluginmonitoringexceptionswebhookwintercmsquendistudio

### Embed Badge

![Health badge](/badges/quendistudio-monitoring/health.svg)

```
[![Health](https://phpackages.com/badges/quendistudio-monitoring/health.svg)](https://phpackages.com/packages/quendistudio-monitoring)
```

###  Alternatives

[rollbar/rollbar

Monitors errors and exceptions and reports them to Rollbar

33725.2M90](/packages/rollbar-rollbar)[honeybadger-io/honeybadger-laravel

Honeybadger Laravel integration

431.4M](/packages/honeybadger-io-honeybadger-laravel)[honeybadger-io/honeybadger-php

Honeybadger PHP library

381.6M5](/packages/honeybadger-io-honeybadger-php)[socloz/monitoring-bundle

A profiling/monitoring Symfony2 bundle for production servers - alerts on exceptions, logs profiling data &amp; sends data to statsd/graphite

6944.2k](/packages/socloz-monitoring-bundle)[gevans/honeybadger

Honeybadger PHP library

387.6k](/packages/gevans-honeybadger)[taecontrol/moonguard

Monitor package to keep your sites in orbit

311.1k](/packages/taecontrol-moonguard)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
