How the Slack Marketplace actually works
A teardown of the mechanics: who builds apps, who maintains them, who carries the liability, what an app can actually reach, which guardrails exist — and Slack's own stated reasoning for each design choice. Every claim is cited; interpretation is labelled as such.
trigger_id-gated modals, suggested prompts — is a substitute for the one thing apps are
not allowed to do: reach out first. The commercial and legal layers follow the same shape: Slack
reviews, hosts the listing and takes no cut, while the developer keeps the data, the support
burden, and the liability.
What the Marketplace is — and is not
A reviewed public catalogue of ~2,700 listings, sitting on top of a far larger population of ~1.7M apps used weekly. The catalogue is the small, governed tip of the platform; most Slack apps are customer-built and never listed.
app_requested event still carries app_directory_url and
is_app_directory_approved, security correspondence still comes from
appdirectory-security@slack-corp.com, and legacy CSS/analytics identifiers persist.[18]
Separately, Slack's developer docs moved from api.slack.com to docs.slack.dev
(old URLs 301/302 redirect) and almost none of them carry a “last updated” date. Only the Developer
Policy (2024-12-10)[5] and the API ToS (2025-10-10)[6] are hard-dated. Treat every
undated page as a live document.
Actor & ownership map
Four actors, three trust boundaries. Slack owns the storefront and the review; the developer owns the code, the servers, the data and the liability; the customer owns the decision; the end user owns the consent.
Fig 1. Who builds, hosts, maintains and carries liability. Note the shape: Slack's boundary contains the storefront and the token authority but never the app's data; the developer's boundary contains the code and every liability; the customer's boundary contains both the consent and the content that leaves it.
| Actor | Builds | Hosts / runs | Maintains | Carries liability |
|---|---|---|---|---|
| Slack / Salesforce | the platform, APIs, and a small set of first-party listings ~1.5% | the storefront, token authority, rate limiter, admin policy engine | the platform; explicitly not third-party apps [8] | disclaims it for third-party apps — no certification, no warranty [7][8] |
| Third-party developer | the overwhelming majority of listings | all app code + infrastructure, on their own servers, HTTPS/TLS 1.2+ [1] | everything — support in 2 business days, adopt new security features, keep listing current [2] | the developer — indemnifies Slack, notifies users + Slack on breach [5] |
| Customer (admin) | internal apps for their own workspace only | nothing on Slack's side; their own internal apps | their app policy — allowlists, approvals, revocations [18] | the decision to admit the app, and the data it releases CONTROLLER |
| End user | nothing | nothing | their own authorisation, revocable individually [21] | grants the scopes; is the party the whole consent design protects |
Who builds what — and the three states of an app
Slack does not model internal, unlisted and listed apps as different product types. It is one app object moving through three distribution states, which is why the same dashboard serves a five-person hack and a listed ISV product.
| State | Reach | OAuth needed | Reviewed | Docs term |
|---|---|---|---|---|
| Internal / customer-built | one workspace | no — single install token | no | “Undistributed app” |
| Unlisted distributed | any workspace with the link | yes | no | “Unlisted distributed app” |
| Marketplace-listed | public catalogue | yes | two-phase | “Listed distributed app” |
Source: Slack distribution docs [1]
Slack builds more of the catalogue than people assume — but very little of it
Slack publishes first-party apps into its own Marketplace under Developer: Slack.
Verified examples include Google Calendar, Google Meet, Slack for Gmail and
Slack for Outlook[30] — that is, the Google Workspace and Microsoft 365
integrations are built and maintained by Slack, not by Google or Microsoft. A systematic sample of
332 listings found 5 with Developer: Slack, ≈1.5%, implying roughly 40 first-party
listings.[35]
The capability classes Slack keeps for itself
Product surface, not apps
Connector steps — Slack-only by construction
- Slack-built Workflow Builder steps for Google Sheets, Dropbox, Excel, GitHub Enterprise Server
- Slack states they “cannot be developed outside of Slack” [49]
- No third-party equivalent exists — see the Workflow Builder dead end below
Where the asymmetry favours customers
- Internal apps get
conversations.historyat 50+/min, up to 1,000 objects - Commercially-distributed non-Marketplace apps get 1/min, max 15 objects [10]
- Marketplace apps are unaffected — listing buys back your rate limit
Distribution surfaces and their gates
Activating public distribution requires OAuth 2.0 implemented and TLS on every endpoint —
OAuth redirect URLs, interactivity request URLs, Block Kit options-load URLs and Events API request
URLs; TLS 1.2+ has been mandatory since 19 Feb 2020.[1] Activation yields an
embeddable Add to Slack button, a shareable install URL, and the
<meta name="slack-app-id"> tag. Deactivating it removes the app from every workspace
except its home workspace — and once listed, you cannot deactivate this way at all; you must
discontinue the listing.[1]
Org-ready / org-wide (Enterprise Grid). Opt in via Org Level Apps; the manifest gains
"org_deploy_enabled": true. The app is installed once at org level with a single
org-wide token, then Org Admins grant it to specific workspaces. Two things developers get wrong:
org-level install grants no additional privileges, and the app is not auto-added to any
workspace. Detect with is_enterprise_install, key your storage on
enterprise_id, and handle global user IDs beginning W.[25][50]
App manifests make config portable and version-controllable — and there are two
incompatible versions: Deno SDK apps use v2 exclusively, regular apps may use v1 or v2, and an
absent version_metadata is treated as v1.[46]
workflows.stepCompleted,
workflows.stepFailed and workflows.updateStep all ceased
functioning.[49] The replacement — custom steps — carries a hard blocker:
“Apps containing workflow steps cannot be distributed publicly or submitted to the Slack
Marketplace.”[27] Slack's own suggested workaround is to publish your code as a public
repository. Coded/Deno workflow apps are likewise “currently not eligible for listing”[28],
and triggers:* plus workflow.steps:execute sit on the unacceptable-scopes
list.[3] A 2023 changelog conceded there was “no clear path forward” for existing
distributed apps that provided steps.[49]
Net: as of this research date, an ISV that wants its functionality inside Workflow Builder has no supported route. Connector steps are Slack-only. VERIFY BEFORE RELYING this is a 2023–24 claim and the most likely of any here to have quietly changed.
Legacy models: what is dead, dying, and unexpectedly resurrected
| Model | Status | Detail |
|---|---|---|
| Classic apps (old bot-scope model) | PAUSED | Cannot be newly created since Apr 2024. Deprecation slipped Sept 2025 → Mar 2026 → May 2026 → Nov 2026, then paused entirely on 8 Dec 2025: “Based on feedback from our customers and developer community, we have decided to pause this migration. Classic apps will continue to work for the foreseeable future.” [26] |
| Legacy custom bots | DEAD | API calls rejected from 31 Mar 2025; apps removed from channels, tokens revoked, config pages withdrawn [47] |
| RTM API | CLOSED | Granular-permission apps cannot use RTM at all — only classic apps can. Slack calls it “ancient” and steers to Events API or Socket Mode [48] |
| Steps from Apps | DEAD | Retired 26 Sep 2024, no migration path [49] |
| Verification tokens | DEPRECATED | Replaced by signing secrets or mutual TLS [4] |
Getting listed — the review pipeline
Two human review phases on top of automated tests, with an install-count floor that must hold for the entire review, and a queue that resets every time you resubmit in phase one.
Fig 2. The pipeline. The two resubmission loops are the operationally important detail: a preliminary-review bounce resets your queue position and restarts the clock on the functional review; a functional-review bounce after first feedback does not.[2][4]
The install-count floor has whipsawed — get this one right
| Date | Threshold | Note |
|---|---|---|
| pre-Aug 2025 | 10 active workspaces | — |
| 11 Aug 2025 | reduced to 5 | submissions below auto-blocked; in-review apps exempt [32] |
| Jul 2026 | back up to 10 | “Your app needs to stay at 10 or more installed workspaces throughout the entire duration of the review” [31] |
“Active” means used in the past 28 days, excluding sandboxes. Security & compliance partners using the Discovery API are exempt.[3]
Categorically unsuitable — the ~25 disqualifiers
Data extraction
- export or back up message data
- use restricted scopes:
admin.*,identity.*,search:read - circumvent the free-tier 90-day history limit
- use Slack data to train LLMs
Not really a Slack app
- no functionality inside Slack
- embed Slack into another site
- only use Sign in with Slack
- replicate Slack client functionality
- provide only an MCP server with no meaningful in-Slack functionality
Risk & harm
- destructive behaviour — self-destructing messages, bulk file/message deletion
- remote server execution via downloadable script
- share third-party service accounts between users
- financial transactions, crypto, NFT minting
- sentiment analysis unless aggregate and explainable
Not ready
- private beta, still being built, not fully tested
- below the install floor AUTO-BLOCK
- request an unnecessarily large number of scopes
- coded workflows — ineligible outright
What the reviewer actually checks
| Area | Requirement | Failure mode Slack names |
|---|---|---|
| Landing page | publicly accessible, purpose-built for the Slack app, explains how it works in Slack, clear install path and post-install next steps | behind a login; a PDF, doc or repo instead of a real page |
| Support page | public, contact route that does not require creating another account, response within 2 business days | GitHub Issues or Twitter alone is insufficient |
| Privacy policy | what is collected, how used, retention period, how to access/transfer/delete, email or webform contact | physical address alone insufficient; missing retention or deletion mechanics |
| Scopes | least privilege; explain how each is used, not what it does | no scopes for future functionality — “We will only approve scopes related to functionality we can test” |
| Privacy model | app must not grant access to anything the user could not already access in Slack; must hold in Slack Connect and for guests | exposing private channel names to non-members; exercising restricted actions |
| UX | visible feedback, input hints, actionable errors, predictable output, clear attribution | one-way doors; dead ends; “Oops! something went wrong!” instead of “Type /invite @bestapp and try again” |
| Listing assets | ≤10-word short description; distinctive icon not resembling Slackbot; screenshots 1600×1000 (8:5), <2 MB; video 30–90 s, public YouTube, captions on, ads off, production app in a realistic workspace | low-quality or unrelated images; screencasts of the test app |
| Enhanced review triggers | *:history, files:read, canvases:read, user-token groups:write/mpim:write, conversations.connect:write, admin.* | admin.* unlikely to be approved outside the partner program |
Sources: Marketplace guidelines & requirements [3], review guide [4]
Newest category: MCP apps get their own checklist
MCP submissions require the mcp:connect bot scope, an HTTPS MCP server URL you own,
OAuth via external_auth_providers with redirect URI
https://oauth2.slack.com/external/auth/callback, and a successful Fetch Tools run.
Every tool needs a human-readable title, an accurate description, a readOnlyHint
annotation and a valid inputSchema. Slack states that “vague, misleading
[descriptions]… will be grounds for rejection”; iframes must be scoped to the triggering tool call
and must not replicate your whole product. Post-approval, iframe divergence “may result in app
suspension” and sustained tool failures are “subject to auto-off
enforcement.”[33]
Commercials & lifecycle
Listing is free with no revenue share, billing is entirely self-managed, and the listing carries a display-only price label. In exchange the developer accepts eight ongoing obligations and a config freeze.
No fee, no commission
- No listing fee, no commission, no revenue-share clause in the Marketplace Agreement, API ToS, guidelines or partner page
- Marketplace Agreement grants Slack a “royalty-free” distribution licence — no reciprocal payment [8]
- Partner FAQ: “We offer access to all of our Slack APIs and integration patterns for free to partners.” [29]
- API ToS permits charging for your app but bars selling or syndicating API access [6]
Zero billing infrastructure
- No Slack-operated checkout, subscriptions or entitlements
- Guidelines: “you should handle payments securely and provide transparent information on your billing policy” [3]
- Listing records a display-only label: Paid · Paid with free trial · Free and paid plans · Free · Included with service subscription
- Automation-platform apps must gate installs to paid Slack workspaces via
team.billing:read[3]
Partner tiers
- Developer — sandboxes, core APIs, toolkit
- Marketplace Partner — listing, roadmap visibility, partner badge, webinars
- Agent Partner — co-marketing, betas, advisory board, dedicated partner manager, early access to advanced agentic capabilities
- Framing: “The more you build, the more the program invests.” [29]
Placement is discretionary
- Ratings “may be used to determine the placement of your Application… subject to Slack's ability to change placement at Slack's sole discretion” [8]
- Inadequate support “may result in low ratings, less prominent placement, or removal” [8]
- No documented application process for Featured
- First four category slots: MCP Registry, Featured, AI Apps & Assistants, Enterprise-Ready — the two newest categories sit at the front
There is no app certification — and claiming one is prohibited
And contractually: “notwithstanding any Security Review conducted by Slack, Slack does not ‘certify,’ warrant or support the Application. You further represent and warrant that you will not make any externally-facing statements to the contrary, including any statements that imply a Slack endorsement, certification, affiliation or partnership.”[8]
The only badge Slack documents is the partner badge at Marketplace Partner tier and above. RED HERRING “Slack Certified” redirects to a human professional-credential program, not an app certification — do not conflate the two.[29]
The live app is locked after publish
Dashboard changes do not affect the published app until re-review passes, so Slack requires you to maintain a separate staging app cloned from your published manifest and distributed so reviewers can test it. The concrete failure mode Slack calls out: adding un-reviewed scopes to your install link makes installs error out for customers. A video demo and test app are required for new functionality, new scopes, or anything touching the privacy model — but not for display info, pricing, language support or URL updates. “If in doubt, provide a video demo.”[2]
Eight post-approval obligations
| # | Obligation | Enforcement |
|---|---|---|
| 1 | Keep the listing current — functionality, pricing, visuals | delisting |
| 2 | Maintain quality and performance at or above submission level | delisting |
| 3 | Timely customer support | “If we do not receive a prompt reply to our own messages to you, we may de-list your app.” |
| 4 | Regularly adopt new platform security features | subscribe to the changelog |
| 5 | Keep contact details current and respond to Slack | token revocation if you ignore security issues |
| 6 | Add at least one app collaborator | otherwise config dies when the creator leaves the workspace |
| 7 | Resubmit on substantial change to features, purpose or functionality | delisting without prior notice |
| 8 | App is actively used | “If you do not plan to update your app, or people continue not to use your app, we will delist your app after communication with you.” |
Source: Slack Marketplace distribution guide [2]
The enforcement ladder
Slack contacts you when expectations are not met, users report spammy behaviour, broken functionality or poor support, when uninstalls increase, when error rates rise, or when your support/privacy links break. If you do not respond, Slack “will reach out again while simultaneously delisting your app to protect users.” Delisting happens without prior notice when the landing page or install flow is broken, the app appears abandoned, or functionality changed substantially without resubmission.[2]
| Instrument | What it permits |
|---|---|
| Marketplace Agreement §9 | immediate removal for IP violation, illegality or breach; “reserves the right to suspend and/or bar any developer from the Slack Marketplace at its sole discretion, without prior notice” [8] |
| Marketplace Agreement §7 | removal if Slack determines “in its sole discretion” the app is not meeting acceptable standards [8] |
| Marketplace Agreement §11 | either party may terminate on 10 days' written notice — email suffices [8] |
| API ToS | “We may terminate the Contract with or without cause, and without notice to you.” [6] |
| Developer Policy | Marketplace removal, token revocation, developer suspension, user notification, legal action. “we may or may not provide notice before taking action… we may periodically audit Applications. If you fail an audit before notifying us of any issues, penalties will be more severe.” [5] |
| MCP-specific | iframe divergence → suspension; sustained tool failures → auto-off enforcement [33] |
Sunsetting, and the auto-uninstall trap
Slack's four-step discontinuation checklist: remove from the Marketplace, contact the Marketplace team, contact your customers, and delete and revoke every token your app generated. The Developer Policy adds a hard deadline — on user deletion or discontinuation, delete all associated data within 14 business days.[5] Note you cannot use “Deactivate Public Distribution” once listed.[1]
bot, incoming-webhook, commands or
identify are generally not auto-uninstalled — except in the home workspace, where
they die when the last creator or collaborator leaves or becomes a guest. Apps using
any other scope are auto-uninstalled if the installing user leaves the workspace or becomes
a guest.[1] This is precisely why the Marketplace mandates adding a collaborator.
Install & consent — the whole trust transfer in one flow
Everything an app can ever do is decided in one screen, by one person, in about four seconds. No token, no API — and the token's power is fixed at the moment of consent.
Fig 3. Install and consent. Steps 1–4 are the trust transfer; step 5 is the only place an organisation can intervene, and it is disabled until someone turns it on.[11][18][19]
Why Slack designed it this way — in Slack's words
Reinstall triggers — where re-consent is forced
| Trigger | Effect |
|---|---|
| Adding any scope | full re-consent; signal permissions_updated: true |
| Adding an unfurl domain | reinstall required — consent is per-domain [39] |
| New event subscriptions requiring new scopes | reinstall |
| Upgrading to org-wide deploy | reinstall at org level; app_upgraded_to_org_install in audit logs [25] |
| New MCP server domain | re-approval by the admin [65] |
app_scopes_expanded audit-log action.[67]
Data flow & the privacy boundary
Slack sees that an app read your data. It does not see what the app does next. Everything past the developer's ingress is governed by contract and audited by nobody.
Fig 4. The privacy boundary. Left of the token, Slack's compliance estate applies. Right of it, nothing does except the developer's own promises.[55][58][69]
Scope risk tiers
| Token / scope | Reach | Risk |
|---|---|---|
xoxb- bot token, granular scopes | only channels the bot was invited to | bounded — the intended model |
xoxp- user token | acts as the human: their DMs, their private channels | a single consent = one person's entire view |
search:read (user token, legacy) | everything the granting user can see, searchable | an admin's consent ≈ workspace-wide read |
Legacy umbrella bot scope | wide pre-granular default set | persists in old workspaces |
| Legacy custom-integration tokens | full scope of the creating user | landmine; enumerate and kill |
xwfp- workflow token | “borrowed visibility” from the invoking user, 15-min life | short-lived but user-scoped |
| Discovery API (eDiscovery + DLP) | whole-org read, export, tombstone, remove | highest privilege on the platform |
| Real-Time Search API | granular search:read.* + action_token consent | explicit zero-copy: “You must not store or copy any of the data retrieved” |
Sources: scope reference [58], tokens [60], search:read [59], Discovery [61], Real-Time Search [62]
2. EKM does not protect data an authorised app already read. Customer-held AWS KMS keys cover data at rest in Slack.[66]
3. Audit logs never contain message content. Slack: “They do not enable monitoring of message content… you may consider an e-Discovery or Data Loss Prevention solution.” And: “Slack also does not perform any kind of automated intrusion detection… The Audit Logs API will return the data but can not automatically determine or indicate whether an action was appropriate.”[86][67]
4. IP allowlisting is narrower than its name suggests — Web API and SCIM only, max 20 CIDRs, no IPv6, and it does not cover incoming webhooks or Events API delivery.[69]
excessive_downloads,
excessive_file_shares, excessive_malware_uploads, ip_address
(with new-asn/cloud-asn/in-ioc-list), asn,
tor and unexpected_credential_testing. The user-only set —
unexpected_scraping, unexpected_api_call_volume,
unexpected_admin_action, potential_spam — does not apply to apps.
And search_volume, the detection most aligned with search-based bulk exfiltration, was
deprecated on 2 May 2025 and is “currently being re-tooled.”[68]
channels:history + files:read
from streaming a workspace to an arbitrary server — that is the design; it is what an
integration is. Zero-copy, no-LLM-training and 14-day deletion are enforcement-by-contract with no
technical control behind them, and they bind listed apps most tightly. Internal apps and
apps installed by URL sit outside the review regime entirely. So the platform's actual privacy
guarantee is: a well-behaved developer will behave well, and a badly-behaved one will be found out
afterwards, by volume heuristics, if at all.
Liability — two contract stacks that never meet
There are two parallel contractual stacks and no contract between the customer and the app developer. Both stacks bar third-party beneficiaries. That gap is the entire liability story.
Fig 5. The contractual stack. Note the asymmetry: the broad indemnity runs developer→Slack, and the one arrow a harmed customer would want — developer→customer — does not exist.[51][6][5][8][56]
Four documents, one message: Slack is a distributor, not a warrantor
2. Marketplace Agreement §5 — “Slack does not ‘certify’, warrant or support the Application.”[8]
3. Security review doc — “The Slack Application Security Review is not a certification, or proof of a secure application.”[7]
4. Admin help article — “Though we review all apps in the Slack Marketplace, including their requested permissions, Slack doesn't endorse or certify these apps. We recommend that you only install tools that you trust.”[57]
The indemnity and liability map
| Direction | Exists? | Scope | Source |
|---|---|---|---|
| Developer → Slack | yes, broad | the app, its data handling, its users — including “any dispute between you and a user of your app” and indemnity for Slack's performance of a Security Review | API ToS; Mktpl §8 [6][8] |
| Developer → Customer | NONE | nothing in the Slack stack creates one | absence across all docs |
| Salesforce → Customer | narrow | third-party IP infringement of the Service itself only | MSA §9 [51] |
| Slack → Developer | NONE | — | API ToS [6] |
What actually happens when a third-party app is breached
| Question | Answer |
|---|---|
| Must the developer tell Slack? | Yes — “immediately”, to users and Slack [5] |
| Must Salesforce tell the customer? | No. DPA §7 covers incidents at SFDC or its sub-processors; an app vendor is neither. The DPA also expressly excludes “incidents that are caused by Customer or Customer's Users” — and the customer's user is who installed the app [56] |
| Must the developer tell the customer? | Only per the developer's own contract and statute (GDPR Art. 33 processor→controller, where the developer is the customer's processor) |
| Can the customer sue Slack on the developer's agreement? | No — “There are no third party beneficiaries to the Contract.” [6] |
| Can the customer sue the developer on the MSA? | No — MSA §12.5 bars third-party beneficiaries [51] |
| What can Slack do? | Revoke tokens, delist, suspend the developer, notify users, demand deletion in 14 business days, pursue legal action [5] |
Documentation hygiene problems worth knowing about
A ten-year-old listing contract
- The Marketplace Agreement reads “Last modified: July 11, 2016”
- It predates the Salesforce acquisition, the App Directory → Marketplace rename, granular scopes, token rotation, the automation platform and the entire AI/MCP surface
- It is nonetheless the document every listing developer contractually accepts [8]
Two breach-notification addresses
Broken canonical URLs
slack.com/terms-of-service/developer-policy→ “There's been a glitch”; live doc is ondocs.slack.devslack.com/terms-of-service/marketplace→ 404; the live path is/slack-marketplaceslack.com/legalno longer indexes the customer terms — several documents are reachable only via undocumented redirects
A DPA unsure of its own date
- Retrieved copy is headed “(Revision August 2026)” with a page footer reading “April 2026” [56]
- No standalone Slack Developer Program agreement could be located — its terms appear to be the API ToS + Developer Policy UNRESOLVED
Admin guardrails — capable, and off by default
Slack ships a genuinely deep control plane. The single most consequential fact about it is that app approval is not enabled until an admin turns it on.
Workspace level
Approval modes
- Require approved apps — the master switch
- Pre-approved allowlist — appears as its own “Pre-Approved” category to members
- Restricted blocklist — cannot be installed or even requested
- Everything else generates a request with a justification field
- Separate toggle for Sign in with Slack [19]
Delegation & automation
- App Managers — an approval role distinct from Admin, so review does not require full admin rights
- Automation rules — auto-approve, auto-restrict, dismiss or flag by criteria
- Slack, on what approval means: “When approving a request to install an app, you are approving the scopes it will use.” [18]
Org / Grid level
- Org policy overrides workspace policy
admin.apps.*,admin.workflows.*,admin.functions.*,admin.apps.mcp.servers.*[64]app_requestedevent payload carriesscopeswithis_optional,previous_resolution, anddeveloper_type: internal / third_party / slack- Per-scope subsetting on approval via
bot_scopes/user_scopes
MCP governance (newest)
user_scopes or bot_scopes, all requested scopes
will be granted, including optional ones.”[18] Any naive approval automation —
the exact thing a busy IT team builds — therefore grants the full request including the optional
scopes the app deliberately deferred. Two further sharp edges: installing an admin app
disables the workspace App Management UI, and restriction is not retroactive.
The audit trail an admin actually gets
| Category | Actions |
|---|---|
| Install lifecycle | app_approved · app_installed · app_uninstalled · app_restricted · app_upgraded_to_org_install |
| Privilege change | app_scopes_expanded · app_resources_granted · bot_token_upgraded / bot_token_downgraded |
| Policy | app_allowlist_rule_matched · app_whitelist_enabled · app_removed_from_whitelist |
| Config | app_manifest_created / updated / deleted / exported |
| AI | bot_ai_canvas_approval_bypassed · the full mcp_server_* set |
Source: audit-logs actions reference [67]. Enterprise Grid only, auditlogs:read, org-Owner install, read-only, no message content.
Developer-side controls
| Control | Status | Detail |
|---|---|---|
| Token rotation | optional | 12-hour access-token expiry, refresh via oauth.v2.exchange. Irreversible once enabled per app. Not generally required for listing [70] |
| Signing secrets | required | verification tokens deprecated; mutual TLS available [69] |
| TLS 1.2+ | enforced | since 19 Feb 2020 [69] |
OAuth state | required | CSRF defence; mismatch ⇒ “consider the authorization a forgery” [11] |
| Redirect-URL allowlist | required | plus enterprise OAuth domain verification [69] |
| EKM | customer-side | customer-held AWS KMS keys, CloudTrail key-usage logging, revocation at org / workspace / channel / file / time-frame granularity — does not reach data an app already read [66] |
Notification surfaces — mapped by intrusiveness and initiative
Slack gives an app roughly eleven ways to reach a human. They are not interchangeable, and Slack has published a design intent for nearly every one — the recurring theme is keep the human the initiator.
Fig 6. Surfaces by initiative and intrusiveness. Almost all of Slack's design guidance pushes apps down and to the left.[24][44]
Slack's stated intent, surface by surface
user_not_in_channel), Tier 4. Slack's design guidance prefers an ephemeral
message over a DM.
views.publish; app_home_opened;
max 100 blocks.
trigger_id is
required — because “Modals block the rest of the UI.”[44]
Surface selection matrix
| Surface | Visibility | Persistent | Searchable | Generates a push |
|---|---|---|---|---|
| App Home | one user | yes | no | Messages tab only |
| Ephemeral | one user, one channel | no | no | no |
| Channel message | channel members | yes | yes | per user prefs |
| DM | one user | yes | yes | yes — always |
| Modal | one user | no | no | no |
| Canvas / List | as shared | yes | yes | no |
| Split view (assistant) | one user | yes | thread-scoped | no |
Source: choosing the right surface [24], surfaces overview [44]
Transport choice is constrained by listing ambition
Incoming webhooks are the minimal path — 1 message/second, and they cannot delete or update messages. Slack adds a warning worth repeating: “Slack actively searches out and revokes leaked secrets.”[43]
chat.postMessage is throttled to roughly one per second per channel
and @channel is gated by written policy rather than by the API. The economics of the
rate-limit tiers are the etiquette policy, expressed in a form developers cannot ignore.
Engagement rules — who may speak first
An app cannot reach a human before that human acts. There is exactly one pre-install contact path in the entire platform, and Slack — not the app — operates it.
And on breadth: “Do not DM the entire team… Only the installing user should receive a direct message from your app.”[13]
The one exception — and Slack keeps control of it
App Suggestions is the only mechanism by which a Slack user hears about an app before
installing it in-product, and the app never touches it. The developer adds
<meta name="slack-app-id"> to their site; Slack crawls it; when someone pastes that
link into a channel, Slack sends an ephemeral message — visible only to the person who
posted the link — offering Yes please
Not now No thanks, where
No thanks is a permanent opt-out. It is available only to Marketplace-listed
apps.[13]
Rate-limit tiers — the etiquette policy, expressed as quota
Fig 7. Tiers are per-method and per-workspace. Source: rate limits [9], 2025 changelog [10]. Burst allowances are deliberately undisclosed.
| Limit | Value |
|---|---|
chat.postMessage | ~1 per second per channel, with a workspace ceiling of “several hundred messages per minute” [38] |
| Events API delivery | 30,000 per workspace per app per 60 minutes [9] |
| Incoming webhooks | 1 per second [43] |
users.profile.set | 10/min per user; 30 profiles/min per token [9] |
| Socket Mode | 10 concurrent connections per app [42] |
| Over limit | HTTP 429 + Retry-After, scoped to that method and workspace only [9] |
What the Developer Policy forbids outright
Never
- Advertising in any Slack surface
- Using Data to contact Users
- Spamming; impersonating Slack or another app
- Training an LLM on Data — “under any circumstances”
- Renting, selling or sharing Data — “under any circumstances”
- Surveillance / employee-monitoring use cases
Must
- Notify users and Slack of a breach “immediately”
- Delete data within 14 business days of removal or request
- Process the minimum necessary
- Stay within EAR99 / ECCN 5D992
- Submit to Slack's audit right on request
Consequences — the omnibus clause
- “removal from the Slack Marketplace, token revocation, developer suspension, User notification, legal action…”
- “we may or may not provide notice before taking action”
- “if you fail an audit before notifying us of any issues, penalties will be more severe” [5]
Offboarding — the two events, and the trap in them
Uninstallation fires app_uninstalled and tokens_revoked. Both are
Events-API-only and require no scopes. Two implementation details that break naive token
stores:
app_uninstalled arrives
first, or at all, before tokens_revoked.[22]2.
tokens_revoked carries user IDs, not token strings — so a token store
keyed on the token value cannot process the event. Key on
(team_id | enterprise_id, user_id).[23]
See also the auto-uninstall rules in §05: apps holding any scope beyond
bot/incoming-webhook/commands/identify are
auto-uninstalled when the installing user leaves the workspace or becomes a guest — an offboarding
path with no developer involvement at all.[1]
AI agents & assistants — where the risk model changes
An agent is an app that acts. Slack's response is a dedicated container, three published principles, and a governance layer — plus the most candid warning in any of its documentation.
2. Presence without intrusion. “Agents are available where people are already working, but not disruptive.”
3. Safety is the developer's job. “Agents are not inherently safe. An autonomous tool with unfettered access… can do real world harm. It is the duty of every developer to build guardrails, permissions, and human-in-the-loop checkpoints as engineering requirements, not afterthoughts.”[16]
The container and its mechanics
Split view
- Slack's framing: “allows users to initiate private conversations with agents side by side with the rest of Slack, in the flow of work.” [15]
- The user opens it — the agent cannot summon it
- Requires a paid Slack plan
- Cannot be reached by slash commands
Wiring
- The Agents toggle auto-adds
assistant:write - Events:
app_home_opened,app_context_changed,message.im entitiesarray arrives “ordered by relevance”assistant.threads.setSuggestedPrompts— up to 4 [16]
Governance layer
- Audit-log coverage, incl.
bot_ai_canvas_approval_bypassed - An “AI Excluded” indicator in the channel header
- Per-response metrics;
assistant.threads.setStatus - Advice that FedRAMP customers restrict
search:read.*[17]
Marketplace AI rules
- Disclose the model used, LLM data retention and use, tenancy and residency
- Zero-copy: “DON'T store any Slack data you obtain. Store metadata instead and pull in data in real time.”
- “apps should not join all public channels by default after installation”
- No consequential (legal / medical / HR) decisions without human review [3]
agents.sessions.setStatus and agents.sessions.rename are replacing
assistant.threads.setStatus and assistant.threads.setTitle, via a
compatibility bridge. Treat any agent-API detail here as the most volatile content on this
page.[16]
The demonstrated attack: prompt injection through a public channel
In August 2024, PromptArmor demonstrated a chain in which an attacker plants injected instructions in a public channel — requiring no membership in the victim's private channel — and Slack AI renders an exfiltrating link that leaks private-channel content, including API keys. Slack initially characterised the underlying behaviour as “intended behavior”, on the grounds that public-channel content is legitimately searchable, before Salesforce patched it. The technique was later extended to injection via uploaded files.[77]
The compounding problem: cross-app chains
A 2026 analysis defines a “toxic combination” as “a permission breakdown between two or more applications, bridged by an AI agent, integration, or OAuth grant, that no single application owner ever authorized as its own risk surface,” and gives a Slack-shaped example: an MCP connector wiring an IDE to a Slack channel, where “prompt injections inside the IDE push confidential code into Slack, and instructions planted in Slack flow back into the IDE's context on the next session.” It cites the CSA State of SaaS Security 2025 finding that 56% of organisations are concerned about over-privileged API access across SaaS-to-SaaS integrations.[79] Slackbot itself now acts as an MCP client across enterprise apps, which widens exactly this surface.[33]
How Slack compares
Slack's distinctive choices are the 0% take rate with no billing rail, the explicit anti-certification stance, and a review that is unusually long for a marketplace that extracts no revenue.
| Dimension | Slack Marketplace | Microsoft Teams / AppSource | Salesforce AppExchange | Atlassian Marketplace | Chrome Web Store |
|---|---|---|---|---|---|
| Revenue share | None found — no fee, no commission in any of four legal docs | Commercial marketplace transact model takes a cut; publishing itself is free | Partner Program fees / revenue share via a negotiated partner agreement | Paid-app revenue share on Atlassian-billed sales | No commission since Google retired Chrome Web Store payments |
| Billing rail | None — developer bills entirely; listing shows a display-only label | Microsoft can transact on the developer's behalf | Salesforce-adjacent commercial infrastructure | Atlassian bills for paid apps | Developer bills externally |
| Review rigour | Two human phases, up to 10 weeks; discretionary security review; install-count floor | Validation against a published certification policy | Mandatory security review, periodically re-run | Automated + policy review; a separate paid security program | Largely automated with policy enforcement and takedowns |
| Certification claim | Explicitly refused — and developers are contractually barred from implying endorsement | “Certified” is the platform's own term for the validation | Security review is a marketed trust signal | Paid “Cloud Fortified” / security tiers are marketed badges | Badges for verified publishers and established developers |
| Admin gate default | Approval OFF — any member may install | Tenant admin controls, commonly restrictive by default | Install is inherently an admin action | Install is an admin action | User-level install; enterprise policy is optional |
| Liability posture | Third-party apps disclaimed in the MSA; broad developer→platform indemnity; no developer→customer privity | Materially the same pattern across all four — the platform disclaims third-party apps and pushes diligence to the customer | |||
Platform timeline — what Slack had to revise
For a blueprint, the instructive events are not the launches. They are the reversals — and Slack has had several, including two in the last year.
Fig 8. Additive changes above the spine, breaking changes below, reversals boxed. Dated changelog sources throughout.[26][31][32][47][49]
Sources & method
docs.slack.dev, slack.com legal and help
pages, the changelog, and the marketplace sitemap; PDFs were extracted directly.The significant limitation: general web search was unavailable during this research, and document fetching was restricted, so retrieval fell back to direct HTTP requests against known/derived URLs plus the Wayback CDX index. The consequences are specific and worth stating plainly:
- Slack's official position is very well covered. Nearly every quotation on this page is verbatim from a Slack-owned page.
- Independent corroboration is thin. There is little developer-side reporting here on what review is actually like in practice, no press coverage of Marketplace growth, and no third-party audit of Slack's claims.
- No growth or install-count figures. Marketplace category pages are client-side rendered and expose no app links in server HTML, so per-category counts and historical growth could not be obtained. Rather than estimate, this page omits them — which is why §01 has fewer charts than a page like this normally would.
- Several items are explicitly marked unverified — the App Directory → Marketplace rename date, HackerOne bug-bounty scope for third-party apps, the existence of a standalone Developer Program agreement, and the populated values in third-party listings' Security & Compliance tabs.
- The §13 comparison table's non-Slack columns are not primary-sourced. See the caveat in that section.
Where sources conflicted, both readings are shown inline rather than smoothed over — see the classic-app date conflict (§03), the review-timeline conflict (§04), and the two breach-notification addresses (§08). Everything here is as of the research date below; volatile items are date-stamped in place.
Slack platform & distribution documentation
- [1] Distributing Slack apps — docs.slack.dev/app-management/distributing-your-app
- [2] Distributing your app in the Slack Marketplace — docs.slack.dev
- [3] Slack Marketplace app guidelines & requirements — docs.slack.dev
- [4] Slack Marketplace review guide — docs.slack.dev
- [5] Slack Application Developer Policy — docs.slack.dev/developer-policy · effective 10 Dec 2024
- [6] Slack API Terms of Service — slack.com/terms-of-service/api · effective 10 Oct 2025
- [7] Slack Application Security Review — docs.slack.dev
- [8] Slack Marketplace Agreement — slack.com/terms-of-service/slack-marketplace · last modified 11 Jul 2016
- [9] Rate limits — docs.slack.dev/apis/web-api/rate-limits
- [10] Changelog: rate-limit changes for non-Marketplace apps — docs.slack.dev · 29 May 2025
- [11] Installing with OAuth — docs.slack.dev/authentication/installing-with-oauth
- [12] App design guidelines — docs.slack.dev/concepts/app-design
- [13] Onboarding users to your app — docs.slack.dev/onboarding-users-to-your-app
- [14] App Home — docs.slack.dev/surfaces/app-home
- [15] Split view — docs.slack.dev/surfaces/split-view
- [16] AI agents — docs.slack.dev/ai
- [17] Agent governance — docs.slack.dev/ai/agent-governance
- [18] Managing app approvals (admin API) — docs.slack.dev/admins/managing-app-approvals
- [19] Manage app approval for your workspace — slack.com/help/articles/222386767
- [20] Add and update apps — slack.com/help/articles/202035138
- [21] Remove apps and custom integrations — slack.com/help/articles/360003125231
- [22]
app_uninstalledevent — docs.slack.dev - [23]
tokens_revokedevent — docs.slack.dev - [24] Choosing the right surface — docs.slack.dev
- [25] Organization-ready apps — docs.slack.dev
- [26] Changelog: classic-apps deprecation paused — docs.slack.dev · 8 Dec 2025
- [27] Workflow steps — docs.slack.dev/workflows/workflow-steps
- [28] Deno Slack SDK — docs.slack.dev/tools/deno-slack-sdk
- [29] Slack partner program — slack.com/partners
- [30] Slack Marketplace — slack.com/marketplace and docs.slack.dev/slack-marketplace
- [31] Changelog: Marketplace install requirement — docs.slack.dev · Jul–Sep 2026
- [32] Changelog: Slack Marketplace install threshold reduced — docs.slack.dev · 11 Aug 2025
- [33] Slackbot MCP client — distributing & admin approval — docs.slack.dev
- [34] Partner sandboxes — docs.slack.dev/tools/partner-sandboxes
- [35] Marketplace sitemap · used for the first-party listing sample — slack.com/sitemaps/sitemap_marketplace_en-us.xml
- [36] Sending and scheduling messages — docs.slack.dev
- [37]
chat.postEphemeral— docs.slack.dev - [38]
chat.postMessage— docs.slack.dev - [39] Unfurling links in messages — docs.slack.dev
- [40] Implementing slash commands — docs.slack.dev
- [41] Implementing shortcuts — docs.slack.dev
- [42] Comparing HTTP & Socket Mode — docs.slack.dev
- [43] Incoming webhooks — docs.slack.dev
- [44] Surfaces overview — docs.slack.dev/surfaces
- [45] Slack brand guidelines — slack.com/media-kit
- [46] App manifests — docs.slack.dev/app-manifests
- [47] Changelog: legacy custom bots & classic apps deprecation — docs.slack.dev · Sep 2024, superseded by [26]
- [48] Legacy RTM API — docs.slack.dev/legacy/legacy-rtm-api
- [49] Changelog: Steps from Apps step back — docs.slack.dev · Aug 2023; retirement 26 Sep 2024
- [50] Developing for Enterprise Grid — docs.slack.dev
Legal, privacy, security & governance
- [51] Salesforce Main Services Agreement — slack.com/main-services-agreement · index last updated 25 Apr 2023
- [52] Slack Supplemental Terms — slack.com/slack-supplemental-terms
- [53] Slack User Terms of Service — slack.com/terms-of-service/user
- [54] Slack Acceptable Use Policy — slack.com/acceptable-use-policy · 8 Jul 2025
- [55] Slack Privacy Policy — slack.com/trust/privacy/privacy-policy · effective 5 Jul 2023
- [56] Salesforce Data Processing Addendum · header “Revision August 2026”, footer “April 2026” — salesforce.com (PDF)
- [57] Security recommendations for approving apps — slack.com/help/articles/360001670528
- [58] Scope reference — docs.slack.dev/reference/scopes
- [59]
search:readscope · flagged legacy — docs.slack.dev - [60] Token types — docs.slack.dev/authentication/tokens
- [61] A guide to Slack's Discovery APIs — slack.com/help/articles/360002079527
- [62] Real-Time Search API · formerly Data Access API — docs.slack.dev
- [63] Data residency for Slack — slack.com/help/articles/360035633934
- [64] Managing apps, workflows & connector permissions — docs.slack.dev
- [65] MCP client admin approval — docs.slack.dev
- [66] Enterprise Key Management — slack.com/enterprise-key-management
- [67] Audit logs — methods & actions reference — docs.slack.dev
- [68] Audit logs — anomalous events reference ·
search_volumedeprecated 2 May 2025 — docs.slack.dev - [69] Security best practices — docs.slack.dev/concepts/security
- [70] Using token rotation — docs.slack.dev
- [71] Slack compliance & certifications — slack.com/trust/compliance
- [86] Audit Logs API overview — docs.slack.dev/admins/audit-logs-api
- [84]
mcp:connectscope — docs.slack.dev - [83] Slack on HackerOne · JS-gated; third-party app scope UNVERIFIED — hackerone.com/slack
Incidents & third-party reporting
- [72] Slack bot tokens leaked on GitHub — The Register · 28 Apr 2016 — theregister.com
- [73] Slack API abused as covert C2 (“Aclip”, ITG17) — BleepingComputer · 15 Dec 2021 — bleepingcomputer.com
- [74] Slack password hashes exposed in invitation links · flaw live 17 Apr 2017 – 17 Jul 2022 — bleepingcomputer.com
- [75] Slack ML-training terms controversy — The Register · 20 May 2024 — theregister.com
- [76] NullBulge / Disney Slack breach — 1.1 TB, ~10,000 channels · guilty plea 1 May 2025 — bleepingcomputer.com
- [77] Slack AI prompt-injection exfiltration (PromptArmor) — The Register · 21 Aug 2024 — theregister.com
- [78] Salesloft Drift OAuth token theft (UNC6395), 700+ tenants — The Hacker News · 27 Aug 2025 — thehackernews.com
- [79] “Toxic combinations” cross-app risk · 22 Apr 2026 · VENDOR-SPONSORED CONTENT — thehackernews.com
- [80] OAuth consent phishing bypassing MFA (EvilTokens) · 19 May 2026 · VENDOR-SPONSORED CONTENT — thehackernews.com
- [81] Salesforce disables Klue integration (Drift → Gainsight → Klue pattern) · Jun 2026 — thehackernews.com
- [82] Fivetran Open Data Index — Slack scored poorly on programmatic access — The Register · 22 Apr 2026 — theregister.com
- [85] Slackbot as MCP client across enterprise apps — The Register · 2 Apr 2026 — theregister.com
Sources [72]–[85] were located and verified as reachable; a small number of additional headlines were found via the Wayback CDX index but not read, and are therefore deliberately excluded from this list rather than cited unread.