> ## Documentation Index
> Fetch the complete documentation index at: https://help.pipelime.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect Slack alerts

> Send a rich alert into a Slack channel when a lead becomes an opportunity, books a meeting or converts.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

Connect a Slack channel with an Incoming Webhook so we post an alert there when a lead becomes an opportunity, books a meeting or converts.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Integrations<span className="pl-path__sep">→</span>Integrations<span className="pl-path__sep">→</span>Apps & CRM</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Read access to Apps & CRM <code>read-integrations</code>. Admin, Member and Viewer have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-integrations</code> to add one, <code>update-integrations</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* A Slack workspace where you can add the Incoming Webhooks app to a channel.
* Nothing to set up on our side. The webhook URL is your own credential, so this connects the same way on every workspace, including a partner-branded one, and the alerts we post are signed with that workspace's own brand name.

## Steps

<Steps>
  <Step title="Open the Slack connect dialog">
    Go to <UiPath>Integrations → Integrations → Apps & CRM</UiPath>, choose **Add integration**, then choose **Slack** from the list. That menu item's own label and description are English only, whatever language the rest of your sidebar is in.

    <Screenshot id="integrations/connect-slack--dialog" frame="bare" alt="The Connect Slack dialog: an intro sentence, a highlighted panel titled Create an Incoming Webhook in Slack with four numbered steps and a link to Slack's own guide, an empty Webhook URL field, and an optional Label field underneath" caption="Every string in this dialog is English only, except its Cancel and Done buttons, which reuse the product's shared button labels." marks={[{ n: 1, x: 50, y: 36 }, { n: 2, x: 50, y: 76 }]} />

    The panel (1) walks through Slack's own settings, covered in the next step. The field to paste the result into (2) is underneath it.
  </Step>

  <Step title="Create an Incoming Webhook in Slack">
    The panel's four instructions point at Slack's own settings:

    1. In Slack, click your workspace name (top-left), then "Tools & settings", then "Manage apps".
    2. In the App Directory that opens, search "Incoming Webhooks" and click "Add to Slack".
    3. Pick the channel that should receive alerts, then copy the Webhook URL. It starts with `https://hooks.slack.com/services/`.
    4. Paste it below, and we send a test message to confirm it works.

    A link to Slack's own Incoming Webhooks guide sits underneath, for whichever of those steps looks different on your screen.
  </Step>

  <Step title="Paste the webhook URL and connect">
    Paste it into **Webhook URL**. **Label (optional)** is free text: give it one and the name under the card's logo picks it up, useful once you connect a second channel; leave it blank and a new connector is simply called **Slack**. The card's own heading always reads **Slack** either way.

    Choose **Connect Slack**. A real test message goes to that channel before anything is saved. If Slack accepts it, the dialog switches to a **Slack is connected** screen telling you to check the channel. If Slack refuses it, nothing is saved (see Troubleshooting).

    <Note>
      Saving the same webhook URL again updates this same connector and keeps whatever auto-push settings you already set on it. Pasting a different URL creates a second Slack connector instead, so you can post to more than one channel from the same workspace.
    </Note>
  </Step>
</Steps>

## What happens next

<Check>
  The dialog shows **Slack is connected**. Choose **Done**, and the Slack card on <UiPath>Integrations → Integrations → Apps & CRM</UiPath> shows a **Connected** chip, with **Auto-push analyzed leads** already switched on underneath.
</Check>

Slack is the only connector that ships with auto-push already on, filtered to **Opportunity**, **Meeting Scheduled** and **Converted**. Every other connector starts off, with no stage filter, until you turn it on yourself. See [Auto-push analyzed leads and stage filters](/en/integrations/auto-push-and-stage-filters) for exactly what that switch does, the two moments that trigger a push, and every reason a push can be silently skipped.

<Screenshot id="integrations/connect-slack--card-defaults" url="/integrations" alt="The connected Slack card on the Apps & CRM grid: the Auto-push analyzed leads switch on, and the Opportunity, Meeting Scheduled and Converted stage chips filled solid while Untouched and Contacted stay outlined" caption="Nobody has to turn this on. It's what a freshly connected Slack channel starts with, and the only connector that does." />

