SourceLace Docs
Open the app

Slack and Microsoft Teams

How to connect Slack and Microsoft Teams. SourceLace reads the channels, chats and direct messages each person is in, reads threads, searches messages, looks up people and reads files shared in conversations; in Teams it can also read meeting transcripts. If you allow it, it posts messages, creates channels, adds reactions and more, as the person, after they confirm a preview.

Status: in testing. Built against Slack's Web API and Microsoft Graph's documented Teams APIs, and covered by automated tests against simulated services; not yet used with a customer's live workspace or tenant.

What SourceLace can and cannot do

Kind Reads Changes Who signs in
Slack (slack) Conversations you are in, messages, threads, search, people, shared files Post or schedule a message or thread reply (messages), create a channel (channels), create a canvas or update one you created (canvases), add an emoji reaction (reactions) Each person, with their own Slack account
Microsoft Teams (microsoft_teams) Teams and channels you joined, your chats, messages, channel replies, search, people, shared files; with meetings on, your meetings, their transcripts and recording details Post a channel message, channel reply or chat message (messages), create a channel (channels), add a website tab (tabs), add a reaction (reactions) Each person, with their own Microsoft work or school account
  • Only what you can see. SourceLace uses each person's own access (Slack user tokens, Microsoft Graph delegated permissions). There is no bot or shared account, so a person sees only the conversations they are a member of.
  • Nothing changes without you. Every change is off unless an admin allows changes to that object on the source. Each change is previewed (exactly what will happen, and where) and is made only after the person confirms.
  • Never: edit or delete messages (yours or anyone's); delete or rename channels, canvases, tabs or reactions; change a canvas someone else created; post or react in a conversation that includes people outside your organization (direct or group messages with outside people, Slack Connect channels, Teams shared channels and chats with other organizations); or post to a channel you have not joined. Teams cannot schedule messages, so SourceLace refuses that for Teams.
  • Never stored. Messages, files and transcripts are read when asked, held in memory for 30 minutes for joins and charts, and never written to a database.

Slack

Kind: Slack (slack).

How sign-in works. SourceLace has its own Slack app. Each person clicks Connect, chooses the workspace and allows SourceLace to see their conversations as them. SourceLace asks for these user scopes: channels:read, groups:read, im:read, mpim:read, channels:history, groups:history, im:history, mpim:history, search:read, users:read, users:read.email, files:read; and only for the objects you made writable: chat:write (messages), channels:write and groups:write (channels), canvases:write (canvases), reactions:write (reactions).

What your Slack admin may need to do. If your workspace requires app approval, or you are on Enterprise Grid, a Slack admin approves SourceLace's app (and, on Grid, allows it in each workspace).

Slack's limits for apps outside its Marketplace. Since May 2025 Slack lets apps that are distributed commercially but not yet approved for the Slack Marketplace read a channel or thread only once a minute, 15 messages at a time. Searching is not limited this way. If this slows you down, your Slack admin can create your organization's own internal Slack app (SourceLace support sends the manifest) and enter its Client ID and Client Secret in the source's options: internal apps keep Slack's normal limits.

Option Example What it does
team_id T0123ABCD Optional. Only sign-ins to this workspace or Enterprise Grid organization are accepted.
client_id 1234567890.1234567890 Optional: your organization's own Slack app.
client_secret With client_id. Stored encrypted and never shown again.

Microsoft Teams

Kind: Microsoft Teams (microsoft_teams).

How sign-in works. Each person signs in with their Microsoft work or school account through SourceLace's Microsoft app (the same one as Microsoft sign-in, Outlook and SharePoint) and approves these delegated permissions: User.Read, offline_access, User.ReadBasic.All, Team.ReadBasic.All, Channel.ReadBasic.All, Chat.Read, Files.Read.All, ChannelMessage.Read.All; with meetings on, Calendars.Read, OnlineMeetings.Read, OnlineMeetingTranscript.Read.All and OnlineMeetingRecording.Read.All; and only for the objects you made writable: ChannelMessage.Send and ChatMessage.Send (messages, reactions), Channel.Create (channels), TeamsTab.Create (tabs).

What your Microsoft admin needs to do. ChannelMessage.Read.All, OnlineMeetingTranscript.Read.All, OnlineMeetingRecording.Read.All and TeamsTab.Create always need admin consent: in the Microsoft Entra admin center, open Enterprise applications โ†’ SourceLace โ†’ Permissions โ†’ Grant admin consent. If your organization turned off user consent, the admin approves all of them there. Each person needs a license that includes Teams. Transcripts exist only for meetings where transcription was turned on and your Teams meeting policy allows it; Microsoft gives them for meetings the person organized, and may refuse them for meetings the person only attended.

Option Example What it does
channel_messages off Optional. off leaves out ChannelMessage.Read.All, so no admin consent is needed: people read and search their chats, but not channel messages.
meetings on Optional, off by default. on lets people read their Teams meetings, transcripts and recording details (needs admin consent for the transcript and recording permissions).

Queries

Both use the chat_json language: one small JSON object. Use describe_object for every key.

Object Example
conversations {"object": "conversations", "types": ["public_channel", "private_channel"], "name": "sales"} (Slack types: public_channel, private_channel, mpim, im; Teams: channel, chat)
messages {"object": "messages", "conversation": "<id>", "after": "2026-10-01", "limit": 50}
replies {"object": "replies", "conversation": "<id>", "thread": "<thread column>"}
search {"object": "search", "text": "renewal", "from": "ann", "after": "2026-09-01"}
users {"object": "users", "text": "ann@corvanta.com"}
files {"object": "files", "conversation": "<id>"} (in Teams, conversation is required)
file_text {"object": "file_text", "file": "<id column of files>"}: the file's text in chunks, read on demand
meetings (Teams) {"object": "meetings", "after": "2026-09-01"} (default: the last 30 days)
transcript, recordings (Teams) {"object": "transcript", "meeting": "<id column of meetings>"}

Queries are checked before anything is sent: unknown keys, quotes, colons, brackets and ranges over a year are refused. At most 200 messages, 100 search results, 500 conversations or 200 people per query.

Changes, through propose_change (operation create unless noted):

Object Fields
messages conversation, text, optionally thread; Slack only: post_at (a time with a zone, at most 120 days ahead) to schedule it
channels name, optionally private (true or false); Teams: team (required) and description
canvases (Slack) title, markdown, optionally conversation for a channel's canvas; operation update with the canvas id replaces the markdown of a canvas you created
tabs (Teams) conversation (a channel), name, url (https)
reactions conversation, message, emoji (Slack: an emoji name such as thumbsup; Teams: like, heart, laugh, surprised, sad or angry)

When something goes wrong

What you see What to do
"Slack is limiting how often SourceLace can read conversation history..." Wait a minute or use a search query; see Slack's limits above.
"You are not a member of that Slack conversation. Join it in Slack first." Join the channel.
"Your Slack sign-in does not include the permission this needs..." Connect again (usually after an admin allowed posting).
"Slack refused because of your organization's Slack settings: on Enterprise Grid..." Ask your Slack org admin to approve the app for the workspace.
"Microsoft needs an administrator of your organization to approve SourceLace's Teams permissions first..." Grant admin consent, or set channel_messages to off.
"Microsoft Teams: your account has no Teams license, or Teams is turned off for you." Ask your Microsoft 365 admin for a Teams license.
"SourceLace does not send direct messages to people outside your organization." By design: post from Slack or Teams yourself.
"Your sign-in to ... has expired. Call connect_source to sign in again." The token was revoked or expired: connect again.
"Microsoft did not give that meeting's transcript or recordings..." Check that transcription was on, that you organized the meeting, and that your Microsoft admin granted consent.
"Teams cannot schedule messages through SourceLace..." Post now, or schedule it in Teams yourself.