Slack Notifications
Post Fleetera alerts straight into a Slack channel with a native Slack notification channel.
A Slack channel delivers alerts into one Slack channel as a formatted message. You supply a Slack incoming webhook URL; Fleetera builds the message itself. There is no relay to host, no payload to map, and no signature for you to verify.
You create one Slack channel per destination Slack channel, then attach it to the alerts you want it to deliver. A single channel can serve many alerts.
A webhook channel pointed at a relay or a Slack Workflow still works exactly as before. Use the native Slack type when you want alerts in Slack and nothing else; use a webhook channel when you need the raw signed payload for your own processing.
What a Slack channel needs
| Field | Required | Description |
|---|---|---|
| Name | Yes | A label to identify the channel. Naming it after its destination (for example, "#ops-alerts") keeps your routing rules readable. |
| Webhook URL | Yes | The Slack incoming webhook URL. Must be https://, on hooks.slack.com, under the /services/ path, and at most 512 characters. Paste it, or choose a provisioned secret that holds it. |
| Include resolve notifications | No | When enabled, the channel also receives a short recovery notice when an alert clears. When disabled, only triggered alerts are posted. |
Create the incoming webhook in Slack
Enable Incoming Webhooks on a Slack app
In your Slack workspace, create an app (or open an existing one) and turn on the Incoming Webhooks feature.
Add a webhook to the destination channel
Add a new webhook to the workspace and pick the channel the alerts should land in. Slack issues a URL of the form https://hooks.slack.com/services/T0000000/B0000000/…, tied to that one channel.
Copy the URL
Copy it before you leave the page. The URL is a bearer credential: anyone holding it can post to that Slack channel, so handle it like a password.
Add the channel in Fleetera
Slack channels are managed under Notifications → Channels. Choose Create channel, set the type to Slack, paste the webhook URL, and decide whether resolved notifications are included.
Fleetera checks the URL's shape before saving, so a typo or a look-alike host such as hooks.slack.com.example.net is rejected in the form rather than discovered on the first alert.
Fleetera stores the webhook URL encrypted and never returns it. Every later read shows only a masked form — https://hooks.slack.com/services/T024BE7LD/••• — enough to recognise the workspace, not enough to post. Keep your own copy if you need it elsewhere.
Channels can also be managed through the platform API:
POST /notification-channels
Content-Type: application/json{
"name": "#ops-alerts",
"type": "slack",
"config": {
"webhookUrl": "https://hooks.slack.com/services/T024BE7LD/B0ABC123/XxYyZz0123456789abcdef",
"includeResolved": true
}
}The response describes the created channel with the URL already masked:
{
"id": "0b8f2c1e-9d3a-4f57-bb20-2c6f0a1e4d9a",
"name": "#ops-alerts",
"type": "slack",
"config": {
"webhookUrlMasked": "https://hooks.slack.com/services/T024BE7LD/•••",
"includeResolved": true
},
"enabled": true,
"hasSecret": true,
"secretShownOnce": null,
"createdAt": "2026-06-10T09:30:00.000Z",
"updatedAt": "2026-06-10T09:30:00.000Z"
}Unlike a webhook channel, a Slack channel has no secretShownOnce to copy. Fleetera generates no secret of its own here — you supplied the credential, and hasSecret: true simply records that the channel is holding one.
Use a provisioned secret
Instead of pasting the webhook URL, a channel can use a secret that Fleetera staff provision for your organization. Contact Fleetera support to have the URL provisioned under a name, for example ops-slack. Nobody then pastes the URL into the channel dialog.
In the channel dialog, under Webhook URL, choose Provisioned secret and pick the name. The list shows only the secrets that fit this channel type. Paste stays the default. If none fits, the dialog says so, and you paste the URL instead.
- When Fleetera staff rotate the secret, later deliveries use the new URL. You do not edit the channel.
- The channels list shows the secret's name, for example
Provisioned: ops-slack, where a pasted URL shows its masked form. - To switch an existing channel, open Edit channel, choose Provisioned secret, pick the name, and choose Save changes. Saving discards the stored URL, so to switch back you choose Paste and enter a URL again.
Through the API, send secretRef in place of webhookUrl. Send one or the other, never both:
{
"name": "#ops-alerts",
"type": "slack",
"config": {
"secretRef": { "name": "ops-slack" },
"includeResolved": true
}
}A name that is not provisioned for your organization is refused with a 422 and the code secret_ref_not_found. A provisioned value that is not a Slack incoming webhook URL is refused with secret_ref_invalid. A channel that uses a provisioned secret reads back with "credentialSource": "reference" and config.secretRef, and with no masked URL.
What arrives in Slack
Fleetera posts one of three message shapes:
- A trigger. One card per alert: a severity colour bar with the severity spelled out in the header, the rule name, and fields for the asset, site, variable, and the measured value against its threshold. View alert opens the alert's page in Fleetera, and View rule opens the page of the rule that fired.
- A digest. When a rule fires on several assets inside its grouping window, the alerts arrive as one message that names the first ten assets and counts the rest, rather than ten separate posts. One message cannot point at one alert, so it offers View alerts, which opens the alerts list in Fleetera, and View rule.
- A recovery notice. Sent only when Include resolve notifications is on. One recovered asset gets a compact notice with View alert. A batch names each recovered asset the same way a digest does, with View alerts and View rule.
Rule, asset, and variable names come from your own data, so Fleetera escapes them before posting. A name containing Slack's own markup is shown as text and cannot turn into a link or a channel-wide mention.
Send a test message
Before you route real alerts through the channel, confirm it reaches Slack. Use Send test on the channel row, or the API:
POST /notification-channels/{channelId}/testFleetera posts a clearly-marked synthetic alert — the rule is named Fleetera Slack test on a test_signal variable — so nobody in the channel mistakes it for a real incident. The response reports the outcome:
{
"delivered": true,
"deliveryId": "a1b2c3d4-e5f6-4711-89ab-0123456789ab",
"status": "sent",
"httpStatus": 200,
"attempts": 1,
"error": null
}A test send is one-shot: unlike a real alert delivery, a test that fails is not retried. Fix the problem and send another test.
Reading the delivery log
Each channel's detail page lists its recent deliveries with the time, the alert (or Test send), the status, the number of attempts, and a details column. A test send is recorded there alongside real deliveries.
| Status | Meaning |
|---|---|
sent | Slack accepted the message. |
pending | An attempt failed transiently and a retry is scheduled. |
failed | Delivery was abandoned — either a permanent error, or the retry budget ran out. |
skipped | Nothing was sent, and the row records why (for example, an alert resolved on a channel that does not include resolved notifications). |
When a delivery does not succeed, the details column carries the reason: the HTTP status, plus Slack's own error token in parentheses when it returned one — for example, http 404 (channel_not_found). The webhook URL never appears in the delivery log.
| Error | What it means | What to do |
|---|---|---|
channel_not_found | The destination channel was deleted, or the app was removed from it. | Create a new incoming webhook on a live channel and replace the URL. |
channel_is_archived | The destination channel is archived. | Unarchive it, or point the channel somewhere else. |
invalid_token, no_service | The webhook was revoked or deleted in Slack. | Create a new incoming webhook and replace the URL. |
action_prohibited, posting_to_general_channel_denied | Workspace policy blocks the app from posting to that channel. | Ask a Slack workspace admin to allow it, or use a different channel. |
invalid_payload | Slack rejected the message body. | Nothing to configure — report it to Fleetera support with the delivery ID. |
http 429 | Slack is rate-limiting the webhook. | Nothing to do; Fleetera backs off and retries. |
http 5xx, network error | Slack was unreachable or erroring. | Nothing to do; Fleetera retries. |
Retries
A transient failure — a 429, a 5xx, or a network error — is retried up to 5 attempts in total, with exponential backoff and jitter running from about 30 seconds out to about 8 minutes. When Slack sends a Retry-After header, Fleetera waits for the interval Slack asked for, bounded to between 1 second and 15 minutes so a single response cannot park a delivery indefinitely.
Every other 4xx, and each of the error tokens listed above, is treated as permanent: the message is not retried and the delivery is marked failed. These describe a fact about the channel or the app that another attempt cannot change.
Two operator actions also stop a retry that is already in flight: disabling the channel, and switching Include resolve notifications off while a recovery notice is waiting to be retried.
Updating, rotating, and removing a channel
You can rename a channel, toggle resolved notifications, and enable or disable it at any time. A channel's type cannot be changed — to move a destination to a different channel type, create a new channel.
To rotate the credential, create a fresh incoming webhook in Slack, then choose Replace next to the masked URL and paste the new one. Leaving the masked value in place keeps the stored URL, so you can change a channel's name or its resolved-notification setting without touching the credential. A channel that uses a provisioned secret is rotated by Fleetera staff, with no edit to the channel.
Disabling a channel stops both new deliveries and any retries already in flight, which makes it the fastest way to mute a noisy destination without losing its configuration.