Turning that switch off, or changing which stages are ticked, needs the `update-integrations` permission, which is a different one from the permission that let you connect it. Without it, the whole switch-and-chips block disappears from the card, though the connector still shows as connected.

Slack never creates a record anywhere and never claims a lead the way HubSpot, Salesforce, Odoo, Kommo or HeyReach do, so connecting it never blocks a real CRM from receiving the same lead afterwards, and a real CRM connected later can still push it.

Once a lead reaches a stage the connector is watching, the alert carries a colored bar and a headline for that stage:

| Stage             | Headline in the alert | Color  |
| ----------------- | --------------------- | ------ |
| Untouched         | New lead              | Gray   |
| Contacted         | Lead contacted        | Amber  |
| Opportunity       | New opportunity       | Blue   |
| Meeting Scheduled | Meeting booked        | Purple |
| Converted         | Lead converted        | Green  |
| Closed            | Lead closed           | Red    |

Under the headline comes the lead's name, then their job title and company, then a muted line carrying the company's industry, its size and the lead's location where we have them. A score bar follows when a message on that lead has been scored, labeled "Lead score" in the alert. Below a divider sits one contact line combining whichever of the lead's email, phone, LinkedIn and website are on file, and under it the most recent genuine reply, quoted and trimmed if it runs long (a warm-up message never counts as a reply). A meeting scheduled alert adds the meeting time in UTC, and a link to join when the meeting has one. The alert ends with a button that opens the lead in the app, plus a second button that starts an email to the lead when we have an address for them.

<Screenshot id="integrations/connect-slack--message" frame="bare" alt="A Slack message for a lead that just became an opportunity: a blue rail down the left edge, the headline New opportunity, the lead's name, job title and company, a muted line with industry, company size and location, a Lead score bar, a contact line with email, phone, LinkedIn and website links, and two buttons, one opening the lead in the app and one starting an email to them" caption="A representative example built from the message-assembly code, not a capture: nothing in the product previews this before a webhook exists to send it to." />

## Troubleshooting

<AccordionGroup>
  <Accordion title="'That doesn't look like a Slack webhook'">
    The dialog checks the URL itself before sending anything anywhere, so nothing reached Slack yet. Copy the URL straight from Slack's Incoming Webhooks page; a real one always starts with `https://hooks.slack.com/services/`. With the field left empty the **Connect Slack** button stays greyed out instead, and pressing Enter in either field answers "Webhook URL is required".
  </Accordion>

  <Accordion title="'Could not post to that Slack webhook…'">
    The full message reads: "Could not post to that Slack webhook. Double-check the URL and that the app still has permission to post to the channel." The URL had the right shape, but the test post sent before anything is saved was refused by Slack itself. The usual cause is that the Incoming Webhooks app was removed from the channel, or the channel was archived or deleted. Reconnect with a fresh URL from Slack's Incoming Webhooks page.
  </Accordion>

  <Accordion title="Connected, but no alerts arrive">
    Connecting only makes Slack available as a destination. A push happens when a lead finishes its analysis, or when an already analyzed lead changes stage into one the filter allows. A lead that was already sitting in a matching stage before you connected, with nothing changing since, produces nothing. Check that **Auto-push analyzed leads** is still on for the card; the switch and its stage filter can be changed by anyone with permission. See [Auto-push analyzed leads and stage filters](/en/integrations/auto-push-and-stage-filters) for every other reason a push can be silently skipped.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Auto-push analyzed leads and stage filters" icon="send" href="/en/integrations/auto-push-and-stage-filters">
    What triggers an automatic push, which stages it fires on, and every reason a lead is silently skipped.
  </Card>

  <Card title="Apps & CRM overview" icon="layout-grid" href="/en/integrations/overview">
    Every connector you can add, the three shapes a connection takes, and what a card tells you once it's connected.
  </Card>

  <Card title="CRM and integration blocks" icon="workflow" href="/en/workflows/crm-and-integration-blocks">
    Push a lead to your CRM, post to Slack or call any endpoint, as a step inside a flow.
  </Card>
</CardGroup>
