---
title: "Send alerts to Slack, Teams, or Discord"
description: "Create a chat integration on the Integrations page from a webhook URL you generate in Microsoft Teams, Discord or Slack, name it, send it a test event, then attach it to the Integrations column of the event rules on each machine that should reach that channel."
category: "Send alerts elsewhere"
source_url: "https://www.iotflows.com/docs/alerts/chat-integrations/"
---
# Send alerts to Slack, Teams, or Discord

Post IoTFlows alerts into the channel your team already watches.

An *integration* is a named destination your organization creates once and reuses on any machine. Each one holds a *webhook URL*, an address the chat platform gives you that posts a message into one channel when something sends to it. IoTFlows does not sign in to Slack, Teams or Discord: you generate the URL there, paste it here, and IoTFlows posts to it.

**Prerequisites.** Owner or Administrator, see [Roles and permissions](/docs/admin/roles-reference/). Every other role sees **Integrations** in the navigation dimmed and unclickable, with the tooltip **You must be an Organization Owner or Administrator to access Integrations**. You also need permission to create a webhook in the chat platform itself, which is a separate permission held by that platform.

## How chat integrations work
Open **Integrations** in the navigation, at `/integrations`. The page lists every integration the organization has, sorted by name, each card carrying the platform's icon, the name, who created it and when, and an **Enabled** or **Disabled** chip.

One integration is one destination channel, not one machine. Create **Production line alerts** once, then attach it to the **Machine Down** rule on all twelve presses. Attaching is per event type and per machine, and it is done in the machine's own notification settings rather than here, see [Attach the integration to an event rule](#attach).

Send alerts to the channel the shift already reads, not to a new `#alerts` channel. A dedicated alerts channel is muted within a week. You do not need one integration per machine, and you do not need an integration at all if email and push already reach the right people, see [Overview: alerts and integrations](/docs/alerts/overview/).

![The Integrations page at full width, headed Integrations over Connect IoTFlows with the tools your team already uses, with a blue round plus button at the top right, a Search integrations field below it, and three integration cards. Each card shows a platform icon, a name, a created-on line with the author's avatar, and a status chip. The third card's chip reads Disabled](/images/alerts/alr-int-01.webp)

*The Integrations page. Non-admins see the nav item dimmed and unclickable.*

Click the blue **+** button at the top right to open **New Integration**. The first step is **Choose a platform**, one tile per platform under an **Alerts** heading. Choosing a tile opens the setup step, which carries that platform's instructions inline. The three sections below mirror them so you can read them before you start.

## Create a Microsoft Teams integration
Teams has no plain incoming webhook any more. The URL comes from a Power Automate workflow attached to the channel.

1. In Teams, open the channel where you want messages posted.
2. Click the channel's **⋯** menu, then choose **Workflows**.
3. Select **Send webhook alerts to a channel**. Use **Send webhook alerts to a chat** instead if you want messages in a 1:1 or group chat.
4. Sign in to both Teams and Power Automate when prompted, then click **Next**.
5. Confirm the team and channel, then click **Add workflow**.
6. Copy the generated workflow URL and paste it into **Webhook URL** in IoTFlows.

You need to be a team member with permission to create Workflows in the channel. If **Workflows** is missing from the **⋯** menu, ask a team owner to grant access or to create the workflow and send you the URL.

![The New Integration modal on its second step, headed Connect Microsoft Teams, showing a blue Admin permission may be required note, six numbered setup steps ending in copying the generated workflow URL, an Official docs link at the top right of the panel, and the Webhook URL field below it](/images/alerts/alr-int-02.webp)

*The in-product Microsoft Teams setup instructions.*

## Create a Discord integration
1. In Discord, find the channel that should receive messages.
2. Hover the channel name and click the **Edit Channel** gear icon, or right-click the channel and choose **Edit Channel**.
3. In the sidebar, choose **Integrations**.
4. Click **Webhooks**, then **New Webhook**.
5. Rename the webhook or set an avatar if you want. The channel is already set to this one.
6. Click **Copy Webhook URL** and paste it into **Webhook URL** in IoTFlows.

You need the **Manage Webhooks** permission in that channel, which is usually granted to admins or to specific roles. If **Integrations** does not appear in **Edit Channel**, you do not have it: ask a server admin to add the webhook or to grant your role access.

