Slack Data Connector
The Slack Data Connector pulls message history from selected Slack channels via the Slack Web API, with cursor-based pagination and incremental loading. Each configured channel produces its own destination table, named after the channel. Messages with thread activity are enriched inline with their replies.
The connector can only access channels the BigPanda Slack bot has been invited to. Use channel-discovery to identify channels currently available to the bot.
Authentication
The Slack connector authenticates with a Slack bot bearer token (xoxb-...) issued to a dedicated BigPanda Slack app installed in your workspace. Provide the bot token to your BigPanda account team during setup. Tokens are stored securely on the BigPanda side and are not echoed back in connector configuration.
Sync preferences
Provide the following information about your sync preferences to BigPanda:
Required Configuration
Option | Description |
|---|---|
Mode | Determine whether you’d like to set up an incremental or historical sync. Most organizations will use both modes. See the Streaming Modes section for more information. |
Connector configuration
Field | Type | Default | Description |
|---|---|---|---|
| string | none | Start date as |
| string | none | End date as |
| list | required | List of |
| int |
| Max API requests per rate-limit window. Slack Tier 3 endpoints allow ~50/min. |
| int |
| Wait time between rate-limited requests, in milliseconds. |
The connector also respects Retry-After headers returned by Slack on 429 Too Many Requestsresponses, so transient rate-limit hits self-recover.
Channel discovery and configuration
Channels are configured as an array of {name, id} pairs. To discover channels available to the BigPanda Slack app, call the connector's channel-discovery endpoint:
GET /v1/udc/connections/{connection_id}/slack/channelsThe response lists every channel the bot has been invited to, with both the human-readable channel name and the Slack channel ID. Use the returned IDs in the connector's channels configuration.
Example:
{
"config": {
"channels": [
{ "name": "general", "id": "C08QDGX4741" },
{ "name": "engineering", "id": "C09ABC1234" }
],
"cron_schedule": "*/10 * * * *",
"start_date": "2026-01-01"
}
}Channel name normalization
The connector normalizes hyphens (-) to underscores (_) in Slack channel names when generating:
The connector's internal resource name.
The destination table name.
The sync cursor identifier in run reporting.
A channel named ops-alerts is consistently referenced as ops_alerts everywhere downstream. You do not need to reconcile the hyphenated Slack channel name with an underscored destination table name by hand.
Hyphen vs. underscore collision (rare)
Slack permits both hyphens and underscores in channel names, so in principle a workspace can contain two channels that differ only in punctuation. For example, ops-alerts and ops_alerts. Both names normalize to the same identifier (ops_alerts), so:
Their messages are written to a single, merged output table.
The sync cursor is shared between the two channels.
The connector does not detect this collision. In practice the case is extremely rare: teams pick one naming convention, Slack itself warns about similar channel names on creation, and you explicitly pick which channels to sync. If you do encounter it, rename one of the channels in Slack or exclude one from the connector configuration before running the connector. Contact BigPanda support if you need help reconciling pre-existing destination data after a collision.
Data considerations
Timestamps are UTC. The
tsfield is a Unix epoch timestamp in UTC (for example,"1777093380.123456"). All date boundaries (start_date,end_date) are interpreted as UTC midnight. Messages you see in the Slack UI in your local time zone may not line up with the UTC date range you configure. For example, a message that appears as 12:03 AM on April 26 in UTC+3 has atscorresponding to 9:03 PM on April 25 UTC and falls outside astart_date: "2026-04-26"window.Channels create single destination table with one row per message. Messages whose
reply_count > 0carry an inlinerepliesarray containing each thread reply (the parent message itself is not duplicated insidereplies).Records are appended to the destination table on every run. The connector does not deduplicate at the destination. If you replay a window, configure your downstream consumer to deduplicate onts.Edits and reactions do not update
ts. A message'stsis assigned on first post and never changes. Edits, reactions, pins, and similar post-creation changes do not modify it. Because the incremental cursor tracksts, a message already ingested is not re-fetched on later runs even if its content has changed. The ingested data reflects each message's state at the time it was first fetched by the connector.User mentions are stored as IDs. When a user is @-mentioned, the API returns the raw user ID rather than the display name. For example, the
textfield carries<@U12345678>where the Slack UI shows@John Smith. Resolving these IDs to human-readable names requires theusers.infoendpoint and is on the connector roadmap as part of a metadata-refresh feature; it is not implemented today.Same-day date ranges are supported. Setting
start_dateandend_dateto the same day produces a full 24-hour UTC window. The connector bumps the end date to the next day at midnight UTC internally.
Troubleshooting
Bot cannot see a channel. Confirm the BigPanda Slack app has been invited to that channel by a workspace admin, and that the channel-discovery endpoint lists it.
401 Unauthorizedon connector test. Bearer token is invalid or has been rotated. Generate a fresh token and resupply it to your BigPanda account team.Repeated
429responses. Reducequery_limitor increaserate_limit_timeout_ms. Slack workspace-level rate limits are independent of the connector configuration.
Known limitations
Limitation | Detail |
|---|---|
Messages only | User profiles and channel metadata are planned but not yet available. |
No edit / reaction recapture | Already-ingested messages are not re-fetched even if edited or reacted to. The data reflects the state at first fetch. |
No destination dedup | Each run appends. Deduplicate on |
Bot membership required | The connector cannot read channels the bot has not been invited to, even if the workspace technically allows it. |
Slack rate limits | Tier 3 endpoints allow ~50 requests/minute. Tune |