A channel message's actual path
A channel post is not a chat message with a wider audience — it is a thread object in the channel's message store. Replies attach to the root; reactions and edits are mutations on stored objects. Clients don't hold the channel; they page it from the service on entry — which is why opening a busy channel shows a spinner where chat feels instant: chat is pushed to you continuously, channels are fetched on demand.
Three storage consequences:
- Message ordering is thread-first: the channel list orders by latest activity in each thread. Automation that assumes chronological flat order (like some export tools) mangles threads.
- Edits and deletes are versioned mutations — the compliance copy pipeline records original and edited forms; users see only the latest. eDiscovery reveals edit history; the client never will.
- Attachments are pointers. The "attachment" is a link to the file in the channel's SharePoint folder (or OneDrive for chat). Move/delete the file and old messages hold dead pointers — the file's ACL, not the message, decides who can open it.
The private-channel migration (2025-26) — why it matters operationally
Previously, private-channel messages journaled to each member's mailbox. The re-architecture moved them under the group's compliance scope with channel-level storage (and unlocked 1,000 channels/5,000 members). Two operational aftershocks:
- Retention/eDiscovery targeting changed — policies aimed at user mailboxes to catch private channels no longer describe new messages; group-scoped policies do. Estates that never revisited 2019-era retention design are silently mis-scoped.
- Historical content may still sit in member mailboxes from before migration — for complete discovery over a long case window you scope BOTH.
What to watch (proofs)
- Thread vs flat reality: Graph
GET /teams/{id}/channels/{id}/messagesreturns roots; replies come from the per-message/replies— the API shape proves the thread model. - Edit history existing: eDiscovery export of an edited message shows versions the client hides.
- Migration state: MC1134737 in your archive + Purview retention policy locations — confirm group-scoped coverage for private channel locations (Purview exposes Teams channel messages / Teams private channel messages as distinct locations; watch both).
- Dead-pointer behaviour: move a file referenced in an old post; the message renders, the open fails with the SPO permission/404 — demonstrating ACL-on-file, not-on-message.