Discord rate-limits each webhook to 30 messages per minute. A single integration attached to a hundred machines can pass that during a plant-wide outage, and the messages over the limit are dropped by Discord rather than queued.

![The New Integration modal on its second step, headed Connect Discord, with six numbered setup steps from Edit Channel through Copy Webhook URL and a closing italic tip reading that the URL should be kept private and that Discord rate-limits to 30 messages per minute per webhook](/images/alerts/alr-int-03.webp)

*The Discord setup instructions, including its 30-messages-per-minute webhook limit.*

## Create a Slack integration
Slack issues incoming webhooks from an app, so you create a small app in your workspace first.

1. Go to `https://api.slack.com/apps` and click **Create New App**, then **From scratch**.
2. Name the app, pick your workspace, then click **Create App**.
3. In the sidebar, open **Incoming Webhooks** and toggle **Activate Incoming Webhooks** to On.
4. Click **Add New Webhook to Workspace**.
5. Select the channel that should receive messages, then click **Allow**.
6. Copy the new webhook URL, which starts with `https://hooks.slack.com/services/`, and paste it into **Webhook URL** in IoTFlows.

For a private channel, join the channel before step 5. Slack does not list a channel you are not in, so the authorization screen looks as though the channel does not exist.

Your workspace may restrict who can install apps. An approval-required message after **Create App** means a workspace admin has to approve the request before you can activate the webhook.

