The Slack integration lets recipes listen for events and slash commands in your Slack workspace, call the Slack Web API to read and post messages, and route specific automations to specific Slack users by linking their Slack identity to a Neurocad account. Three things have to be in place before any Slack-driven recipe will run end-to-end:
The rest of this doc walks through each of those, then covers the Slack trigger and Slack action nodes.
In Neurocad, go to /connect → Slack → Add connection. This kicks off Slack's OAuth v2 install flow:
What's stored on the connection: the bot OAuth token, the team id, the team name, the bot user id, and the OAuth scopes that were granted. The team id is the routing key for everything Slack-related — every trigger registration and every inbound event uses it.
If a workspace later changes its scopes, updates its app config, or has its tokens revoked, the connection drifts:
Both states show up on the connection card and surface as missing_scope / invalid_auth / token_revoked errors at runtime, with the recommended fix: "The Slack connection is no longer valid. Reconnect the workspace in Connections."
The Slack bot can only see, post in, or download files from channels it has been invited to. Inviting it is a one-time setup in Slack itself:
If the bot isn't a member of a channel the recipe references, you'll see runtime errors with a clear hint: "The Slack bot is not a member of this channel. Invite it in Slack and try again." (That's Slack's not_in_channel / channel_not_found error mapped to user-facing copy.) The fix is always: invite the bot.
For public channels, an invite is enough. For private channels, the bot has to be invited by an existing member; there's no admin-side override.
Some Slack triggers — app mention and slash command — are user-invoked: a specific Slack user typed @neurocad deploy or /neurocad deploy. To run those safely, Neurocad has to know which Neurocad user is invoking, not just which Slack user. That's what /neurocad link does.
The token is single-use and expires in 10 minutes. If it expired or was already consumed, the page says "This link has expired. Use /neurocad link in Slack to get a new link." and the user just runs /neurocad link again.
A user can review and remove their links from /settings under Connected accounts. Removing a link doesn't delete the Slack workspace connection itself — just the user-to-Slack-identity binding. They can re-link any time with /neurocad link.
When /neurocad link arrives, the platform looks up the Slack workspace install for the team id Slack sent. If there is none — i.e. nobody at your workspace has run /connect → Slack yet — the bot replies: "No Slack workspace installation is registered for this team. A workspace admin needs to install Neurocad first." Have a workspace admin connect the workspace from /connect, then re-run /neurocad link.
The Who can invoke setting on the Slack trigger node decides who is allowed to fire the automation:
In both modes, an invoker who hasn't run /neurocad link yet gets blocked, with an ephemeral reply: "Your Slack account is not linked to Neurocad yet. Run /neurocad link and follow the URL to finish linking."
In org-members mode, an invoker who is linked but not a member of the workflow's org gets: "You don't have access to that command. It's restricted to members of the workflow's organisation."
Non-user-invoked events (message, reaction_added, file_share, channel_created, team_join, etc.) bypass this gate entirely — they fire on the workspace firehose without per-user gating.
Slack trigger starts a recipe when a matching Slack event arrives. It uses the slackApi credential, fires inside the workspace selected by that credential, and registers itself with Slack to receive events on the platform's webhook endpoints (/api/slack/events and /api/slack/commands).
A multi-select of event types this trigger fires for. You can pick more than one.
For events that are tied to a channel (message, reaction_added, file_share, app_mention, plus Any event), you choose between:
Workspace-wide events (team_join, channel_created, file_public) deliver workspace-wide regardless of the channel selection.
Required when App mention or Slash command is selected. This is the first word after the mention or slash that addresses this specific automation, e.g. deploy in @neurocad deploy or /neurocad deploy. It must be:
The recipe is matched by (team_id, command_word). Slack's /neurocad <word> and @neurocad <word> both route to whichever recipe registered <word> first.
The access control gate described in Why two-step linking exists.
When on, files attached to the inbound event are downloaded inline through the Slack credential and exposed as binary fields (file_0, file_1, …) on the workflow item. Downstream nodes — Library, Schematic, Create share link — can wire those binary fields directly. Off by default; turn it on whenever you need to actually use the shared file.
Off by default. When on, the trigger calls users.info and conversations.info to enrich the inbound payload with user_name and channel_name, so events show @alice / #general instead of U01ABC / C01XYZ. Costs one Slack API call per resolved id per event.
Multi-select of Slack users whose events should be silently dropped. Useful for ignoring the bot's own messages, or for skipping known-noisy automation accounts.
Like every trigger that supports trigger capture, the property panel shows a Listen button. Click it, then trigger the event from Slack — post the message, run the slash command, etc. — and Neurocad captures one real payload so the rest of the graph has a real Slack event to wire against.
Slack is the outbound action node. Like the GitHub node, it exposes a Resource + Operation selector that drives the rest of the form. The credential is slackApi.
Slack's Web API returns errors as { ok: false, error: "<code>" } even on HTTP 200. The node maps the common ones into actionable messages so the failure is obvious in the run panel:
The built-in Slack create library preset is a complete example of all three concerns lining up:
Slack trigger (slash_command, command word "create-symbol", download files on)
→ Slack (file → Download) # pulls the uploaded file
→ Slack (user → Get) # resolves invoker info
→ Library (extract from binary) # generates a symbol
→ Create share link # returns a public URL
→ Slack (message → Send) # posts the result back to the originating channel
The preset's first canvas note spells out the same checklist: "This recipe requires your Slack connection. Navigate to /connect and add it there first. Then @Neurocad can be invited to your Slack channels. Last each user must type the command /neurocad link to register their Slack user with Neurocad."
A simpler workspace-firehose pattern, no slash command, no per-user gating:
Slack trigger (file_share, watch workspace, download files on)
→ Library
→ Create share link
→ Slack (message → Send to a fixed #ops channel)
Slack recipes are deployable — they start from a server-side trigger and only use Connect / EDA nodes. Once the recipe is shaped:
Two activation-time errors are worth knowing:
If a Slack-driven recipe doesn't seem to be firing, walk this list in order — almost every "it's not working" report is one of these:
If all of those pass and it's still silent, capture a real event with the trigger's Listen button — that tells you whether Slack is reaching the workflow at all, separately from whether downstream nodes are succeeding.
Last updated May 7, 2026