Register your interest: Tag @Cody, get an agent
BlogResources

Microsoft Teams and CodeWords: posting without adding noise

Teams is a SharePoint site with a chat interface. What that means for files and permissions, why adaptive cards beat plain messages, and how to notify without being muted.

Amman VediAmman Vedi11 min read

Summarize with AI

Microsoft Teams and CodeWords: posting without adding noise
On this page

Teams is several products sharing an interface. A team is backed by a Microsoft 365 group; its files live in a SharePoint document library; its meetings are Exchange calendar items; its chat is its own thing. Automating around it means knowing which of those you are actually touching.

The second thing worth knowing is that the default outcome of a notification integration is a muted channel. Getting messages into Teams is straightforward; getting them read requires restraint that the platform does nothing to encourage.

What we'll cover

What a team is made of

A Microsoft 365 group holds membership, and adding somebody to the team is a group operation.

A SharePoint site holds the files. The Files tab of a channel is a folder in that site's document library, which is why file automation for Teams is SharePoint automation.

Channels are conversation threads, with standard, private, and shared channels behaving differently — private channels have their own site, which surprises automation that assumed one.

Chats are separate from channels, with their own permissions and their own endpoints.

Meetings are calendar items, so meeting automation is largely calendar automation with a Teams link attached.

Knowing which component you are touching resolves most of the confusion, particularly the frequent case of a file automation finding nothing because it was pointed at Teams rather than at the underlying document library.

What Microsoft Graph reaches

Channel messages can be posted and read, including replies in a thread.

Chat messages can be posted to individual and group chats, with their own permission requirements.

Teams and channels can be created and configured, which suits provisioning per project or per customer.

Members can be added and removed, through the underlying group.

Files are reached through the SharePoint document library, not through a Teams-specific file endpoint.

Meetings can be created and read as calendar events.

Adaptive cards can be posted as message content, which is what makes a message actionable rather than merely present.

Incoming webhooks offer a simpler path for one-way posting into a channel without the full permission model.

Adaptive cards, which are the point

A plain text message in a busy channel is scrolled past. A card is read, and the difference is mostly structure.

Lead with what happened and why it matters, not with the system that generated it.

Put the key facts in a structured block — who, what, when, which customer — so the information is scannable rather than a paragraph.

Include the action as a link or a button, taking somebody directly to the thing rather than to a dashboard where they search for it.

Keep it short. A card that fills the screen is a document posted in a chat.

Update rather than repost where the state changes, so a thread holds one evolving card instead of nine stale ones.

Test on mobile, since a card that looks tidy on a desktop can be unusable on a phone, which is where a significant share of notifications are read.

Connecting it to CodeWords

CodeWords connects to more than 3,000 integrations, and the connection is made once and reused.

  1. Open CodeWords and start a new automation.
  2. Describe what should happen in plain language to Cody, the automation builder: which channel, what triggers a message, and what it should say.
  3. Authorize the connection, with application permissions restricted where your administrator can apply that, or an incoming webhook for simple one-way posting.
  4. Describe the exceptions: a channel that has been archived, a mention that cannot be resolved, a message that would be a duplicate.
  5. Post to a test channel and check it on a phone before anything reaches a working channel.

You describe the outcome; Cody builds it, connects it, and deploys it. The free plan covers light use, with Pro at $39 per month and Business at $100 per month as usage grows; details are on the pricing page.

Seven automations worth building

Approvals in the channel. A request with the context and a way to respond, so the decision happens where the conversation is rather than in an email thread.

Escalations with context. When something needs attention, post what a person needs to act, not a link to a dashboard.

Team provisioning. A new project or customer produces a team with the right channels, the right members, and the right files, consistently rather than however the last person did it.

Daily or weekly digests. One message covering what happened, rather than a message per event. Almost always the right shape for anything not urgent.

Support handoff. A conversation that needs somebody with specific knowledge, raised in their channel with the history attached.

Meeting follow-through. Actions from a meeting turned into tasks in whatever system holds them, posted back so the record exists.

On-call visibility. Who is on call, kept current in the channel, so nobody has to look it up.

Notifying without being muted

The honest constraint on all of the above.

One message per event is almost always wrong. Aggregate into a digest unless the individual event needs an immediate response.

Post where the response happens. A message in a general channel is everybody's and nobody's; one in the team's own channel has an audience that can act.

Mention deliberately. An automation that mentions a channel on every message trains people to mute it, and once muted it stays muted.

Say what to do. A notification with no action is a status update, and status updates belong in a digest.

Thread updates. Replying in the thread rather than posting anew keeps a situation in one place.