![The New Integration modal on its second step, headed Connect Slack, with six numbered setup steps from Create New App through copying a URL beginning https://hooks.slack.com/services/, and a closing italic tip reading that private channels must be joined first or Slack will not list them during authorization](/images/alerts/alr-int-04.webp)

*The Slack setup instructions. For a private channel, join it before authorizing.*

### Platforms
| Platform | Webhook created in | You need | Rate limit | Gotcha |
|---|---|---|---|---|
| **Microsoft Teams** | The channel's **⋯** menu, under **Workflows**, which runs on Power Automate | Permission to create Workflows in that channel | None stated in IoTFlows | Pick **Send webhook alerts to a channel**, not the chat variant, unless you want a 1:1 |
| **Discord** | **Edit Channel** → **Integrations** → **Webhooks** | The **Manage Webhooks** permission in that channel | 30 messages per minute, per webhook | A missing **Integrations** item in **Edit Channel** means you lack the permission |
| **Slack** | An app at `api.slack.com/apps`, under **Incoming Webhooks** | Permission to install apps in the workspace, which many workspaces gate behind admin approval | None stated in IoTFlows | Slack will not list a private channel unless you joined it first |

Every row shares one gotcha: the webhook URL is the only secret involved. Anyone holding it can post into that channel as your integration, so treat it the way you treat a password, and do not paste it into a ticket or a chat message.

## Name the integration
The name field sits above the setup instructions, so you can fill it before or after you fetch the URL. Neither field has a default and **Create Integration** stays disabled until both carry a value.

1. Type a name in **Integration name**. The placeholder reads `e.g. Production line alerts`.
2. Paste the URL into **Webhook URL**, whose placeholder reads `https://...`.
3. Click **Create Integration**, or press Cmd+Enter on a Mac or Ctrl+Enter elsewhere.

Name the integration after the channel it posts to, not after the machines that use it: `#line-2-floor` survives a machine being sold, `Press 4 alerts` does not. The new integration appears at the top of the list and a toast reads **Integration created**.

![A cropped detail of the New Integration modal showing two fields. Callout 1 marks the Integration name field holding Production line alerts, callout 2 marks the Webhook URL field below it holding a redacted https URL behind a link icon](/images/alerts/alr-int-05.webp)

*The integration name and its webhook URL. Treat the URL as a secret.*

## Send a test event
Test before you attach the integration to anything. A wrong URL fails silently at alert time, and nobody notices for a week.

1. Click the integration's card to expand it.
2. Click **Test integration**. The button reads **Sending...** while it runs.
3. A toast reads **Test event sent**. Now check the channel.

**Test event sent** means IoTFlows reached the URL, not that the message arrived. If the toast succeeds and nothing appears in the channel, the webhook was revoked at the platform end: the Teams workflow was turned off, the Discord webhook was deleted, or the Slack app was uninstalled. Create a new webhook there and paste the new URL in, see [Rename or change the URL](#edit).

![The Integrations page with one card expanded, showing its Name and Webhook URL fields, an Enabled toggle switched on, and an action row carrying Delete Webhook on the left and Test integration and Save changes on the right. A violet highlight marks Test integration, and a Test event sent toast sits over the header above](/images/alerts/alr-int-06.webp)

*Sending a test event before you rely on it.*

## Attach the integration to an event rule
Creating an integration sends nothing on its own. Every message comes from an event rule on a machine that has this integration attached to it.

1. Open the machine and click the bell in its header, labeled **Event Notifications**.
2. Find the row for the event type, such as **Machine Down**.
3. Click the cell in the **Integrations** column, on the right, under the **Webhooks** sub-label.
4. Click the integration in the list. Search by name in **Search integrations...** if the list is long.

The cell writes immediately and confirms with **Production line alerts connected**, using the integration's name. Click it again to detach, which confirms with **Production line alerts disconnected**. An attached integration shows as an icon in the cell, up to three, then a `+2` chip. Full rule detail is on [Set alert rules for a machine](/docs/alerts/asset-event-rules/#integrations).

![The right end of the Event Notifications modal, showing the LOG, WORK ORDER and INTEGRATIONS column headers over the Machine Down warning row, whose Integrations cell now carries a Discord icon. The dropdown the cell opened lists three integrations with their platform icons above a Search integrations field, the first checked and marked with a violet highlight, the third tagged Disabled and dimmed](/images/alerts/alr-int-07.webp)

*Attaching an integration to an event rule, from the machine's notification settings.*

A machine with no integrations in the organization shows **No integrations yet** in that dropdown, with a **Create integration** link back to this page.

## Rename or change the URL
Both fields are editable on the card, and both save together.

1. Click the card to expand it.
2. Edit **Name**, **Webhook URL**, or both.
3. Click **Save changes**. The button stays disabled until something changes.

A toast reads **Integration updated**. Changing the URL keeps every attachment: the rules pointing at this integration now post to the new channel, with nothing to redo on any machine. That makes an edit the right move when a channel is renamed or a webhook is rotated, and a new integration the wrong one.

## Enable, disable or delete
The same expanded card carries an **Enabled** toggle, described as **Allow this integration to receive events**.

Disable rather than delete when you want the destination back. A disabled integration stays attached to every rule and stops posting, and it still appears in the per-event dropdown, dimmed and tagged **Disabled**, so a rule that looks configured sends nothing. Turn it back on and the same rules resume.

Delete when the channel is gone for good. Click **Delete Webhook** on the expanded card and confirm in **Delete Integration**, which warns that the action cannot be undone and that the webhook URL stops receiving events immediately. Deleting removes the integration from every rule that used it, and the rules themselves stay switched on with nothing in the **Integrations** column.

Quiet a noisy channel for a night by disabling the integration, not by deleting it. Deleting loses which machines were attached, and nothing records the list.

## Errors
| Message | Cause | Do this |
|---|---|---|
| **Failed to create integration** | The integration was not created. Nothing was saved | Check the URL is complete and starts with `https://`, then retry |
| **Failed to update integration** | A name, URL or enabled change did not save. The card keeps your typed values | Retry, then collapse and reopen the card to see what actually saved |
| **Failed to delete integration** | The integration is still there | Retry. Refresh the page before deciding it failed |
| **Failed to send test event** | IoTFlows could not reach the webhook URL | Confirm the webhook still exists in the platform and that the URL is pasted whole |
| **Failed to update integrations** | Attaching or detaching on a machine's rule failed. The cell reverts | Retry. Confirm the integration still exists on this page |
| **Test event sent**, but nothing in the channel | The URL is valid in shape and revoked at the platform end | Create a new webhook in Teams, Discord or Slack and paste the new URL in |

A generic **Something went wrong** or **An error occurred** means the request failed and the change was not saved. Retry it, and if it keeps failing see [Troubleshoot alerts you did not receive](/docs/alerts/troubleshoot-alerts/).

## See also
- [Set alert rules for a machine](/docs/alerts/asset-event-rules/)
- [Send events to your own endpoint](/docs/alerts/webhooks/)
- [Troubleshoot alerts you did not receive](/docs/alerts/troubleshoot-alerts/)
- [Roles and permissions](/docs/admin/roles-reference/)
