TL;DR. SlackBridge does not persistently store the body text of bridged messages. Each bridged message produces a small metadata record (Slack timestamp, Microsoft Teams message ID, channel IDs) that lives in encrypted key-value storage for seven days by default and is then automatically deleted. Sender names and message text are explicitly excluded from this record. A separate one-way hash is stored for seven days to support thread-reply inference, and administrative audit events live for ninety days by default. All retention windows are configurable per organization on the Pro plan.
What's the short version?
SlackBridge is built so that the body text of your bridged messages is not persistently stored anywhere. Messages are forwarded between Slack and Microsoft Teams in real time. The bridge records only the small amount of metadata needed to keep replies threaded correctly, and that metadata expires automatically after seven days.
Three things to know:
- Bridged messages: only ID metadata is stored, never sender names or message text. Default retention seven days.
- Audit log: administrative actions (consent grants, mapping changes) are recorded in a tamper-evident hash chain. Default retention ninety days.
- Tokens: Slack and Microsoft tokens are stored encrypted at rest only as long as the connection is active. Disconnecting deletes them immediately.
What is stored, exactly?
For every message that crosses the bridge, SlackBridge writes one or two small key-value records:
| Record | What it contains | Retention | Purpose |
|---|---|---|---|
| Message mapping | id, channelMappingId, slackTs, slackChannelId, teamsMessageId, teamsChannelId, teamsParentMessageId, slackThreadTs, createdAt |
7 days | Find the Teams message that corresponds to a given Slack timestamp (or vice versa) when a reply needs to be delivered |
| Content fingerprint | A one-way SHA hash of sender_name + message_text as the key, with the Slack timestamp as the value |
7 days | Fallback lookup when message-ID resolution fails (described in the threads-and-replies article) |
What is not stored:
- The message body text. The bridge has the text in memory while delivering the message, but it never writes the text to KV or any database. The mapping record explicitly omits
senderNameandmessageText— this is enforced by a sanitization step in the storage helper. - The display name of the sender.
- File attachments. Files are not bridged today (in development at the time this article was last verified).
- Any kind of message archive that could be replayed later. SlackBridge cannot reconstruct the conversation; it can only resolve "this Slack message corresponds to that Teams message."
Audit-chain events
Administrative actions — admin consent grants, channel-mapping creation and deletion, connection re-consent, organization tier changes — are written to an audit chain. Each event includes:
- A cryptographic hash of the previous event in the chain (SHA-derived)
- A monotonic sequence number
- The event's own hash, computed over its content plus the previous-hash
- The originating connection ID and (when available) organization ID
The hash chain makes silent tampering detectable: if a single event is altered, every subsequent event's hash becomes invalid. Default retention is ninety days; Pro-plan organizations can configure a longer or shorter window from the dashboard.
Tokens and ephemeral state
| Item | Lifetime | Notes |
|---|---|---|
| Slack bot token | Until you disconnect | Slack bot tokens do not expire. Encrypted at rest. |
| Microsoft Graph access token | 50 minutes | Renewed automatically using the refresh token. |
| Microsoft Graph refresh token | Until you disconnect or re-consent | Encrypted at rest. |
OAuth state parameter |
10 minutes | CSRF protection on the OAuth callback. |
| Microsoft admin-consent state | 7 days | Longer because consent links are emailed and may not be clicked immediately. |
| Account-context cache | 15 minutes | Operator-side support-tooling cache; does not contain bridged-message text. |
| Public FAQ response cache | 1 hour | Keyed by intent hash; no user identifiers. |
| Health-alert dedup keys | 1 hour | Prevents duplicate "your bridge is down" emails for the same incident. |
Encryption and infrastructure
- All connections to and from SlackBridge use TLS 1.2 or higher.
- Tokens stored in KV are encrypted at rest using the underlying platform's managed encryption.
- Inbound Slack and Microsoft Graph webhooks are signature-verified before processing.
- The runtime is Cloudflare Workers with KV for state. There is no traditional always-on server with a disk to read.
How to remove your data
- Disconnect from the dashboard. This deletes the Slack bot token and Microsoft Graph refresh tokens for your connection immediately, and removes channel mappings. From this point forward no new metadata is written.
- Wait out the TTLs, or
- Email [email protected] with your organization ID for a hard purge of metadata and audit records ahead of their natural expiration.
Disconnecting does not delete your messages from Slack or from Microsoft Teams — those continue to live in the source platforms under their own retention policies. SlackBridge has no copy to return or to delete.
Compliance posture
SlackBridge's data minimization (no message content stored, short retention windows, encrypted tokens, US data residency, tamper-evident audit trail) is designed to make most compliance reviews straightforward. The combination of "we don't store the messages" and "we delete the metadata in seven days" answers the majority of GDPR, HIPAA-adjacent, and enterprise-vendor-review questions before they're asked.
For specific compliance documents (security overview, subprocessor list, data-processing addendum), email [email protected].