Getting your Slack app ready for real users
Verdict. You can have a Slack app installable in any workspace in under 10 minutes, with no review. But if your agent reads channel or thread history, that is throttled to 1 request a minute until Slack approves a Marketplace listing, which takes up to about 12 weeks after you reach 10 active workspaces.
At a glance
The answer in one screen- The workspace that owns the app is permanent. Create the app in a workspace your company owns and will keep, never in a personal or trial workspace.
- Turning distribution off later uninstalls you everywhere. Treat "Activate Public Distribution" as a one-way door once customers are on it.
- A Marketplace listing locks the app. Request every scope you will need in the next 6 to 12 months before you submit, and keep a separate staging app.
- Token rotation changes how you must store tokens. Decide before launch. If you turn it on, store the newest refresh token every time, or connections die with
invalid_grant.
Prerequisites
What to have readyTo create and connect
- A company-owned Slack workspace to own the app
- A second workspace to test installs as a customer would
- An HTTPS redirect URL. For Composio, the callback shown in your auth config
- No hard-coded tokens or webhook URLs in your code (you attest to this)
For approval (can take days)
- 10 or more active workspaces (used in the last 28 days). The counter updates every 24 hours
- Public homepage, privacy policy, support contact
- Demo video: install, OAuth, setup, real use, uninstall
- Test credentials and dummy data for your own product
App types
Which one is right for an agent product?Single-workspace
- Who can install
- Only the workspace it was built in
- Review
- None
- Use it for
- Building and testing
Distributed (unlisted)
- Who can install
- Any workspace, through your install link
- Review
- None. Took effect instantly in our test.
- Use it for
- Beta and first customers
Marketplace (listed)
- Who can install
- Anyone, and discoverable in Slack
- Review
- Yes, up to about 12 weeks
- Use it for
- Commercial product at scale
Creation steps
Who does what, and how long it takes- YouSign in at api.slack.com/apps1 minThe agent cannot sign in for you. Use the company-owned workspace (decision 1).
- AgentCreate New App, choose "From a manifest"1 minThe dialog also offers AI agent, Starter app and Blank app templates. A manifest is faster and reviewable.
- AgentWrite the manifest2 minApp name, bot user, scopes from section 4, the HTTPS redirect URL, and
token_rotation_enabledset deliberately. - YouApprove "Create and Install"10 secCreating and installing into your workspace is now a single step. Settings open at app.slack.com/app-settings.
- YouCopy Client ID and Secret into Composio2 minCreate a custom auth config and pass its ID for the slack toolkit. See section 11 on keeping the secret out of sight.
- AgentClear the distribution checklist1 minWith a manifest, 3 of 4 items pass automatically. The last is a checkbox confirming no hard-coded tokens.
- YouApprove "Activate Public Distribution"5 secNo review. Took effect instantly. Without it, other workspaces get
invalid_team_for_non_distributed_app. - YouTest install from a second workspace10 minUse an incognito window, as a new customer would.
Total in our test: about 5 minutes of agent work, one sign-in and two approvals.
Scopes
What each permission costs youAgents usually use bot scopes (the app acts as itself, token starts xoxb-). User scopes act as the person (xoxp-) and are needed for things like search.
| Agent use case | Scopes | What it costs you |
|---|---|---|
| Post messages | chat:write | No limit |
| List channels and people | channels:readusers:read | No limit |
| Read user emails | users:read.email | No limit |
| Read public channel history | channels:history | 1 req/min, 15 messages per call until listed |
| Read private channels and DMs | groups:historyim:history | 1 req/min, 15 messages per call until listed |
| Read threads | channels:history | Same throttle via conversations.replies |
chat:writechannels:readchat:writechannels:readchannels:historyChanging scopes later
- While unlisted: add scopes freely in the manifest, but every existing workspace must reinstall to grant them. Existing connections do not upgrade on their own.
- Once listed: a new scope needs resubmission with a demo video and a staging app.
- In Composio: the scopes your auth config requests must match what the app allows, then users reconnect.
Approval and distribution
Review, cost and renewalWhen you need it: To lift the history throttle, and for commercial distribution under Slack's terms. Cost: None from Slack. Renewal: None, but listed apps are locked (decision 3).
What you submit
- Listing content and scope justifications
- Security and compliance answers
- Testing information and credentials
- Demo video (install to uninstall)
Common rejection reasons
- Broad or legacy scopes
- Scopes for features that do not exist yet
- Reviewer cannot install the app
- Coded workflows (not eligible)
Slack will not speed up review for a launch date. Submit early.
Before approval: what works and what's capped
Data use and compliance
Rules that shape agent design- No LLM training on data from Slack APIs, for apps used outside the installing organization.
- No bulk export of messages and files without a separate agreement.
- Keep only what you need. Use, processing and retention must be the minimum the app needs to run.
- No persistent copies or indexes of other organizations' data via the Data Access and Real-time Search APIs. Brief caching only.
Common blockers
Symptom, cause, fix| Symptom | Cause | Fix |
|---|---|---|
invalid_team_for_non_distributed_app | Distribution not activated | Manage Distribution, then Activate Public Distribution |
redirect_uri mismatch | URL differs from the registered one, or is not HTTPS | Copy the exact callback from your Composio auth config |
| History calls return 15 messages and get rate limited | Unlisted app throttle | Use events, or go through Marketplace review |
invalid_grant on refresh | Rotation on, an old refresh token was reused | Store the newest refresh token every time |
| Agent missing new permissions | Scopes added but workspaces did not reinstall | Ask users to reconnect; check granted scopes |
| Customer cannot install in their company workspace | Their admin requires app approval | Give customers an admin-approval note Not verified |
Sources
Where every claim comes from| Claim | Source |
|---|---|
| App created and installed in one step; settings at app.slack.com | Tested in our setup |
| Distribution activates instantly with no review | Tested in our setup |
| Owning workspace cannot be changed | Tested in our setup |
| Deactivating distribution uninstalls everywhere | Tested in our setup |
| Token rotation off by default; PKCE opt-in | Tested in our setup |
| 1 req/min and 15 objects for unlisted apps | Official docs |
| Review up to 10 business days + up to 10 weeks; 10 active workspaces | Official docs |
| No LLM training, no bulk export, minimal retention | Official docs |
| Manifest API returns credentials (level 1 handoff) | Not verified |
All sources
- Slack: Rate limit changes for non-Marketplace apps docs.slack.dev
- Slack: Marketplace review guide docs.slack.dev
- Slack: API Terms of Service slack.com
- Slack: Using token rotation docs.slack.dev
- Nango: invalid_team_for_non_distributed_app nango.dev
- Composio: Managed vs custom auth docs.composio.dev