{"id":187,"date":"2026-09-22T08:58:54","date_gmt":"2026-09-22T02:58:54","guid":{"rendered":"https:\/\/nirohelp.com\/docs\/?post_type=nirohelp_doc&#038;p=187"},"modified":"2026-09-22T09:04:10","modified_gmt":"2026-09-22T03:04:10","slug":"slack","status":"publish","type":"nirohelp_doc","link":"https:\/\/nirohelp.com\/docs\/integrations\/slack\/","title":{"rendered":"Slack"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Post new tickets, customer replies, assignments and alerts to a Slack channel, threaded per ticket \u2014 so the team notices without keeping wp-admin open. Slack has no ticket logic of its own; everything it posts is a subscription to the same event feed <a href=\"https:\/\/nirohelp.com\/docs\/integrations\/webhook\/\" data-type=\"nirohelp_doc\" data-id=\"186\">Webhooks<\/a> uses.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where the screen is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>NiroHelp \u2192 Integrations \u2192 Slack.<\/strong> Same as the rest of Integrations, it needs the <code>manage_options<\/code> capability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bring your own Slack app<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A plugin installed on thousands of sites can&#8217;t share one Slack app \u2014 Slack requires every redirect URL to be registered on the app itself, so there&#8217;s no &#8220;Add to Slack&#8221; button backed by an app NiroHelp owns. Instead, you create your own app from a manifest NiroHelp generates, and paste its credentials back in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One workspace per site.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1 \u2014 create the app<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>On the Slack card, click <strong>Show the manifest<\/strong> to see it, or <strong>Copy manifest<\/strong> to copy it straight away.<\/li>\n\n\n\n<li>Click <strong>Create Slack app<\/strong>, which opens Slack&#8217;s app-creation page.<\/li>\n\n\n\n<li>Paste the manifest in. It requests exactly the scopes NiroHelp needs \u2014 see below \u2014 nothing more.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2 \u2014 install it to your workspace<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">From the new app&#8217;s <strong>Install App<\/strong> page, install it to the workspace you want NiroHelp posting into.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3 \u2014 paste its credentials<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Back on the Slack card:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Bot User OAuth Token<\/strong> \u2014 from the app&#8217;s <strong>OAuth &amp; Permissions<\/strong> page. Starts with <code>xoxb-<\/code>.<\/li>\n\n\n\n<li><strong>Signing Secret<\/strong> \u2014 from the app&#8217;s <strong>Basic Information<\/strong> page.<\/li>\n\n\n\n<li>Click <strong>Connect<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The token is checked against Slack&#8217;s own <code>auth.test<\/code> before anything is saved, so a token Slack refuses never replaces one that already works \u2014 if it&#8217;s rejected, you&#8217;ll see Slack&#8217;s own reason.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once connected, the card shows <strong>Connected to<\/strong> your workspace name, and a <strong>Disconnect<\/strong> button.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bot scopes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The manifest asks for:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scope<\/th><th>What it&#8217;s for<\/th><\/tr><\/thead><tbody><tr><td><code>chat:write<\/code><\/td><td>Posting messages.<\/td><\/tr><tr><td><code>chat:write.public<\/code><\/td><td>Posting to a public channel the app hasn&#8217;t been invited to. A private channel still needs <code>\/invite @NiroHelp<\/code>.<\/td><\/tr><tr><td><code>channels:read<\/code><\/td><td>Listing public channels, for the channel pickers.<\/td><\/tr><tr><td><code>groups:read<\/code><\/td><td>Listing private channels the app has been invited to.<\/td><\/tr><tr><td><code>users:read<\/code><\/td><td>Matching agents to Slack accounts.<\/td><\/tr><tr><td><code>users:read.email<\/code><\/td><td>Same, by email address.<\/td><\/tr><tr><td><code>team:read<\/code><\/td><td>Confirming which workspace the token belongs to.<\/td><\/tr><tr><td><code>im:write<\/code><\/td><td>Only while <strong>Send the assignee a direct message<\/strong> is on \u2014 needed to open a DM.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What gets posted, and when<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Under <strong>Notifications<\/strong>, each of these is its own on\/off switch:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Notification<\/th><th>Fires when<\/th><th>On by default<\/th><\/tr><\/thead><tbody><tr><td>New ticket<\/td><td>A ticket is submitted, or created in wp-admin. Imported tickets are never posted.<\/td><td>Yes<\/td><\/tr><tr><td>Customer reply<\/td><td>The customer replies. Replies from agents and the AI are not posted.<\/td><td>Yes<\/td><\/tr><tr><td>Assignment<\/td><td>A ticket is assigned or reassigned.<\/td><td>Yes<\/td><\/tr><tr><td>Overdue ticket<\/td><td>A ticket has waited on the desk longer than <strong>Overdue after<\/strong> in the ticket settings.<\/td><td>Yes<\/td><\/tr><tr><td>AI escalation<\/td><td>The AI auto responder held an answer back, or couldn&#8217;t answer.<\/td><td>Yes<\/td><\/tr><tr><td>Negative sentiment<\/td><td>A ticket turns negative. The blocker summary is included when message text is.<\/td><td>Yes<\/td><\/tr><tr><td>Urgent ticket<\/td><td>A ticket is created with, or raised to, High or Severe urgency.<\/td><td>Yes<\/td><\/tr><tr><td>Resolved<\/td><td>A ticket is resolved. Posted in the ticket&#8217;s thread only, never as a new message.<\/td><td>No<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>One thread per ticket, per channel.<\/strong> The first message about a ticket opens a thread; every later notification about that same ticket \u2014 including<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resolved \u2014 replies in it instead of adding a new message to the channel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Routing<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Default channel<\/strong> \u2014 where notifications go if nothing more specific applies.<\/li>\n\n\n\n<li><strong>Product channels<\/strong> \u2014 under <strong>Product channels<\/strong>, click <strong>Add rule<\/strong> to send a specific product&#8217;s tickets to a different channel instead. Each rule picks a product and a channel; remove one with the row&#8217;s remove button.<\/li>\n\n\n\n<li><strong>Also post urgent alerts to the channel<\/strong> \u2014 off by default. Urgent, overdue, negative-sentiment and AI-escalation notifications normally stay inside the ticket&#8217;s own thread; turning this on also posts them as a new message in the channel, so they&#8217;re seen without opening the thread.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Message content<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Include message text<\/strong> \u2014 up to 300 characters of the ticket, the reply, or the blocker summary. Off, only the title and the ticket&#8217;s status are sent. <strong>Private notes are never sent<\/strong>, regardless of this setting.<\/li>\n\n\n\n<li><strong>Include the customer&#8217;s email address<\/strong> \u2014 shown next to the customer&#8217;s name on each ticket&#8217;s message. Off by default.<\/li>\n\n\n\n<li><strong>@mention the assignee<\/strong> \u2014 pings the assigned agent&#8217;s Slack account in the message, when NiroHelp can match them by email.<\/li>\n\n\n\n<li><strong>Send the assignee a direct message<\/strong> \u2014 sends the same notification to the assignee as a DM as well as the channel. Needs the <code>im:write<\/code> scope, requested only while this is on.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sending a test message<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Click <strong>Send test<\/strong> on the connected card to post a sample message to the default channel right away, so you can confirm the app is actually able to post before relying on it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Disconnecting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Click <strong>Disconnect<\/strong> and confirm. This revokes the bot token with Slack and clears everything this integration stored \u2014 the token, the signing secret, the connected workspace, and every routing and message-content setting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reconnecting starts from the defaults above, not from what you had.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>&#8220;That is not a bot token.&#8221;<\/strong> \u2014 the token doesn&#8217;t start with <code>xoxb-<\/code>. Copy the <strong>Bot User OAuth Token<\/strong> from the app&#8217;s OAuth &amp; Permissions page, not the App-Level Token or Client Secret.<\/li>\n\n\n\n<li><strong>&#8220;That is not a signing secret.&#8221;<\/strong> \u2014 copy the <strong>Signing Secret<\/strong> from the app&#8217;s Basic Information page; it should be 16\u2013128 alphanumeric characters.<\/li>\n\n\n\n<li><strong>Slack rejects the token (<code>auth.test<\/code> fails)<\/strong> \u2014 the card shows Slack&#8217;s own reason. A token can be revoked from the Slack side (someone uninstalled the app, or rotated it) without NiroHelp knowing until the next attempt.<\/li>\n\n\n\n<li><strong>A channel is missing from the picker<\/strong> \u2014 for a private channel, invite the app to it first (<code>\/invite @NiroHelp<\/code> in Slack); <code>channels:read<\/code> only sees public channels the app hasn&#8217;t joined.<\/li>\n\n\n\n<li><strong>Nothing posts<\/strong> \u2014 check <strong>Send notifications<\/strong> is on, the specific notification is switched on under <strong>Notifications<\/strong>, and the ticket actually matches \u2014 for example, Resolved only ever updates an existing thread, so a ticket that never had an earlier notification produces nothing when it resolves.<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}}},"nirohelp_product":[],"nirohelp_topic":[19],"class_list":["post-187","nirohelp_doc","type-nirohelp_doc","status-publish","hentry","nirohelp_topic-integrations"],"_links":{"self":[{"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/nirohelp_doc\/187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/nirohelp_doc"}],"about":[{"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/types\/nirohelp_doc"}],"author":[{"embeddable":true,"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"nirohelp_product","embeddable":true,"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/nirohelp_product?post=187"},{"taxonomy":"nirohelp_topic","embeddable":true,"href":"https:\/\/nirohelp.com\/docs\/wp-json\/wp\/v2\/nirohelp_topic?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}