Review what you send. A quarterly look at automated message volume against whether anybody responded is uncomfortable and usually leads to sending considerably less.

Permissions, which are the hard part

Delegated versus application permissions determines whether the automation acts as a person or as itself, and application permissions by default reach every team in the tenant.

Restrict application access to specific teams where your administrator can apply that, which makes the approval conversation easier and the exposure smaller.

Admin consent is required for application permissions, so plan for the request rather than meeting it mid-build.

Incoming webhooks avoid most of this for simple one-way posting into a channel, which is often all that is needed, and they carry their own configuration and lifecycle.

Private and shared channels behave differently, and permissions that work for a standard channel may not cover them.

Meetings, and what automation can do around them

Meeting automation promises more than it delivers, so it is worth separating what works from what does not.

Creating meetings works well. A calendar event with a Teams link, the right attendees, and an agenda in the body, generated from whatever triggered the need for it.

Posting the agenda beforehand into the channel gives people a reason to prepare and a place to add items.

Recording and transcription are policy-dependent, and in many organisations they are restricted or require consent from participants. Check what your tenant permits before designing around them.

Actions afterwards are the valuable part, and they need somebody to identify them. Turning a stated action into a task in the right system is automatable; deciding what the actions were is not reliably so.

Follow-up beats summary. A meeting summary posted to the channel is read once. A task in somebody's queue with the meeting linked is acted on.

Cancel and reschedule cleanly, since a meeting automation that leaves orphaned events is worse than no automation at all.

Building it so it survives

Make posting idempotent. Key on the event so a retried automation does not post twice, which is visible to everybody in the channel.

Resolve channel identifiers once and store them, rather than looking them up by name each time — names change.

Honour throttling. Graph returns a retry hint, and ignoring it makes the throttling worse.

Handle the archived channel rather than failing, since teams are archived and automation outlives them.

Report the outcome. Messages posted, failures, and anything skipped because a channel no longer exists.

Limits worth knowing about

Graph throttles dynamically based on tenant load as well as your own volume.

Message size and card complexity are bounded, and an over-large card renders poorly rather than failing cleanly.

Some message operations require specific permissions that are more sensitive than posting, particularly reading channel messages, which an administrator may decline.

Incoming webhooks are one-way — no reading, no threading in the general case — which is the trade for their simplicity.

Tenant policy can restrict apps, so an automation working in one tenant may be blocked in another for governance reasons.

What to build first

The daily digest: one message per team, covering what happened across the systems they care about, posted at a consistent time. It is simple, it is read, and it replaces whatever per-event notifications are currently being ignored.

Two habits make the difference. Post it at the same time every day, so it becomes something people look for rather than something that interrupts. And include only what that specific team can act on, since a digest containing everybody's information is skimmed by nobody.

Frequently asked questions

Why can my automation not find files in a Teams channel?

Because they are in the SharePoint document library of the site backing the team, in a folder named after the channel. There is no Teams-specific file store, and private channels have their own separate site.

Should I use an incoming webhook or the full API?

An incoming webhook for simple one-way posting into a channel, which covers a lot of cases with far less permission work. The full API when you need to read messages, post to chats, manage teams, or act as a specific identity.

How do I stop the channel being muted?

Send less. Aggregate into digests, mention only when somebody must act, and post where the response happens. A channel receiving an automated message every few minutes is muted within a fortnight, permanently.

Are adaptive cards worth the extra work?

Yes. A structured card with the key facts and a direct action is read and acted on; a paragraph of text in a busy channel is scrolled past. Check it on a phone, where a meaningful share of messages are read.

What permissions will I need approved?

Application permissions require admin consent, and by default they reach every team in the tenant. Ask for access restricted to specific teams where your administrator can apply it — the request is easier to approve and the exposure much smaller.

Can automation create teams for new projects?

Yes, including channels, members, and initial files. It is one of the more valuable things here, because it makes every project start with the same structure rather than whatever the last person set up.

Why do messages sometimes fail intermittently?

Graph throttling, which is dynamic and depends on tenant load as well as your volume. Honour the retry hint in the response rather than retrying immediately, which makes it worse.

Can automation handle meeting notes and actions?

It can create the meeting, post an agenda, and turn identified actions into tasks. Identifying what the actions were is a judgement, and recording or transcription is often restricted by tenant policy — check what yours permits before planning around it.

What is more useful than a meeting summary?

A task in the right system, linked back to the meeting. Summaries are read once; a task in somebody's queue is the thing that makes a decision from a meeting actually happen.

Get started today

Your first workflow is free to build.

Describe what you need. Cody handles the build, the connections, and the deployment.