channels.* keys for the workplace chat channels: Google Chat, Slack, Mattermost, and Microsoft Teams.
Google Chat
- Service account JSON: inline (
serviceAccount) or file-based (serviceAccountFile). serviceAccountaccepts a SecretRef directly.- Env fallbacks:
GOOGLE_CHAT_SERVICE_ACCOUNTorGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(default account only). - Use
spaces/<spaceId>orusers/<userId>for delivery targets. channels.googlechat.dangerouslyAllowNameMatchingre-enables mutable email principal matching (break-glass compatibility mode).
Slack
- Socket mode requires both
botTokenandappToken(SLACK_BOT_TOKEN+SLACK_APP_TOKENfor default account env fallback). - HTTP mode requires
botTokenplussigningSecret(at root or per-account). channels.slack.joinIntrodefaults totrue. When the bot joins an allowed channel, it posts one introduction using the channel name, purpose or topic, and available recent messages. Set this option tofalseto disable introductions, or usechannels.slack.accounts.<accountId>.joinIntrofor an account-specific override. Up to 100 recent messages are read, once per channel; see group join introductions. Introductions never run in direct messages.- User identity (
postAs: "user") posts and reads as the authorizing human. It requiresuserTokenplusappTokenin Socket Mode, oruserTokenplussigningSecretin HTTP mode. No bot token or bot user is required. See User identity for user scopes and event subscriptions. - Slack detects Enterprise Grid org-wide installations automatically from the
bot token with
auth.test; no installation-mode setting is required. Enterprise DMs supportdisabled,open,allowlist, and workspace-scopedpairing. Channel policies requireteam:<team-id>:channel:<channel-id>. User policies accept either an org-wide stable user ID orteam:<team-id>:user:<user-id>for workspace scope. Mutable names and unsupported channel prefixes fail startup. Mention-pattern channel scopes and static route-binding peers use workspace-qualified Slack targets. Direct Socket Mode or HTTP messages, mentions, workspace-qualified actions, deferred delivery, proactive sends, supported event listeners and interactions, static route bindings, and Slack-native approvals from workspace-qualified turns are supported. Relay, channel-ID-change events, App Home, Agent and Assistant lifecycle events, configured ACP bindings, and runtime current-conversation bindings remain unavailable. See Enterprise Grid org-wide installs for the least-privilege manifest, setup workflow, and complete restrictions. - The retired
enterpriseOrgInstallkey is removed byopenclaw doctor --fixat the Slack root and account levels. botToken,appToken,signingSecret, anduserTokenaccept plaintext strings or SecretRef objects.- Slack account snapshots expose per-credential source/status fields such as
botTokenSource,botTokenStatus,userTokenSource,userTokenStatus,appTokenStatus, and, in HTTP mode,signingSecretStatus.configured_unavailablemeans the account is configured through SecretRef but the current command/runtime path could not resolve the secret value. configWrites: falseblocks Slack-initiated config writes.- Optional
channels.slack.defaultAccountoverrides default account selection when it matches a configured account id. dm.groupEnabledanddm.groupChannelsonly filter Slack group DMs (MPDMs) the app is already a member of. They cannot make the app see an existing group DM it never joined; convert the group DM to a private channel and invite the app, or have the app open a new MPDM withconversations.open. See Group DMs (MPDMs) and bots.channels.slack.streaming.modeis the canonical Slack stream mode key (default"progress").channels.slack.streaming.nativeTransportcontrols Slack’s native streaming transport (defaulttrue). LegacystreamMode, booleanstreaming,chunkMode,blockStreaming,blockStreamingCoalesce, andnativeStreamingvalues are no longer read at runtime; runopenclaw doctor --fixto migrate persisted config tostreaming.{mode,chunkMode,block.enabled,block.coalesce,nativeTransport}.unfurlLinksandunfurlMediapass Slack’schat.postMessagelink and media unfurl booleans through for bot replies.unfurlLinksdefaults tofalseso outbound bot links do not expand inline unless enabled;unfurlMediais omitted unless configured. Set either value atchannels.slack.accounts.<accountId>to override the top-level value for one account.- Use
user:<id>(DM) orchannel:<id>for delivery targets.
off, own (default), all, allowlist (from reactionAllowlist).
Thread session isolation: thread.historyScope is per-thread (default) or shared across channel. thread.inheritParent copies parent channel transcript to new threads. thread.initialHistoryLimit (default 20) caps how many existing thread messages are fetched when a new thread session starts; 0 disables thread history fetching.
- Slack native streaming plus the Slack assistant-style “is typing…” thread status require a reply thread target. Top-level DMs stay off-thread by default, so they can still stream through Slack draft post-and-edit previews instead of showing the thread-style native stream/status preview.
typingReactionadds a temporary reaction to the inbound Slack message while a reply is running, then removes it on completion. Use a Slack emoji shortcode such as"hourglass_flowing_sand".channels.slack.execApprovals: Slack-native approval-client delivery and exec approver authorization. Same schema as Discord:enabled(true/false/"auto"),approvers(Slack user IDs),agentFilter,sessionFilter, andtarget("dm","channel", or"both"). Plugin approvals can use this native-client path for Slack-origin requests when Slack plugin approvers resolve; Slack-native plugin approval delivery can also be enabled throughapprovals.pluginfor Slack-origin sessions or Slack targets. Plugin approvals use Slack plugin approvers fromallowFromand default routing, not exec approvers.
Mattermost
Mattermost installs as a separate plugin, the same way Discord, Slack, and WhatsApp do:oncall (respond on @-mention, default), onmessage (every message), onchar (messages starting with trigger prefix).
When Mattermost native commands are enabled:
commands.callbackPathmust be a path (for example/api/channels/mattermost/command), not a full URL.commands.callbackUrlmust resolve to the OpenClaw gateway endpoint and be reachable from the Mattermost server.- Native slash callbacks are authenticated with the per-command tokens returned
by Mattermost during slash command registration. If registration fails or no
commands are activated, OpenClaw rejects callbacks with
Unauthorized: invalid command token. - For private/tailnet/internal callback hosts, Mattermost may require
ServiceSettings.AllowedUntrustedInternalConnectionsto include the callback host/domain. Use host/domain values, not full URLs. channels.mattermost.configWrites: allow or deny Mattermost-initiated config writes.channels.mattermost.requireMention: require@mentionbefore replying in channels.channels.mattermost.groups.<channelId>.requireMention: per-channel mention-gating override ("*"for default).- Optional
channels.mattermost.defaultAccountoverrides default account selection when it matches a configured account id.
Microsoft Teams
Microsoft Teams is plugin-backed and configured underchannels.msteams.
- Core key paths covered here:
channels.msteams,channels.msteams.configWrites. - Full Teams config (credentials, webhook, DM/group policy, per-team/per-channel overrides) is documented in Microsoft Teams.