notifly
IntegrationsChat providerUpdated Markdown version

Reach your users in Slack, from the same Notifly workflow.

There are two ways to connect Slack. The quicker one is the Notifly Slack app: add it to your workspace with Add to Slack and connect the workspace to a Notifly environment, with no Slack app of your own to create. Workflow chat steps then post as the Notifly bot, as a direct message to the person who connected it. To post in a public channel, add a Slack channel on the subscriber's Credentials tab in the dashboard, or register it through the channel endpoints API.

Or you bring your own Slack app. Your users install it into their workspace through a Notifly connect link, and the chat steps of your workflows post as your app: to the user who connected, to a channel, or to an incoming webhook. The rest of this page is the guide for your own app.

Notifly keeps the OAuth exchange, the workspace tokens and the user links, so your backend only triggers workflows. The same trigger can also reach in-app, email, SMS and push, with digest, delay and throttle steps and subscriber preferences checked before each send.

Add to Slack

The Notifly Slack app

Add Notifly to your Slack workspace to receive the notifications your Notifly workflows send, without creating a Slack app of your own. Workflow chat steps post as the Notifly bot, as a direct message to the person who connected the workspace. To post in a public channel, open the subscriber in the dashboard, go to its Credentials tab and add a Slack channel, with the channel's ID, to the Notifly Slack credentials; the channel endpoints API does the same. A subscriber with both a channel and a direct-message link gets the message in both places.

  1. Add to Slack. Choose Add to Slack above and approve the install in your workspace.
  2. Connect it to your Notifly account. Slack sends you to Notifly, where you sign in or sign up, check the Notifly environment it will connect to (the one selected in your dashboard), and confirm the workspace. Nothing is connected until you do.
  3. Send. Add a Chat step to a workflow and trigger it for your own Notifly user (the subscriber ID of the account that connected the workspace). The message arrives in Slack as a direct message from the Notifly bot.

The app asks for two permissions only: chat:write to post messages and chat:write.public to post to public channels it has not joined. It cannot read your messages, channels or members. Removing the app from Slack deletes the connection Notifly stored for your workspace. Messages sent through the Notifly Slack app count toward a limit of 300 per month for each Notifly environment; after that, sends through it fail until the next month. Connect your own Slack app to send more.

Read the privacy policy for how data is handled, or contact support.

What you need from your own Slack app

These are the fields the dashboard asks for when you connect Slack, quoted from the create form.

FieldRequiredStoredNotes
App IDRequiredAs entered
Client IDRequiredAs entered
Client SecretRequiredEncrypted at rest
Signing SecretRequiredEncrypted at restSlack app Signing Secret, used for verifying inbound webhook requests
Redirect URLOptionalAs enteredRedirect after Slack OAuth flow finished (left empty, Notifly shows a confirmation page telling the user they can close the tab)
  • Redirect URL in Slack. Add https://api.notifly.io/v1/integrations/chat/oauth/callback to your Slack app's OAuth redirect URLs. Slack returns users there; Notifly finishes the install and stores the workspace connection.
  • Redirect URL in Notifly. Optional: where your user lands after that. Left empty, Notifly shows its own confirmation page telling them they can close the tab.
  • Signing Secret. Used to verify requests Slack sends back to Notifly.

Connect Slack in the dashboard

  1. Sign in at app.notifly.io, open Integration Store in the sidebar and choose Connect Provider.
  2. In the Connect Integration sheet, open the Chat tab (or search across channels), find Slack and choose Connect.
  3. Pick the environment the integration belongs to. Development and Production keep separate integrations, so you can point each at a different Slack account or key.
  4. Fill in Delivery Provider Credentials with the fields in the table above, then choose Create Integration.

Connect a user, then trigger

A user connects once; after that a trigger only names the subscriber, and Notifly works out where in Slack the message goes.

Node.js · @notiflyio/api@0.1.26
// npm install @notiflyio/api@0.1.26
import { Notifly } from "@notiflyio/api";

const notifly = new Notifly({ security: { secretKey: process.env.NOTIFLY_SECRET_KEY } });

// 1. Create a connect link for the signed-in user (valid for 5 minutes).
const { result } = await notifly.integrations.generateConnectOAuthUrl({
  integrationIdentifier: "slack-workspace", // the Identifier of your Slack integration
  subscriberId: "user_123",
  autoLinkUser: true, // also link the Slack user who approves the install
});
// Redirect the user to result.url and let them approve your app in Slack.

