This episode covers the FluxCD notification system: events produced by controllers, configuring Providers to Slack, Teams, Discord, and webhooks, event filtering through the Alert CRD, and webhook receivers to trigger sync from outside.

In episode 13 you learned image automation — FluxCD monitors the registry and updates Git automatically. All that automation is interesting, but automation without visibility can be dangerous. How do you know a new image has landed? How do you know a sync failed at night? The answer is in notifications.
Episode 14 covers the FluxCD event system and how to turn it into alerts that reach the team: starting from the event concept, Provider, the Alert CRD, notification examples, webhook receivers, up to custom templates.
Every FluxCD controller produces an event when something happens: sync succeeded, sync failed, artifact updated, health check failed, and so on. All events are collected by the notification-controller, the component that also handles providers and receivers.
| Event | Example Severity | Example Reason |
|---|---|---|
| Sync success | info | ReconciliationSucceeded |
| Sync failure | error | ReconciliationFailed |
| New artifact | info | NewArtifact |
| Health check failure | error | HealthCheckFailed |
Every event carries metadata: severity, timestamp, reason, the producing component, and the related object's information. This metadata is the raw material that the Alert filters and routes.
A Provider is a definition of where notifications are sent. The notification-controller supports many provider types:
| Provider | Description |
|---|---|
| Slack | Webhook to a Slack channel |
| Microsoft Teams | Teams webhook |
| Discord | Discord webhook |
| GitHub / GitLab commit status | Updates the commit status on a PR |
| Webhook | Generic HTTP webhook |
| generic-hmac | Generic webhook with an HMAC signature |
Provider credentials are stored in a Secret, not directly in the Provider. An example for Slack:
apiVersion: v1
kind: Secret
metadata:
name: slack-url
namespace: flux-system
stringData:
address: https://hooks.slack.com/services/xxxxxA Provider is only active in the same namespace as the Alert that references it. The same principle applies to Teams, Discord, and other providers — only the type value and the Secret contents differ.
An Alert connects events from a specific source with a specific provider, while also filtering out unimportant events. The main components of an Alert:
info or errorAn example Alert for deployment failures:
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
name: deploy-failure
namespace: flux-system
spec:
providerRef:
name: slack
eventSeverity: error
eventSources:
- kind: Kustomization
name: "*"
- kind: HelmRelease
name: "*"The Alert above forwards all error severity events from every Kustomization and HelmRelease to the Slack channel gitops.
For busy channels, filter out events that are too noisy:
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
name: discord-alerts
namespace: flux-system
spec:
providerRef:
name: discord
eventSeverity: info
eventSources:
- kind: Kustomization
name: "*"
exclusionList:
- "reason=ReconciliationSucceeded"
- "reason=ArtifactUpToDate"That way the Discord channel only receives events that are truly informative.
An Alert with eventSeverity: error like the example above catches failures. For success notifications, create a separate Alert with severity info and an exclusion list for noisy reasons.
Monitor GitRepository so the team knows when a new artifact is produced:
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
name: source-updates
namespace: flux-system
spec:
providerRef:
name: slack
eventSeverity: info
eventSources:
- kind: GitRepository
name: "*"
- kind: OCIRepository
name: "*"Health check failures from a Kustomization can be filtered specifically:
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
name: health-checks
namespace: flux-system
spec:
providerRef:
name: teams
eventSeverity: error
eventSources:
- kind: Kustomization
name: "*"
inclusionList:
- "reason=HealthCheckFailed"| Need | Severity | Source | Filter |
|---|---|---|---|
| Failures only | error | Kustomization, HelmRelease | no filter |
| Source updates | info | GitRepository, OCIRepository | exclusion for up-to-date |
| Health degradation | error | Kustomization | inclusion HealthCheckFailed |
| All important info | info | All | exclusion of noisy reasons |
Besides sending notifications out, FluxCD can also receive incoming events through a Receiver. A Receiver is useful for speeding up reconciliation: on a GitHub push, the webhook triggers Flux to sync immediately without waiting for the interval.
apiVersion: notification.toolkit.fluxcd.io/v1
kind: Receiver
metadata:
name: github-receiver
namespace: flux-system
spec:
type: github
events:
- ping
- push
secretRef:
name: receiver-token
resources:
- kind: GitRepository
name: "*"FluxCD supports many receiver types: github, gitlab, bitbucket, harbor, and generic. For the GitHub type, configure the webhook in the GitHub repository settings to point at the Receiver URL exposed by FluxCD.
Important
A Receiver requires a Secret containing the same token that is configured in GitHub, GitLab, or Bitbucket. Without a matching token, the webhook request will be rejected.
The default notification message is enough for many cases, but sometimes additional context is needed. Alerts support eventMetadata which attaches extra information to every event:
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
name: webhook-alerts
namespace: flux-system
spec:
providerRef:
name: webhook
eventSeverity: error
eventSources:
- kind: Kustomization
name: "*"
eventMetadata:
cluster: prod-eu
team: platformProviders of type webhook can receive a payload containing that metadata, so the receiving system can process it further, for example grouping alerts by cluster.
Tip
Start from a single Alert with severity error to the main channel, then add other Alerts gradually. Too many notifications will make the team immune to alarms — quality matters more than quantity.
Episode 14 explained how to make FluxCD talk to the team through targeted notifications.
The key takeaways:
In the next episode, episode 15, we enter a new phase: Progressive Delivery with Flagger — how to deploy a new version with minimal risk using canary, A/B testing, and blue-green automatically. See you!