Teams channel — initiative plan
Audience: Leadership, product, engineering
Status: In the product (Workflows webhook). An Ascendly Teams app/bot is later.
Engineering detail: design-log/2026-08-22-teams-channel-broadcast.md in the monorepo
What this is
A dedicated Microsoft Teams channel (for example #ascendly) where Ascendly posts operational notices. Each post is a card with a title and message. People reply in that thread in Teams. Ascendly does not read replies.
Two ways a post is created:
| Source | Example |
|---|---|
| Automatic | Weekly locking is approaching → one “Week locking soon” card |
| Manual | An admin writes subject + body at System → Teams |
This is a shared notice board, not personal chat. The in-app bell and email stay as they are. There is no per-user Teams toggle.
v1 sends through a Teams Workflows webhook (channel → Workflows → paste URL in Ascendly). Cards appear from Workflows, not an Ascendly app icon, until a bot is connected later.
Why not 1:1 messages first
Personal alerts already have inbox + email. A channel is the gap: one place for company-wide Ascendly concerns, discussable in a thread.
1:1 DMs, embedding Ascendly as a Teams tab, and talking to the assistant in Teams are later.
What posts vs what does not
On the channel:
- Weekly / monthly lock approaching (one post per lock period)
- Missing evaluations for the team — counts by department, no employee names
- Admin-composed announcements (level 5)
Stay in inbox / email only:
- “An entry was submitted / deleted for you”
- ATW request submitted / approved / rejected
- Eval follow-up pings
- Birthday greetings
A shared channel must not become a firehose or leak private scorecard events.
How to connect
- Create the destination channel and restrict membership as needed.
- Channel … → Workflows → Post to a channel when a webhook request is received.
- Super admin pastes the HTTPS URL at System → Teams (
/system/teams). Treat the URL as a password. - Send a test card. Automated lock and missing-eval posts stay off until Enable automated Teams posts is on at System → Teams and Also post to the Teams channel is on for the allowlisted types at System → Notifications.
Optional ops override: TEAMS_WEBHOOK_URL on the API and Worker (Mongo URL is unused while the env var is set).
What already exists
| Surface | Role |
|---|---|
| Notifications | Per-person inbox + email; type catalog; Teams allowlist checkbox |
| System → Email | Level 5 broadcast to selected employees |
| System → Teams | Webhook connection, automated-posts switch (off by default), test, compose, post history |
Teams is a destination for selected events and for compose — not a second notification product.
Phases
| Phase | Focus | Status | Outcome |
|---|---|---|---|
| Webhook v1 | Connection, test, compose, allowlist, history | Live | Super admin posts to one channel; lock and missing-evals post once per event |
| Bot later | Azure Bot + Teams app package | Not started | Posts appear as Ascendly with native thread subjects |
Later (not this surface)
- Azure Bot / Graph posting
- 1:1 DMs (would need Google → Entra identity mapping)
- Teams tab or Nella in Teams
- Multiple channels
- Per-user Teams delivery prefs
Related
- Notifications — inbox, email, type catalog, Teams destination
- Platform & admin — System Teams and email compose
- What's in Ascendly — current product map
- Roadmap — other unshipped work
