← Node guide
Report & notify

Send to Slack

Posts the run's result into a Slack channel.

notify.slack
The piece

Post the run's result to a Slack channel.

Reach for it when

  • A team channel that should hear when the nightly run goes red.
  • Telling whoever pushed the commit that their build does not launch.
Send to Slack
Idle
In the bag

Every setting this block has. A field marked only when appears once you have chosen the mode above it — those are alternatives to each other, not extra things to fill in.

  • Send via
    starts at Incoming webhook URL

    A webhook is one URL and one channel, with nothing to authorise — but it can only post text. A bot token posts to any channel it's in and can upload the screenshot.

    Incoming webhook URLBot token
  • Webhook URLRequired
    write-only

    Slack → your app → Incoming Webhooks. Anyone holding it can post as that app.

    only when Send via = Incoming webhook URL

    How to get it ↓
  • Bot tokenRequired
    write-only

    A xoxb- token with chat:write (and files:write if you attach anything).

    only when Send via = Bot token

    How to get it ↓
  • ChannelRequired
    starts at #qa-alerts

    Channel or @user. The bot must be a member of a private channel.

    only when Send via = Bot token

  • MessageRequired
    starts at Run failed on {{ $Device Manual Trigger.json.device }}

    Supports {{ }} references to earlier steps, e.g. {{ $Device Info.json.model }} or {{ $Find in Text.json.first }}.

  • Attach the last screenshot
    starts at on

    The screen as it was at the last step — usually the whole explanation.

    only when Send via = Bot token

  • Attach files made by this run
    starts at off

    Anything a Convert to File step produced — a CSV of the UI dump, a log capture.

    only when Send via = Bot token

  • Only if a step has failed
    starts at off

    Skip the message when every step before this one passed. This is what a nightly regression wants: silence is the good outcome.

Get your keys

What to click on the other service's side to get the values this block asks for. Paste each one in, then use “Save as credential” so it is encrypted and kept out of the workflow.

Slack incoming webhook URL

only when Send via = Incoming webhook URL

api.slack.com/apps ↗

You need: Permission to install apps in the workspace (on many workspaces that needs an admin's approval).

  1. Open the Slack apps page, click “Create New App” → “From scratch”, name it (e.g. Remopipe) and pick the workspace it should post to.
  2. In the app's left menu, open “Incoming Webhooks” and switch “Activate Incoming Webhooks” on.
  3. Scroll down and click “Add New Webhook” (older workspaces: “Add New Webhook to Workspace”).
  4. Choose the channel the messages should go to and click “Allow”.
  5. Back on the Incoming Webhooks page, the new row has a “Copy” button — paste that URL into Webhook URL.
Looks like
https://hooks.slack.com/services/T0…/B0…/XXXXXXXXXXXXXXXXXXXXXXXX
Incoming Webhooks, switched on
Fig. 1Incoming Webhooks, switched on
The webhook URL and its channel, with a Copy button
Fig. 2The webhook URL and its channel, with a Copy button
  • The channel is fixed by the URL. To post somewhere else, add another webhook — there is no channel field in this mode because Slack would ignore it.
  • Webhooks post text only. For screenshots and files, use the bot token below instead.

Slack bot token

only when Send via = Bot token

api.slack.com/apps ↗

You need: Permission to install apps in the workspace (on many workspaces that needs an admin's approval).

  1. Open the Slack apps page, click “Create New App” → “From scratch”, name it (e.g. Remopipe) and pick the workspace it should post to.
  2. In the left menu, open “OAuth & Permissions”, scroll to “Scopes” → “Bot Token Scopes” and click “Add OAuth scope” for each scope below.
  3. Scroll back to the top of the same page and click “Install to Workspace” (or “Request to Install” if an admin has to approve), then “Allow”.
  4. Copy the “Bot User OAuth Token” that now appears at the top of the page and paste it into Bot token.
  5. In Slack, open the channel and type /invite @Remopipe (your app's name) so the bot is a member.
  6. Put the channel into Channel as #qa-alerts, or its ID (C0…, from the channel's name → “About”) if it may be renamed.
Permissions
  • chat:write
  • files:writeonly if you attach screenshots or files
  • chat:write.publicoptional: post to public channels without inviting
Looks like
xoxb-1234567890-1234567890123-AbCdEfGhIjKlMnOpQrStUvWx
Bot Token Scopes — chat:write and files:write are the two this block needs; the others here come from other features of the same app
Fig. 1Bot Token Scopes — chat:write and files:write are the two this block needs; the others here come from other features of the same app
OAuth & Permissions → OAuth Tokens → Bot User OAuth Token
Fig. 2OAuth & Permissions → OAuth Tokens → Bot User OAuth Token
  • Added a scope later? Slack asks you to reinstall the app, and the token stays the same — but the new scope does nothing until you do.
  • A private channel always needs the /invite, whatever the scopes say.
  • Use the Bot User OAuth Token (xoxb-), not the User OAuth Token (xoxp-): a user token posts as you, and stops working when you leave.
Build it
  1. Choose how it posts: a webhook, or a bot

    A webhook is one URL and one channel with nothing to authorise — but it can only post text. A bot token posts to any channel it is in, and it can upload the screenshot. That choice is the whole difference between the two forms.

    Send to SlackSettings
    Send viaThe one that can attach
    Bot token
    Bot tokenxoxb- with chat:write
    write-only
    ChannelRequired
    #qa-alerts
  2. Write the message

    Reference earlier steps with {{ }} — the device it failed on, the line a log search found. A message that names the phone is a message somebody can act on.

    #qa-alertsSlack
    remopipeAPP

    Checkout failed on Pixel 8 (Android 14). Cart showed 2 items, expected 3.

    screenshot.png
  3. Decide when it should speak

    Turn on “Only if a step has failed” for anything unattended. A nightly run that messages you every morning is a run you stop reading; silence should be the good outcome.

    Send to SlackSettings
    Attach the last screenshotBot token only
    on
    Attach files made by this run
    off
    Only if a step has failed
    on
What comes out
  • Nothing the next step needs — it reports and carries on.
Watch out
  • In webhook mode the attachment switches are not hidden defaults, they are absent: Slack's incoming webhooks have no upload endpoint at all.
  • A bot has to be a member of a private channel before it can post there.
  • Uploaded files land in the message’s own thread, not the channel root — six screenshots from six devices in the channel is a channel nobody reads twice.
  • Use “Save as credential” rather than typing it in: a typed secret is stored with the workflow, so publishing or sharing the workflow shares the secret too.
Usually next to