Skip to content

Notification channels

A channel is the output config for alerts: where the notification goes, in what format, to whom.

Channel types

Type Recipient Format
Email Email addresses or user selection HTML + text
Mobile push Mobile app users (tenant or user-targeted) FCM notification + deep link
Webhook Any HTTP URL JSON payload
Slack Slack channel Structured Slack message
Teams Microsoft Teams channel Adaptive Card

/notification-channels is the management page.

Common fields per channel

Field Meaning
Name free-form, used in alert rules
Tenant super admin: global or tenant-specific
Severity filter only WARN and above? only CRIT?
Recovery notifications also send on recovery?
Throttle min seconds between two notifications (storm protection)

Email

Configuration

Field Meaning
Recipients list — fixed or variable like ${tenant_admins}
Reply-To optional
Template HTML template choice (default or custom)

Prerequisite: SMTP configured (setup wizard or Admin → SMTP).

Templates

Default template is German + English (language per user pref). Custom Jinja2 templates:

{# Variables: alert.host, alert.service, alert.status, alert.message #}
<h1>{{ alert.host.name }} — {{ alert.service.display_name }}</h1>
<p>Status: <b>{{ alert.status }}</b></p>
<p>{{ alert.message }}</p>
<p><a href="{{ alert.host_url }}">Open host</a></p>

Mobile push

Configuration

Field Meaning
Targeting „all tenant users" or specific users
Deep link default „jump to host detail"

Prerequisite: Firebase configured (shared FCM or own project). See Mobile app → Push.

User targeting

For „specific users" multi-select from tenant members. Only users with a registered mobile device are selectable.

Since v0.17.4

Tenant filter bug on push test fixed.

Webhook

Configuration

Field Meaning
URL recipient HTTPS URL
Method POST (default), PUT
Headers custom headers (e.g. Authorization)
Auth type None, Basic, Bearer
Payload template JSON template, default is Vesana-native

Default payload

{
  "version": 1,
  "alert_id": "uuid",
  "rule_name": "Disk Full Critical",
  "status": "CRITICAL",
  "host": {
    "id": "uuid",
    "name": "web01",
    "tenant": "Acme GmbH",
    "url": "https://vesana.example/hosts/uuid"
  },
  "service": {
    "id": "uuid",
    "display_name": "Disk /var",
    "check_type": "agent_disk",
    "value": 96.4,
    "message": "CRITICAL - /var at 96%"
  },
  "trigger_at": "2026-04-25T10:15:30Z",
  "is_recovery": false
}

Security

  • Optional HMAC signature: X-Vesana-Signature: sha256=...
  • Receiver should re-sign body and compare
  • Secret per channel configurable

Slack

Configuration

  1. Create Slack app: api.slack.com → New App → From Scratch
  2. Activate Incoming Webhooks, webhook URL into target channel
  3. URL into Vesana channel

Format: structured Slack message with severity color (red/yellow/green), buttons „Ack" and „Open host".

Teams

Configuration

  1. In Microsoft Teams: Channel → … → Connectors → Incoming Webhook
  2. Copy URL
  3. Into Vesana channel

Format: Adaptive Card with severity, host, service, buttons.

Throttle and rate limit

Min interval between two notifications can be set per channel. Default: 0 s (no throttle). Useful for mobile push to prevent spam.

Test

Per channel Send test notification:

  • Generates a fake alert payload
  • Sends to channel
  • UI shows success/error code with details

Multiple channels in a rule

Alert rules can use multiple channels in parallel — e.g. email + push for stage 1, webhook + Slack for stage 2 (escalation).

Each channel filters by severity again — if the channel is CRIT only, WARN alerts of the rule won't pass.

User preferences

Recipient users can mute individual channels (mobile push especially). Settings → Notifications → channel → pause.

The pause overrides rule and channel config.

Audit

Channel changes are in the audit log — filter target_kind = notification_channel.

Next