Building a Slack Bot with LLMs: A Production Playbook
Threads, permissions, rate limits, and the UX moves that make an internal AI bot actually get used.
Every internal AI product ends up in Slack. Most die there too — because the bot ignores threads, leaks data across channels, or answers so slowly that people give up.
Non-negotiables
- Reply in the thread the user posted in, not in the channel.
- Stream tokens with periodic
chat.updateso the message feels alive. - Scope memory to the user and workspace, never the channel.
- Respect Slack rate limits — one
updateper 1.5s is a safe cadence.
Permissions
Ask for the minimum scopes. chat:write, app_mentions:read, and im:history cover 90% of bots. Anything more, justify it in the install screen.
UX moves that drive adoption
- Slash commands for the top 3 workflows.
- Ephemeral "thinking..." message that disappears when the real answer arrives.
- Feedback buttons on every response — you need this data for evals.
- Weekly digest of "what your team asked me this week."
The failure modes
Long answers with no formatting, hallucinated links to internal docs, bots that reply to their own messages, and any bot that pings @channel. All fixable, all shipped by someone in month one.
FAQ
Frequently asked questions
Socket mode or HTTP?+
HTTP for anything you plan to sell. Socket mode is fine for internal-only bots.
How do I gate by team?+
Store workspace id + user id on every message and enforce it in retrieval and tools.
Building something similar?
Let's talk in 30 minutes.

