Post new tickets, customer replies, assignments and alerts to a Slack channel, threaded per ticket — 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 Webhooks uses.
Where the screen is
NiroHelp → Integrations → Slack. Same as the rest of Integrations, it needs the manage_options capability.
Bring your own Slack app
A plugin installed on thousands of sites can’t share one Slack app — Slack requires every redirect URL to be registered on the app itself, so there’s no “Add to Slack” button backed by an app NiroHelp owns. Instead, you create your own app from a manifest NiroHelp generates, and paste its credentials back in.
One workspace per site.
Step 1 — create the app
- On the Slack card, click Show the manifest to see it, or Copy manifest to copy it straight away.
- Click Create Slack app, which opens Slack’s app-creation page.
- Paste the manifest in. It requests exactly the scopes NiroHelp needs — see below — nothing more.
Step 2 — install it to your workspace
From the new app’s Install App page, install it to the workspace you want NiroHelp posting into.
Step 3 — paste its credentials
Back on the Slack card:
- Bot User OAuth Token — from the app’s OAuth & Permissions page. Starts with
xoxb-. - Signing Secret — from the app’s Basic Information page.
- Click Connect.
The token is checked against Slack’s own auth.test before anything is saved, so a token Slack refuses never replaces one that already works — if it’s rejected, you’ll see Slack’s own reason.
Once connected, the card shows Connected to your workspace name, and a Disconnect button.
Bot scopes
The manifest asks for:
| Scope | What it’s for |
|---|---|
chat:write | Posting messages. |
chat:write.public | Posting to a public channel the app hasn’t been invited to. A private channel still needs /invite @NiroHelp. |
channels:read | Listing public channels, for the channel pickers. |
groups:read | Listing private channels the app has been invited to. |
users:read | Matching agents to Slack accounts. |
users:read.email | Same, by email address. |
team:read | Confirming which workspace the token belongs to. |
im:write | Only while Send the assignee a direct message is on — needed to open a DM. |
What gets posted, and when
Under Notifications, each of these is its own on/off switch:
| Notification | Fires when | On by default |
|---|---|---|
| New ticket | A ticket is submitted, or created in wp-admin. Imported tickets are never posted. | Yes |
| Customer reply | The customer replies. Replies from agents and the AI are not posted. | Yes |
| Assignment | A ticket is assigned or reassigned. | Yes |
| Overdue ticket | A ticket has waited on the desk longer than Overdue after in the ticket settings. | Yes |
| AI escalation | The AI auto responder held an answer back, or couldn’t answer. | Yes |
| Negative sentiment | A ticket turns negative. The blocker summary is included when message text is. | Yes |
| Urgent ticket | A ticket is created with, or raised to, High or Severe urgency. | Yes |
| Resolved | A ticket is resolved. Posted in the ticket’s thread only, never as a new message. | No |
One thread per ticket, per channel. The first message about a ticket opens a thread; every later notification about that same ticket — including
Resolved — replies in it instead of adding a new message to the channel.
Routing
- Default channel — where notifications go if nothing more specific applies.
- Product channels — under Product channels, click Add rule to send a specific product’s tickets to a different channel instead. Each rule picks a product and a channel; remove one with the row’s remove button.
- Also post urgent alerts to the channel — off by default. Urgent, overdue, negative-sentiment and AI-escalation notifications normally stay inside the ticket’s own thread; turning this on also posts them as a new message in the channel, so they’re seen without opening the thread.
Message content
- Include message text — up to 300 characters of the ticket, the reply, or the blocker summary. Off, only the title and the ticket’s status are sent. Private notes are never sent, regardless of this setting.
- Include the customer’s email address — shown next to the customer’s name on each ticket’s message. Off by default.
- @mention the assignee — pings the assigned agent’s Slack account in the message, when NiroHelp can match them by email.
- Send the assignee a direct message — sends the same notification to the assignee as a DM as well as the channel. Needs the
im:writescope, requested only while this is on.
Sending a test message
Click Send test 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.
Disconnecting
Click Disconnect and confirm. This revokes the bot token with Slack and clears everything this integration stored — the token, the signing secret, the connected workspace, and every routing and message-content setting.
Reconnecting starts from the defaults above, not from what you had.
Troubleshooting
- “That is not a bot token.” — the token doesn’t start with
xoxb-. Copy the Bot User OAuth Token from the app’s OAuth & Permissions page, not the App-Level Token or Client Secret. - “That is not a signing secret.” — copy the Signing Secret from the app’s Basic Information page; it should be 16–128 alphanumeric characters.
- Slack rejects the token (
auth.testfails) — the card shows Slack’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. - A channel is missing from the picker — for a private channel, invite the app to it first (
/invite @NiroHelpin Slack);channels:readonly sees public channels the app hasn’t joined. - Nothing posts — check Send notifications is on, the specific notification is switched on under Notifications, and the ticket actually matches — for example, Resolved only ever updates an existing thread, so a ticket that never had an earlier notification produces nothing when it resolves.
Was this doc helpful?