Notifications
Send build, deployment, monitoring, Kubernetes, domain and cost events to Slack, Microsoft Teams, Google Chat, email and webhooks.
On this page
Notifications decides which events go where. It has four tabs:
- Channels: where messages go (a Slack channel, a Teams channel, an email list, a webhook).
- Rules: which events go to which channels, from which severity.
- Summaries: scheduled daily, weekly or monthly digest cards.
- Delivery history: every message sent, with its delivery status.
Nothing is sent until there is at least one channel and one enabled rule that sends events to it.
Channel types
| Type | What you need |
|---|---|
| Slack | An Incoming webhook URL (Slack app > Incoming Webhooks > Add New Webhook to Workspace). |
| Microsoft Teams | A Workflow webhook URL (Teams channel > Workflows > "Post to a channel when a webhook request is received"). |
| Google Chat | A Space webhook URL (Google Chat space > Apps & integrations > Webhooks). |
| SMTP host, SMTP port, From address and Send to (comma-separated). SMTP username and SMTP password are optional. | |
| Webhook | An Endpoint URL that receives a JSON POST for every event, and an optional Signing secret. |
Webhook URLs, SMTP credentials and signing secrets are stored in the secret store and never shown again. Any of these fields can also point to a saved credential from Secrets & variables, so rotating the credential updates the channel.
Add a channel
You need modify access to Notifications.
- Open Notifications. The Channels tab is open.
- Click Add Slack, Add Microsoft Teams, Add Google Chat, Add Email or Add Webhook.
- Choose where the channel is available:
- This project: only this project's events can use it.
- Shared with all projects: organization-wide. Needs the matching access to Notifications in your organization role.
- Enter a Name and the connection fields.
- For Slack, Teams and Google Chat, adjust Look & feel if you like. The Preview shows roughly how a build message will look.
- Click Save channel.
- On the channel card, pick a message (Test message, or a sample build started, succeeded or failed message) and click Send. The card shows whether delivery worked.
Use Customize to change a channel later, the On/Off switch to pause it, and Delete to remove it (needs full access).
Look & feel (chat channels)
| Option | Values |
|---|---|
| Message style | Rich card (recommended) or Compact text. |
| Card title | Shown at the top of every card. Default OpsNexus. |
| Logo URL | A square https:// image shown in the card header. |
| Details section | Show or hide facts such as pipeline, branch, commit and duration. |
| Buttons | Show or hide Open run and View in OpsNexus. |
| Mention | Slack and Google Chat only. For example <!channel>, <!here> or <@U012AB3CD> in Slack, or <users/all> in Google Chat. |
| Mention when severity is at least | Slack and Google Chat only. Default High. |
Port 465 uses TLS. Any other port uses STARTTLS. Typical values are smtp.office365.com or smtp.gmail.com on port 587. Subjects start with [OpsNexus], and messages include an HTML card and a plain-text part.
Webhook payload
The webhook channel posts JSON like this:
{
"event": "build.failed",
"severity": "high",
"status": "failed",
"title": "payments-api #128 failed",
"body": "",
"facts": { "Pipeline": "payments-api", "Branch": "main" },
"sections": [],
"url": null,
"app_url": "https://opsnexus.example.com/cicd/runs/...",
"sent_at": "2026-11-14T09:30:00+00:00"
}If you set a Signing secret, each request carries an X-OpsNexus-Signature: sha256=<hex> header. The value is the HMAC-SHA256 of the raw request body with the secret as key. Verify it before trusting the request:
import hashlib, hmac
def is_valid(body: bytes, header: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)Private addresses
Webhook URLs and SMTP hosts that resolve to private, loopback or link-local addresses are refused, to protect against server-side request forgery. To send to internal services, an admin sets this in .env:
ALLOW_PRIVATE_TARGETS=trueRules
A rule picks events, a minimum severity, an optional environment and one or more channels.
- Open Notifications > Rules and click New rule.
- Choose This project or Shared with all projects.
- Enter a Rule name.
- Set Minimum severity:
info,low,medium,highorcritical. Only events at or above it are sent. - Set Environment: All,
prod,stagingordev. - Under Send to, tick the channels.
- Tick the events. Each group has Select all.
- Click Save rule.
A new rule starts with build failed, deployment failed, server or agent unreachable, and domain down ticked, and minimum severity medium.
Environment only filters events that carry an environment, such as builds and deployments from connected CI/CD integrations. Events without an environment pass any environment filter.
Per-project routing
Every event belongs to the project it happened in. When an event fires, OpsNexus looks at:
- the enabled rules of that project, and
- the enabled rules shared with all projects.
Each matching rule adds its channels, and each channel gets one message even if several rules match. A project rule may only send to its own project's channels and to shared channels. A shared rule may only send to shared channels.
Shared rules also receive organization events that don't belong to a project, such as a failed scheduled backup.
So, to send one team's alerts to its own Slack channel, add the channel and a rule in that team's project. To send every critical event to an on-call email list, add a shared channel and a shared rule with Minimum severity critical.
An organization can turn off sharing for notifications. Then only This project is available.
Events
Each event has a default severity. Events raised by alert rules use the rule's severity instead.
Builds & deployments
| Event | Label | Default severity |
|---|---|---|
build.started |
Build started | info |
build.succeeded |
Build succeeded | info |
build.failed |
Build failed | high |
build.approval |
Build waiting for approval | medium |
build.slow |
Builds running slow | medium |
build.stuck |
Build stuck in the queue | high |
build.unstable |
Pipeline success rate low | medium |
deployment.started |
Deployment started | info |
deployment.completed |
Deployment completed | info |
deployment.failed |
Deployment failed | critical |
Monitoring alerts
| Event | Label | Default severity |
|---|---|---|
cpu.high |
High CPU usage | high |
memory.high |
High memory usage | high |
disk.high |
Disk capacity warning | high |
server.down |
Server or agent unreachable | critical |
alert.resolved |
Alert resolved | info |
Kubernetes
| Event | Label | Default severity |
|---|---|---|
k8s.cluster.down |
Kubernetes cluster down | critical |
k8s.cluster.up |
Kubernetes cluster reachable again | info |
k8s.node.notready |
Kubernetes node not ready | high |
k8s.pod.failed |
Kubernetes pods failing | high |
k8s.pod.pending |
Kubernetes pods stuck pending | medium |
k8s.workload.unavailable |
Kubernetes workload unavailable | high |
k8s.hpa.maxed |
Kubernetes HPA at maximum | medium |
k8s.resolved |
Kubernetes problem resolved | info |
Kubernetes events are sent for clusters with alerts turned on. See Kubernetes.
Websites & domains
| Event | Label | Default severity |
|---|---|---|
domain.down |
Domain down | critical |
domain.slow |
Slow response time | medium |
ssl.expiring |
SSL certificate expiring | medium |
domain.expiring |
Domain registration expiring | medium |
Build agents
| Event | Label | Default severity |
|---|---|---|
agent.connected |
Agent connected | info |
agent.disconnected |
Agent disconnected | medium |
Cloud, security & integrations
| Event | Label | Default severity |
|---|---|---|
cost.alert |
Cloud cost alert | medium |
security.vulnerability |
Security vulnerability | high |
integration.error |
Integration error | medium |
cost.alert is sent when a budget crosses one of its thresholds, at high severity from 100%. See Cost & budgets. integration.error is also used when a scheduled backup fails.
Summaries
A summary is a scheduled card sent straight to the channels you choose. It doesn't use rules.
- Open Notifications > Summaries and click New summary. You need at least one channel first.
- Choose This project (covers only this project) or Shared with all projects (covers the whole organization).
- Set Name, How often (Daily, Weekly or Monthly), Day or Day of month (1 to 28), Time and Time zone.
- Under Include, tick the sections: Builds & deployments, Monitoring alerts, Website uptime, Cloud cost, Security findings and Website traffic.
- Under Send to, tick the channels.
- Click Save summary.
Each card covers the period since the previous one. Click Send now to send one for the period ending now. Website traffic comes from the Traffic tab of Domains & SEO.
Delivery history
Delivery history lists every message with its event, channel, severity, when it was sent, its delivery status and who acknowledged it. Filter by delivered, retrying or failed.
- A failed send is retried, up to 3 attempts in total. After that the delivery is marked failed and the error is shown.
- Click Retry to try a failed delivery again (needs modify access).
- Click Acknowledge to mark a message as seen.
Each channel card also shows the result of its last delivery.
Permissions
Notifications use the Notifications module in roles.
| Access level | Allows |
|---|---|
| read | See channels, rules, summaries and history. Acknowledge deliveries. |
| modify | Add and change channels, rules and summaries. Send tests. Retry deliveries. |
| full | Delete channels. |
Items shared with all projects belong to the organization. Changing them needs that access level on Notifications in your organization role. Channel, rule and summary changes are written to the audit log.