// 2. From then on, workflows with a chat step reach them in Slack.
await notifly.trigger({
  workflowId: "deploy-finished",
  to: "user_123",
  payload: { service: "billing-api", status: "succeeded" },
});

Prefer plain HTTP? The same trigger is POST https://api.notifly.io/v1/events/trigger with an Authorization: ApiKey header and a body of { "name", "to", "payload" }.

What reaches Slack

  • A user or a channel. Sent with chat.postMessage and the bot token from the workspace connection, to the linked Slack user or to a channel.
  • Or an incoming webhook. Posted to the subscriber's webhook URL after a safety check on the address; Slack's ok reply is the only success.
  • Your message options. overrides.providers.slack is merged in, converted to snake_case.
  • Slack's answer. A refusal fails the step with Slack's own error code, recorded in the activity feed.

Choosing between the webhook and the bot, with a Node and cURL sample for each: send Slack notifications from your app.

Pairing Slack with an email or push provider in one workflow: Mailgun and Slack or Firebase and Slack.

What Notifly adds on top of Slack

Workflows around the send

One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps.

Digest notifications →

Subscriber preferences, enforced at send

Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded.

An in-app Inbox next to it

The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK.

React notification inbox →

Per-trigger provider parameters

Anything the trigger passes under overrides.providers.<provider id> is merged into the request Notifly sends to the provider, per workflow or per step.

Activity you can debug

Every message gets execution details in the activity feed, including the response or error the provider returned.

Secrets encrypted at rest

API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers.

Go deeper in the docs

Frequently asked questions

Do I need my own Slack app?

No. Add the Notifly Slack app to your workspace with the Add to Slack button at the top of this page, then connect the workspace to the Notifly environment currently selected in your dashboard (the confirmation page names it). Workflow chat steps post as the Notifly bot, as a direct message to the person who connected it, so trigger the workflow for that person's own Notifly user. To post in a public channel, add a Slack channel on the subscriber's Credentials tab in the dashboard (it asks for the channel's ID), or register it through the channel endpoints API; the app can post in public channels without being invited. A subscriber with both a channel and a direct-message link gets the message in both places. Messages sent through the Notifly Slack app count toward a limit of 300 per month for each Notifly environment, and after that sends through it fail until the next month; messages sent through your own Slack app do not. Bring your own Slack app when you want messages posted under your app's name and icon, more than that limit, or Slack connected for each of your own users: that is the setup the rest of this page documents.

What do I need from my own Slack app?

Its App ID, Client ID, Client Secret and Signing Secret, from the app's Basic Information page; the Client Secret and Signing Secret are stored encrypted at rest. In the app's OAuth settings, add https://api.notifly.io/v1/integrations/chat/oauth/callback as a Redirect URL, because that is where Slack sends users back after they approve the install. A connect link you create for your app stays valid for five minutes: its state parameter is signed and time-stamped, so Notifly refuses an expired or altered link; create it when the user clicks Connect, not ahead of time.

Which Slack scopes does Notifly ask for?

The Notifly Slack app asks for chat:write and chat:write.public only. With your own Slack app, the install by default asks for the bot scopes chat:write, chat:write.public, channels:read, groups:read, users:read and users:read.email; pass scope when you create the link to ask for a different list. Linking a user to an existing workspace connection asks only for the identity.basic user scope.

Can Notifly post to a Slack incoming webhook instead?

Yes. Save the webhook URL on the subscriber with subscribers.credentials.update, providerId slack and credentials.webhookUrl, or request the incoming-webhook scope in the connect link, which then needs a subscriberId. Notifly checks the URL is a safe public address before posting, and anything other than Slack's ok reply fails the send.

Can I set Slack message options per trigger?

Yes. With your own Slack app, anything under overrides.providers.slack is merged into the message Notifly sends, converted to Slack's snake_case: unfurlLinks: false arrives as unfurl_links. When Slack refuses a message, the activity feed records the error Slack returned, for example Slack API Error: channel_not_found.

Bring your provider account. Keep your sender reputation.

One POST /v1/events/trigger — email, SMS, push, in-app, and chat. 10,000 events a month, free.

Get started freeSee pricing