Alerts & Notifications¶
Configure email and webhook notifications to stay informed about expiring credentials, failed operations, and security events.
Overview¶
CertifyClouds alerts keep your team notified:
- Multiple channels: Email, Slack, Microsoft Teams, PagerDuty, custom webhooks
- Alert types covering discovery, rotation, sync, and B2C events
- Delivery modes: Immediate (on trigger), scheduled digest, or both
- Flexible scheduling: Configure when digests are sent
- Subscription filtering: Scope alerts to specific Azure subscriptions
Alert Types¶
Discovery Alerts¶
| Alert Type | Trigger | Severity |
|---|---|---|
secret_expiring | Any Key Vault asset (secret, certificate, or key) expires within threshold | Warning |
secret_expired | Any Key Vault asset (secret, certificate, or key) has already expired | Critical |
scan_completed | Discovery scan finished | Info |
vault_error | Error accessing Key Vault | Error |
Rotation Alerts (PRO + ENTERPRISE)¶
| Alert Type | Trigger | Severity |
|---|---|---|
rotation_success | Credential successfully rotated | Info |
rotation_failed | Rotation attempt failed | Error |
Sync Alerts (PRO + ENTERPRISE)¶
| Alert Type | Trigger | Severity |
|---|---|---|
sync_success | Secret synced to target cloud | Info |
sync_failed | Sync operation failed | Error |
sync_conflict | Conflicting versions detected during sync | Warning |
B2C Alerts (PRO + ENTERPRISE)¶
| Alert Type | Trigger | Severity |
|---|---|---|
b2c_credentials_expiring | B2C tenant credential expires within threshold | Warning |
Notification Channels¶
Email¶
Send alerts to individuals or distribution lists.
Configuration (Settings > Alerts):
- Click Add Rule
- Select alert type (e.g.,
secret_expiring) - Choose Email delivery
- Enter recipient(s)
- Set threshold (for expiring alerts)
- Save
SMTP Setup Required:
Configure email in your environment:
Slack¶
Post alerts to Slack channels using incoming webhooks.
Setup:
- In Slack, create an Incoming Webhook:
- Go to your Slack workspace settings
- Apps > Manage > Custom Integrations > Incoming Webhooks
- Create webhook and copy URL
- In CertifyClouds:
- Settings > Alerts > Add Rule
- Select Webhook delivery
- Choose type: Slack
- Paste webhook URL
- Save
Payload Format:
{
"attachments": [
{
"color": "#EF4444",
"title": "Secret Expiring Alert",
"text": "Found 3 secrets expiring within 30 days",
"footer": "CertifyClouds",
"fields": [
{"title": "Vault", "value": "kv-production", "short": true},
{"title": "Secrets", "value": "api-key, db-password", "short": true}
]
}
]
}
Microsoft Teams¶
Post to Teams channels using Incoming Webhooks.
Setup:
- In Teams, create an Incoming Webhook:
- Go to channel settings > Connectors
- Add Incoming Webhook
- Copy webhook URL
- In CertifyClouds:
- Settings > Alerts > Add Rule
- Select Webhook delivery
- Choose type: Teams
- Paste webhook URL
- Save
Payload Format:
{
"@type": "MessageCard",
"@context": "https://schema.org/extensions",
"themeColor": "EF4444",
"title": "Secret Expiring Alert",
"text": "Found 3 secrets expiring within 30 days",
"sections": [
{
"facts": [
{"name": "Vault", "value": "kv-production"},
{"name": "Secrets", "value": "api-key, db-password"}
]
}
]
}
Generic Webhook¶
For custom integrations not covered by Slack / Teams / PagerDuty.
Payload Format:
{
"title": "Secret Expiring Alert",
"message": "Found 3 secrets expiring within 30 days",
"color": "#EF4444",
"timestamp": "2026-05-20T12:00:00+00:00",
"source": "CertifyClouds",
"fields": [
{"title": "Vault", "value": "kv-production"},
{"title": "Secrets", "value": "api-key, db-password"}
]
}
For Slack and Microsoft Teams payload shapes see Webhook Delivery.
PagerDuty (1.4.14)¶
Page on-call directly via the PagerDuty Events API v2. CertifyClouds posts to https://events.pagerduty.com/v2/enqueue (hardcoded server-side); the per-service Integration Key is the credential.
Setup
- In PagerDuty: Services → Service Directory → New Service → "Events API v2" integration. Name it "CertifyClouds".
- Copy the 32-character Integration Key.
- In CertifyClouds: Settings → Alerts → New Rule → Webhook → Type: PagerDuty, paste the Integration Key in the "Routing Key" field.
- Click Test webhook. A test incident appears in PagerDuty.
Severity mapping
CertifyClouds maps each alert type to a PagerDuty severity:
| CertifyClouds alert type | PagerDuty severity |
|---|---|
secret_expired | critical |
rotation_failed, sync_failed, vault_error | error |
secret_expiring, sync_conflict, b2c_credentials_expiring | warning |
Routine completion events filtered
rotation_success, sync_success, scan_completed, discovery_completed are not forwarded to PagerDuty by design - PagerDuty is for paging, not log stream. Use email / Slack / Teams for routine confirmations.
Dedup key
CertifyClouds derives a stable dedup key per alert (e.g. cc:secret_expired:kv-prod:client-secret) so repeated alerts about the same resource collapse into one PagerDuty incident rather than flooding the on-call.
Networking requirement
CertifyClouds must reach events.pagerduty.com:443 outbound. If your deployment sits behind an egress proxy or in an air-gapped network, this hostname must be allow-listed; CertifyClouds does not currently support proxy-routed PagerDuty delivery.
Payload sent
{
"routing_key": "<your-integration-key>",
"event_action": "trigger",
"dedup_key": "cc:secret_expired:kv-prod:client-secret",
"client": "CertifyClouds",
"payload": {
"summary": "Secret expired in kv-prod",
"source": "CertifyClouds",
"severity": "critical",
"timestamp": "2026-05-20T15:00:00+00:00",
"component": "secret_expired",
"custom_details": {
"message": "1 secret has expired and requires immediate rotation",
"alert_type": "secret_expired",
"fields": [
{"name": "Vault", "value": "kv-prod"},
{"name": "Secret", "value": "client-secret"}
]
}
}
}
Delivery Modes¶
Immediate¶
Alerts sent on the next evaluator tick after the triggering event.
Best for:
- Critical alerts (expired secrets)
- Rotation failures
- Security events
Digest¶
Alerts batched and sent on a schedule.
Best for:
- Warning-level alerts (expiring soon)
- Reducing notification fatigue
- Non-urgent monitoring
Both¶
Send critical alerts immediately AND include in digest.
Scheduling¶
Digest Schedule¶
Configure when digest emails are sent:
| Schedule | Description |
|---|---|
| Daily 8:00 AM | Once per day |
| Daily 9:00 AM + 5:00 PM | Twice per day |
| Weekly Monday 9:00 AM | Weekly summary |
Configure Schedule¶
- Go to Settings > Alerts
- Click Digest Settings
- Select timezone
- Set delivery times
- Save
Creating Alert Rules¶
Step-by-Step¶
- Navigate: Settings > Alerts
- Add Rule: Click "Add Rule" button
- Configure:
- Name: Descriptive rule name
- Alert Type: What triggers the alert
- Threshold: Days before expiry (for expiring alerts)
- Delivery: Email, Webhook, or both
- Mode: Real-time, Digest, or Both
- Recipients/URL: Destination for alerts
- Filter (optional):
- Specific subscriptions
- Specific vaults
- Asset types
- Save: Enable and save the rule
Example Rules¶
Critical: Expired secrets (real-time)
- Type:
secret_expired - Delivery: Email + Slack
- Mode: Real-time
- Recipients: security-team@company.com
Warning: Secrets expiring in 30 days (digest)
- Type:
secret_expiring - Threshold: 30 days
- Delivery: Email
- Mode: Digest (daily)
- Recipients: ops-team@company.com
Info: Rotation success (real-time)
- Type:
rotation_success - Delivery: Teams webhook
- Mode: Real-time
Testing Alerts¶
Test Button¶
Each alert rule has a "Test" button:
- Go to Settings > Alerts
- Find the rule to test
- Click Test
- Verify notification received
Programmatic test¶
POST /api/alerts/rules/{id}/test dispatches a test notification through the rule's configured channel. Request and response shapes are in your deployment's /docs.
Alert History¶
View all sent alerts:
- Go to Alerts tab
- Click History
- Filter by:
- Date range
- Alert type
- Delivery status
Statuses¶
| Status | Description |
|---|---|
| Delivered | Successfully sent |
| Failed | Delivery failed (check logs) |
| Pending | In digest queue |
| Retrying | Retry in progress |
Retry Logic¶
Failed webhook deliveries are retried with exponential backoff. 2xx responses are treated as success; 4xx responses (except 408 / 429) are treated as permanent client errors and not retried; 5xx, 408, 429, timeouts, and connection errors are retried. Persistent failures eventually mark the alert as failed and surface in the rule's delivery history.
See Webhook Delivery for the receiver payload shapes.
Troubleshooting¶
Emails not received¶
- Check SMTP configuration in environment variables
- Verify recipient email address
- Check spam/junk folder
- Review application logs for errors
Webhook failures¶
- Verify webhook URL is correct
- Check if endpoint is accessible from CertifyClouds
- Ensure endpoint accepts POST requests
- Check for firewall/network restrictions
Duplicate notifications¶
- Check for overlapping rules
- Review threshold settings
- Ensure you don't have both real-time AND digest for the same alert
API access¶
Alert rules can be managed programmatically via /api/alerts/rules and delivery history queried via /api/alerts/history. The full endpoint catalogue is in API Endpoints; exact request and response shapes are in your deployment's /docs.
Best Practices¶
- Don't over-alert: Use digests for warnings, real-time for critical
- Route appropriately: Send security alerts to security team, ops alerts to ops
- Test regularly: Use the test button to verify delivery
- Monitor failures: Check alert history for delivery issues
- Use thresholds wisely: 30 days gives time to act without noise