notifly
IntegrationsChat providerUpdated

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

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.

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.

What you need from your 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 (default behaviour will 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.

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.

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.

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

What do I need from my 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.

Which Slack scopes does Notifly ask for?

By default the install 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.

How long does a connect link stay valid?

Five minutes. The link's state parameter is signed and time-stamped, so Notifly refuses an expired or altered link when Slack sends the user back. Create the link when the user clicks Connect, not ahead of time.

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. 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