Connecting Slack to Copilot Studio: what the docs don't say
We wanted one thing: talk to our Microsoft Copilot Studio agent from Slack, back and forth, like any other teammate. One night, eleven research agents, and twenty-two fixed defects later, we have a fully built relay — and a list of things neither Microsoft's nor Slack's documentation will tell you up front.
If your company lives in Slack but your AI agent lives in Microsoft's ecosystem, this is the map we wish we'd had.
There is no "Add to Slack" button anymore
Copilot Studio used to have a Slack channel you could configure from its settings page. That documentation page now returns a 404. Microsoft's current guidance routes Slack through Azure Bot Service plus a "relay bot" you build yourself — and the official sample for it is marked deprecated and built on an archived SDK; Microsoft's own docs say it isn't intended for production use.
Translation: whatever you were promised, connecting Copilot Studio to Slack in 2026 means writing and hosting real code. We built ours on the current Microsoft 365 Agents SDK (the Direct-to-Engine protocol) with a small Azure footprint: one App Service, a Key Vault, a storage table, and monitoring — about $15–20 a month before AI usage.
The auth advice you'll find in blog posts is wrong
Most posts about calling Copilot Studio from code show a service principal — one app identity with a client secret, calling the agent for everyone. Here's what our verification pass found: app-only authentication to Copilot Studio is a private preview. Microsoft has to enable a feature flag on your environment, through your account team. Microsoft Learn (updated April 30, 2026) says plainly that the Agents SDK "doesn't support service principal tokens." The SDK ships the code paths, which is why the blog posts look plausible — the service just rejects the calls with a 403.
The generally-available path is delegated user auth: each Slack user connects their Microsoft account once with a device-code sign-in, and the relay silently refreshes their credentials afterward — Entra refresh tokens last 90 days of inactivity and roll on every use.
The surprise is that the "harder" path is actually better for governance:
- The agent sees the real user, so agent sharing works as an allowlist.
- SharePoint and Graph-connector knowledge is permission-trimmed per person — user B cannot read answers derived from documents only user A can access. With a shared service identity, everyone sees whatever that one identity sees. That's an oversharing incident waiting for an auditor.
- Our design needs no Entra client secret — there's no shared app credential to rotate, expire, or leak. Per-user refresh tokens still exist, but each is scoped to a single person and lives in Key Vault, not in code or config.
One sharp edge we caught in review: device-code prompts must go to the user's DM, never into a shared channel. A sign-in code posted in a thread lets anyone who sees it bind your Slack identity to their Microsoft account.
Slack changed its AI surface six days before we built this
On June 30, 2026, Slack introduced a new "agent" messaging experience for AI apps. New apps can only use the new surface; the old one is deprecation-bound — and Slack's own Bolt for JavaScript framework (v4.7.3) doesn't support the new surface's events yet. We shipped two app manifests and wrote handlers that work on both. If you build this quarter, you'll be straddling that transition too.
One genuinely good change: Slack renders standard Markdown natively now — Block Kit's markdown block, with a 12,000-character budget per message payload. Copilot Studio emits Markdown, so tables, headers, and links survive intact — no more lossy format conversion, which used to be half the pain of every Slack bot.
The SDK bug that would have broken us in production
This is the finding that justified the whole verification effort. The Microsoft client library's streaming transport (v1.6.1) never surfaces HTTP errors. A 401, a 404, a rate limit — the response is fed to a stream parser, produces nothing, and the client silently retries the same request every two seconds, forever.
For a chat relay that's fatal three ways: expired conversations can't be detected (messages just hang), rejected credentials can't be detected, and an abandoned request keeps re-executing the user's turn in the background — repeated side effects, billed every time. We replaced the transport layer with about 150 lines of our own that check status codes and time out cleanly, keeping the SDK's protocol, types, and auth helpers. It's a workaround with a written retirement condition: we've linked the upstream issue and we'll delete our code when Microsoft fixes theirs.
We found this because we don't trust our own first drafts: an adversarial review pass (twenty-nine agents reading code against the installed libraries) confirmed twenty-two real defects in our initial build, three of them critical. Every one was fixed and re-tested before the repo saw a remote.
What it costs to run
Copilot Studio bills custom-client conversations in Copilot Credits — $200/month for a 25,000-credit pack (about $0.008 per credit) or one cent per credit pay-as-you-go. A generative answer costs 2 credits; agent actions cost 5; Microsoft Graph grounding costs 10. Two things SMBs consistently get wrong here. First, don't assume a Microsoft 365 Copilot seat covers Slack: the license clearly zero-rates agents only on Microsoft's own surfaces (Teams, SharePoint, Copilot Chat); a licensing-guide footnote may zero-rate authenticated per-user usage elsewhere, but confirm that with your account team before you budget on a footnote. Second, anyone who can message your bot is spending your credits — which is exactly why the per-user auth model doubles as your cost control.
The honest caveats
The relay is built, reviewed, and passing its tests; it deploys to Azure this week, and we'll report what production teaches us. The service-principal preview may reach general availability soon (Microsoft's tracking issue is still open past a slipped milestone — we're watching it), and Bolt for JavaScript will eventually catch up to its own platform (Bolt for Python already has). Every number above is as of July 6, 2026, verified against primary sources — not vendor folklore. That verification pass is the difference between this post and the blog posts that told us service principals would just work.
The takeaway for your team
Slack-to-Copilot-Studio is a real, buildable, week-one integration — if you start with the five facts above instead of discovering them at 2 a.m. If you're weighing an integration like this and want a second set of eyes on the auth model, the costs, and the failure modes before you build, that's exactly what our free AI Opportunity Briefing is for.