MaxBack Watchdog — Notifications
The Watchdog can send notifications through email (SMTP) or webhooks whenever something happens that needs your attention — a failed backup, a stopped service, an expiring license, or low disk space.
How notifications work
Notifications flow through a simple pipeline:
- An event happens — a backup completes, a service stops, disk space runs low
- The VssWriter or Watchdog sends the event to the notification service
- The Watchdog checks which channels are subscribed to that event type
- Each matching channel delivers the notification — as an email or a webhook POST
You can set up multiple channels, each listening for different event types. For example, you might send backup failures to your ops team by email, and all events to a monitoring dashboard by webhook.
Setting up email notifications
Email notifications are sent through SMTP. You need an SMTP server — your company mail server, Microsoft 365, Gmail, or any other SMTP-capable service.
Create credentials
Most SMTP servers require authentication. Run:
maxback.vssclient watchdog credentials add
The command walks you through the setup. It asks for a name for the credential, the authentication type (Basic or OAuth2), a username, and the password. The password is encrypted and stored locally — it never leaves the machine.
OAuth2 for Microsoft 365 and Google
If your mail server uses OAuth2 (common with Microsoft 365 and Google Workspace), choose OAuth2 as the type. The command will ask for the client ID, token endpoint URL, and scope instead of a username. You'll find these values in your Azure AD or Google Cloud app registration.
Add an email channel
maxback.vssclient watchdog channels add
The command asks you step by step:
- Channel name — pick something descriptive, like
AlertMailorOpsTeam - Channel type — choose
Smtp - SMTP host — your mail server, e.g.
mail.example.com - Port — defaults to 587
- Use TLS — defaults to yes
- Sender address — the "from" address on the emails
- Recipients — one or more email addresses, comma-separated
- Credential — pick one of your stored credentials, or none for unauthenticated SMTP
- Events — select which events should trigger a notification on this channel
After the channel is created, send a test to make sure everything works:
maxback.vssclient watchdog channels test
The test sends a sample notification through the full pipeline. The Watchdog service must be running. You'll see OK or FAIL for each channel.
Setting up webhook notifications
Webhooks send a JSON payload to an HTTP endpoint of your choice — a monitoring system, a chat integration, a custom API, or anything that can receive POST requests.
maxback.vssclient watchdog channels add
Choose Webhook as the channel type. The command asks for a name, the endpoint URL, and which events to subscribe to. If your endpoint requires authentication, you can assign a credential (Basic or OAuth2) — the same way as with email channels.
See Webhook payload format below for the JSON structure your endpoint will receive.
Managing channels and credentials
To see what's configured:
maxback.vssclient watchdog channels list
maxback.vssclient watchdog credentials list
To change a channel — for example, to add recipients or change which events it listens for:
maxback.vssclient watchdog channels set
The command asks which channel to update, then walks you through the current settings so you can change what you need. You can also pass the channel name and only the fields you want to change on the command line — see the Command-Line Reference for all options.
To change the stored password or client secret for a credential:
maxback.vssclient watchdog credentials secret
To remove a channel or credential:
maxback.vssclient watchdog channels remove
maxback.vssclient watchdog credentials remove
Credential dependencies
You cannot remove a credential that is still used by a channel. Update or remove the channel first.
Email format
Email notifications come in two formats depending on the event type.
Backup and restore results include a summary table (database, backup type, result, start and end time, duration) followed by a detailed log of all operations and their results.
Alert notifications (service down, missing backup, license issues, disk space) include a severity banner, a message describing what happened, and a details table with context like drive name, free space, expiration date, or service name.
Both formats support light and dark mode in email clients that support it.
Webhook payload format
Webhook notifications are sent as HTTP POST requests with a JSON body. The payload uses snake_case field names.
Payload structure
{
"version": "1.0",
"event_type": "BackupFailed",
"host": "SERVER01",
"event": {
"event_type": "BackupFailed",
"db_name": "PRD",
"message": "Backup session failed",
"severity": "Error",
"session": { ... },
"details": null
}
}
Top-level fields
| Field | Type | Description |
|---|---|---|
version | string | Payload version, currently "1.0" |
event_type | string | The event type (see list below) |
host | string | Machine name where the event originated |
event | object | The full event details |
Event object
| Field | Type | Description |
|---|---|---|
event_type | string | Same as top-level event_type |
db_name | string | Database name, or service name for service events |
message | string | Human-readable description of what happened |
severity | string | Info, Warning, or Error |
session | object or null | Session log data (only for backup/restore events) |
details | object or null | Key-value pairs with additional context (only for alert events) |
Session object (backup/restore events)
Present when event_type is one of: BackupCompleted, BackupWarning, BackupFailed, RestoreCompleted, RestoreWarning, RestoreFailed.
{
"session": {
"log_type": "BackupLog",
"db_name": "PRD",
"start_time": "2025-04-04T22:00:00Z",
"end_time": "2025-04-04T23:15:00Z",
"result": "Failed",
"entries": [
{
"type": "Operation",
"name": "Create Snapshot",
"result": "Completed",
"start_time": "2025-04-04T22:00:01Z",
"end_time": "2025-04-04T22:00:03Z"
},
{
"type": "Event",
"severity": "Error",
"message": "Failed to copy log backup: disk full"
}
]
}
}
| Field | Type | Description |
|---|---|---|
log_type | string | BackupLog or RestoreLog |
db_name | string | Database name |
start_time | string | ISO 8601 timestamp |
end_time | string | ISO 8601 timestamp |
result | string | Completed, CompletedWithWarnings, or Failed |
entries | array | Operations and log events from the session |
Details object (alert events)
Present when event_type is one of: MissingBackup, ServiceDown, ServiceRestartFailed, LicenseExpiring, LicenseExpired, LicenseMissing, LogDiskSpaceLow, LogDiskSpaceCritical.
The details object contains context-specific key-value pairs. Examples:
Missing backup:
{
"details": {
"backup_type": "Full",
"window_start": "2025-04-04T22:00:00",
"window_end": "2025-04-05T10:00:00",
"cron": "0 22 * * *"
}
}
Disk space low:
{
"details": {
"drive": "E:",
"free_mb": "342",
"total_mb": "102400",
"threshold_mb": "500"
}
}
License expiring:
{
"details": {
"expiration_date": "2025-05-01",
"days_remaining": "27"
}
}
Event types reference
| Event type | Severity | Has session | Has details |
|---|---|---|---|
BackupCompleted | Info | Yes | No |
BackupWarning | Warning | Yes | No |
BackupFailed | Error | Yes | No |
RestoreCompleted | Info | Yes | No |
RestoreWarning | Warning | Yes | No |
RestoreFailed | Error | Yes | No |
MissingBackup | Error | No | Yes |
ServiceDown | Warning | No | Yes |
ServiceRestartFailed | Error | No | Yes |
LicenseExpiring | Warning | No | Yes |
LicenseExpired | Error | No | Yes |
LicenseMissing | Error | No | Yes |
LogDiskSpaceLow | Warning | No | Yes |
LogDiskSpaceCritical | Error | No | Yes |
HTTP details
- Method: POST
- Content-Type:
application/json - Authentication:
Authorization: Basic ...orAuthorization: Bearer ...if a credential is assigned, no header otherwise - Timeout: 30 seconds
- Success: Any 2xx response
- Failure: Logged on the Watchdog, no retry (the event is not re-sent)