LoadersSlack

Slack Loader

The Slack loader pulls messaging, channel, and user data from your Slack workspace into your data warehouse. It uses Slack’s Web API and supports incremental sync for messages based on timestamps.

Prerequisites

  • A Slack workspace where you have admin permissions (or the ability to install apps)
  • A connected Warehouse (target warehouse) with write permissions on the target schema

Authentication

The Slack loader uses OAuth 2.0 for authentication.

OAuth 2.0 Setup

  1. In SignalSmith, click Add Loader and select Slack
  2. Click Connect with Slack
  3. You’ll be redirected to Slack’s authorization page
  4. Select the workspace you want to connect
  5. Review the requested permissions and click Allow
  6. You’ll be redirected back to SignalSmith with the connection established

SignalSmith requests the following OAuth scopes:

ScopePurpose
channels:readList public channels and their metadata
channels:historyRead message history from public channels
groups:readList private channels the bot is a member of
groups:historyRead message history from private channels
users:readRead user profiles and status
users:read.emailRead user email addresses
team:readRead workspace/team information
reactions:readRead emoji reactions on messages

Channel Access

The Slack bot can only read messages from channels it has been invited to. For public channels, the bot has automatic read access. For private channels, you must manually invite the SignalSmith bot to each private channel you want to sync.

To invite the bot to a private channel:

  1. Open the private channel in Slack
  2. Type /invite @SignalSmith or click the channel name > Integrations > Add an App

Available Objects

ObjectAPI NameDescriptionDefault Sync Mode
MessagesmessagesMessages from selected channels with text, author, timestamp, and thread infoIncremental
ChannelschannelsPublic and private channel metadata (name, purpose, topic, member count)Full Refresh
UsersusersUser profiles with name, email, title, status, and timezoneFull Refresh
ReactionsreactionsEmoji reactions on messages (who reacted with what)Incremental
ThreadsthreadsThread parent messages with reply counts and participantsIncremental
User Groupsuser_groupsUser group definitions (handle, members)Full Refresh
WorkspaceworkspaceWorkspace-level metadata (name, domain, plan)Full Refresh

Messages

Messages are the primary data object and are extracted per channel. Each message includes:

FieldDescription
tsMessage timestamp (Slack’s unique message ID)
channel_idChannel where the message was posted
user_idUser who sent the message
textMessage text content (with Slack markup)
thread_tsParent thread timestamp (null for non-threaded messages)
reply_countNumber of thread replies (for parent messages)
subtypeMessage subtype (e.g., channel_join, channel_topic, bot_message)
attachmentsMessage attachments as JSON
blocksBlock Kit content as JSON
edited_tsTimestamp when the message was last edited (if applicable)

Channel Selection

After authentication, you select which channels to sync messages from. You can select:

  • All public channels — Automatically includes new public channels as they’re created
  • Specific channels — Select individual public and private channels
  • By prefix/pattern — Select channels matching a naming pattern (e.g., support-*, sales-*)

Configuration

SettingDescriptionDefault
ChannelsWhich channels to sync messages from— (you choose during setup)
ObjectsList of objects to sync— (you choose during setup)
Sync ModeFull Refresh or Incremental (per object)Incremental
Message HistoryHow far back to go for the initial backfillLast 90 days
Include Bot MessagesWhether to include messages from bots and integrationstrue
Include Threaded RepliesWhether to extract thread replies as separate rowstrue
Primary KeyField(s) that uniquely identify a recordchannel_id + ts (messages)
Target SchemaWarehouse schema for Slack tables— (required)
Table PrefixOptional prefix for table namesslack_
ScheduleSync frequencyHourly

Scheduling Notes

  • Rate limits: Slack’s Web API enforces tier-based rate limits. Most read methods are Tier 3 (50 requests per minute) or Tier 4 (100 requests per minute). The conversations.history endpoint is Tier 3. SignalSmith handles rate limiting with automatic backoff.
  • Message volume: Active Slack workspaces can generate thousands of messages per day across channels. Select only the channels relevant to your use case to manage data volume.
  • History limits: Slack’s free plan retains only the most recent 90 days of message history. Paid plans (Pro, Business+, Enterprise Grid) retain full history. The loader can only extract what’s available in Slack.
  • Edited messages: When a message is edited, its ts (timestamp) remains the same but the text content changes. Incremental sync captures edits when the channel is re-scanned.
  • Deleted messages: Deleted messages are not available via the Slack API. If a message is deleted between syncs, it remains in your warehouse from the previous extraction. Run a periodic full refresh to detect deletions.
  • File content: Message attachments and files are referenced by URL but their content is not downloaded. Only file metadata (name, type, URL) is extracted.
  • Private channels: The bot must be explicitly invited to private channels. Messages from private channels the bot hasn’t joined are not accessible.

Schema Mapping

Slack field types are mapped to warehouse-compatible types:

Slack TypeWarehouse TypeNotes
stringVARCHAR
timestampTIMESTAMPSlack ts (Unix epoch with microseconds) converted to UTC
integerBIGINTCounts like reply_count
booleanBOOLEAN
arrayJSON / VARCHARAttachments, blocks, reactions
objectJSON / VARCHARNested structures like profile, edited

Slack Markup

Message text contains Slack-specific markup:

  • <@U123ABC> — User mentions (user ID)
  • <#C123ABC> — Channel mentions (channel ID)
  • <https://example.com|Display Text> — Links with display text
  • *bold*, _italic_, ~strikethrough~ — Formatting

Your models can parse or strip this markup as needed.

Troubleshooting

IssueSolution
”not_authed” or “invalid_auth”Token has been revoked. Re-authenticate by clicking “Reconnect"
"missing_scope”The Slack app needs additional permissions. Reconnect to re-request scopes
”ratelimited”SignalSmith handles rate limits automatically. Reduce the number of channels or sync frequency if persistent
No messages from private channelsThe bot must be invited to private channels. Use /invite @SignalSmith in each private channel
Missing message historyFree Slack plans only retain 90 days of messages. Upgrade to a paid plan for full history
Bot messages cluttering dataSet “Include Bot Messages” to false to exclude automated messages
Large message volumeSelect fewer channels or increase the sync interval. Consider syncing only channels relevant to your analysis
User emails not appearingThe users:read.email scope is required to extract email addresses. Verify the scope was granted during authorization

Common Use Cases

Use CaseDescription
Customer support analysisAnalyze support channel response times, volume trends, and topic frequency
Internal communicationsTrack engagement across teams, channels, and topics
Community analyticsMeasure community health in shared Slack channels
Feedback miningExtract product feedback from designated channels for analysis
Compliance archivingArchive messages in your warehouse for regulatory compliance

Next Steps

  • Create a model to transform your raw Slack data
  • Join Slack message data with CRM data to connect customer conversations to accounts
  • Build engagement metrics dashboards for your Slack workspace