Channel types
| Type | Configuration | Plan |
|---|---|---|
| Recipient email addresses | Free | |
| Slack | Incoming webhook URL | Starter |
| Discord | Webhook URL | Starter |
| Webhook | URL + optional HMAC signing secret | Starter |
| PagerDuty | Events API v2 routing key | Pro |
| OpsGenie | API key | Pro |
| Microsoft Teams | Webhook URL | Pro |
Lifecycle behavior
Channels fall into two notification models:Fire-and-forget
Email, Slack, Discord, Teams, Webhook Each message is self-contained. The channel sends a notification when an incident is created and a separate notification when it’s resolved. There is no state maintained in the external system.Trigger-resolve
PagerDuty, OpsGenie The channel opens an alert in the external system when an incident is created and explicitly resolves it when the incident resolves. The external system maintains its own state (acknowledgment, escalation, on-call routing) tied to the DevHelm incident. This distinction matters for escalation chain behavior — stateful integrations always close their external alerts on resolution, even whenonResolve is set to silent.
Creating a channel
Configuration by type
Email
| Field | Description |
|---|---|
recipients | Array of email addresses |
Slack
Slack
| Field | Description |
|---|---|
webhookUrl | Slack incoming webhook URL |
Discord
Discord
| Field | Description |
|---|---|
webhookUrl | Discord webhook URL |
Webhook
Webhook
| Field | Description |
|---|---|
url | Target URL that receives POST payloads |
signingSecret | Optional HMAC-SHA256 signing secret for payload verification |
PagerDuty
PagerDuty
| Field | Description |
|---|---|
routingKey | PagerDuty Events API v2 routing key |
OpsGenie
OpsGenie
| Field | Description |
|---|---|
apiKey | OpsGenie API key |
Microsoft Teams
Microsoft Teams
| Field | Description |
|---|---|
webhookUrl | Teams incoming webhook URL |
Testing a channel
Verify your configuration before using it in a notification policy:Delivery history
Track delivery attempts and failures for a channel:Channel fields
| Field | Type | Description |
|---|---|---|
id | UUID | Unique channel identifier |
name | string | Human-readable name |
channelType | string | Integration type |
displayConfig | object | Non-sensitive configuration metadata |
configHash | string | SHA-256 hash of the full config (for change detection) |
lastDeliveryAt | datetime | Most recent delivery attempt |
lastDeliveryStatus | string | Result of the last delivery (e.g., SUCCESS, FAILED) |
Channel configurations are write-only for security. After creation, the API returns
displayConfig (non-sensitive metadata) and configHash but never the full secret values.Next steps
Notification policies
Route incidents to the right channels based on rules.
Integrations
Step-by-step setup for each integration.
Alerting guide
End-to-end guide for setting up alerting.