Slack Connector
Connect your Slack workspace to Brevo via Tajo for real-time marketing notifications, team alerts on customer events, and workflow automation triggered by Slack interactions.
Overview
| Property | Value |
|---|---|
| Platform | Slack |
| Category | Custom Integration |
| Setup Complexity | Easy |
| Official Integration | Yes |
| Data Synced | Users, Channels, Messages, Events |
| API Base URL | https://slack.com/api |
Features
- Marketing alerts - Send real-time notifications for campaign events, new subscribers, and revenue milestones
- Customer event notifications - Alert teams on high-value customer actions from Brevo
- Workflow triggers - Use Slack interactions (button clicks, form submissions) to trigger Brevo automations
- Channel-based routing - Route notifications to specific channels based on event type or customer segment
- User sync - Map Slack workspace users to Brevo contacts for internal communications
- Interactive messages - Send rich messages with buttons and actions for team workflows
- Scheduled messages - Schedule notifications for daily/weekly marketing summaries
- Thread support - Group related notifications in threads for organized communication
Prerequisites
Before you begin, ensure you have:
- A Slack workspace with admin access
- A Slack app created at api.slack.com/apps
- Bot token with required scopes
- A Brevo account with API access
- A Tajo account
Authentication
Bot Token (Recommended)
Install a Slack app to your workspace and use the bot token for API access.
- Create app at api.slack.com/apps
- Add required OAuth scopes under “OAuth & Permissions”
- Install app to workspace
- Copy the Bot User OAuth Token (
xoxb-...)
curl -X POST "https://slack.com/api/chat.postMessage" \ -H "Authorization: Bearer xoxb-YOUR-BOT-TOKEN" \ -H "Content-Type: application/json" \ -d '{"channel": "C01234567", "text": "Hello from Tajo!"}'OAuth 2.0
For distributing your Slack integration to multiple workspaces:
# Authorization URLhttps://slack.com/oauth/v2/authorize? client_id={client_id}& scope=chat:write,channels:read,users:read& redirect_uri={redirect_uri}
# Token exchangecurl -X POST "https://slack.com/api/oauth.v2.access" \ -d "client_id={client_id}" \ -d "client_secret={client_secret}" \ -d "code={auth_code}"Required Bot Scopes
chat:write # Send messageschannels:read # List channelschannels:history # Read channel messagesusers:read # List workspace usersusers:read.email # Read user email addressesreactions:write # Add reactions to messagesfiles:write # Upload filesUser Email Access
The users:read.email scope is required to match Slack users with Brevo contacts. Without it, user mapping will be limited to display names.
Configuration
Basic Setup
connectors: slack: enabled: true bot_token: "${SLACK_BOT_TOKEN}" signing_secret: "${SLACK_SIGNING_SECRET}"
# Notification channels channels: marketing: "C01234567" sales: "C01234568" support: "C01234569" alerts: "C01234570"
# Event routing notifications: new_subscriber: channel: marketing template: subscriber_alert high_value_order: channel: sales template: order_alert support_ticket: channel: support template: ticket_alertField Mapping
Map Slack user data to Brevo contact attributes:
Default Mappings
| Parameter | Type | Description |
|---|---|---|
profile.email required | string | User email (unique identifier for Brevo matching) |
real_name optional | string | Full name, split into FIRSTNAME/LASTNAME |
profile.phone optional | string | Maps to SMS attribute |
profile.title optional | string | Job title |
tz optional | string | User timezone |
is_admin optional | boolean | Workspace admin status |
team_id optional | string | Workspace team ID |
status_text optional | string | User custom status |
API Methods
Messaging
| Method | Endpoint | Description |
|---|---|---|
POST | chat.postMessage | Send a message to a channel |
POST | chat.update | Update an existing message |
POST | chat.delete | Delete a message |
POST | chat.scheduleMessage | Schedule a message |
POST | chat.postEphemeral | Send ephemeral message to user |
Channels
| Method | Endpoint | Description |
|---|---|---|
GET | conversations.list | List channels |
GET | conversations.info | Get channel info |
GET | conversations.members | List channel members |
GET | conversations.history | Get channel messages |
Users
| Method | Endpoint | Description |
|---|---|---|
GET | users.list | List workspace users |
GET | users.info | Get user info |
GET | users.lookupByEmail | Find user by email |
GET | users.conversations | List user channels |
Interactions
| Method | Endpoint | Description |
|---|---|---|
POST | views.open | Open a modal view |
POST | views.update | Update a modal view |
POST | reactions.add | Add emoji reaction |
Events
Brevo-to-Slack Notifications
| Event | Trigger | Slack Action |
|---|---|---|
new_subscriber | Contact created in Brevo | Post to #marketing |
campaign_sent | Email campaign sent | Post summary to #marketing |
order_placed | High-value order detected | Post to #sales with details |
cart_abandoned | Cart abandoned for 30min | Post to #sales for follow-up |
ticket_created | Support ticket opened | Post to #support |
unsubscribed | Contact unsubscribed | Post alert to #marketing |
Slack-to-Brevo Triggers
| Slack Event | Trigger | Brevo Action |
|---|---|---|
message_action | Custom message shortcut | Add contact to list or trigger automation |
block_actions | Button click in message | Update contact attribute or send email |
view_submission | Modal form submitted | Create contact or trigger workflow |
Code Examples
Initialize Connector
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect Slackawait tajo.connectors.connect('slack', { botToken: process.env.SLACK_BOT_TOKEN, signingSecret: process.env.SLACK_SIGNING_SECRET});Send Marketing Notifications
// Send a notification when a high-value order is placedawait tajo.slack.notify({ channel: 'sales', event: 'order_placed', data: { orderValue: '$1,250.00', products: ['Premium Widget', 'Pro Service'], isFirstOrder: true }, template: { blocks: [ { type: 'header', text: { type: 'plain_text', text: 'New High-Value Order' } }, { type: 'section', fields: [ { type: 'mrkdwn', text: '*Amount:*\n$1,250.00' } ] }, { type: 'actions', elements: [ { type: 'button', text: { type: 'plain_text', text: 'View in Brevo' }, url: 'https://app.brevo.com/contacts' } ] } ] }});Handle Slack Interactions
import crypto from 'crypto';
app.post('/slack/interactions', async (req, res) => { // Verify Slack request signature const timestamp = req.headers['x-slack-request-timestamp']; const signature = req.headers['x-slack-signature']; const sigBasestring = `v0:${timestamp}:${req.rawBody}`; const mySignature = 'v0=' + crypto .createHmac('sha256', process.env.SLACK_SIGNING_SECRET) .update(sigBasestring) .digest('hex');
if (signature !== mySignature) { return res.status(401).send('Unauthorized'); }
const payload = JSON.parse(req.body.payload);
// Handle button actions if (payload.type === 'block_actions') { await tajo.connectors.handleWebhook('slack', { type: 'interaction', action: payload.actions[0].action_id, userId: payload.user.id, payload }); }
res.status(200).send();});Rate Limits
Slack API rate limits use a tiered system:
| Tier | Limit | Common Methods |
|---|---|---|
| Tier 1 | 1 request/minute | chat.delete, conversations.kick |
| Tier 2 | 20 requests/minute | conversations.history, users.info |
| Tier 3 | 50 requests/minute | conversations.list, users.list |
| Tier 4 | 100 requests/minute | chat.postMessage |
| Special | Varies | chat.postMessage to same channel: 1/sec |
Additional limits:
- Web API: Burst limit with short-term throttle
- Events API: Delivery retries for 3 attempts
- Incoming Webhooks: 1 message/second per webhook URL
- Block Kit: Maximum 50 blocks per message
Channel Posting Rate
Posting to the same channel is limited to approximately 1 message per second. Batch notifications or use threads to avoid rate limiting.
Troubleshooting
Common Issues
| Issue | Cause | Solution |
|---|---|---|
not_authed | Invalid bot token | Reinstall app and copy new bot token |
channel_not_found | Bot not in channel | Invite the bot to the target channel |
missing_scope | Required scope not granted | Add scope and reinstall app |
| Event not received | Event subscription not set | Configure Event Subscriptions URL |
| Interaction timeout | Response >3 seconds | Respond with 200 immediately, process async |
Debug Mode
Enable verbose logging:
connectors: slack: debug: true log_level: verbose log_events: trueTest Connection
tajo connectors test slack# ✓ Bot token valid# ✓ Workspace accessible# ✓ Channels readable# ✓ Message posting enabled# ✓ Event subscriptions activeBest Practices
- Use Block Kit - Build rich, interactive messages with Slack’s Block Kit framework
- Respond quickly - Acknowledge interactions within 3 seconds, process asynchronously
- Thread related messages - Group related notifications in threads to reduce noise
- Route by channel - Send different event types to appropriate team channels
- Include action buttons - Add “View in Brevo” buttons for quick access to customer data
- Implement unfurling - Show rich previews for Brevo links shared in Slack
Security
- Bot Token - OAuth-scoped access token with granular permissions
- Request signing - HMAC SHA-256 signature verification for incoming requests
- OAuth 2.0 - Industry-standard authorization for multi-workspace distribution
- TLS encryption - All API communication encrypted via HTTPS
- Token rotation - Automatic token rotation for enhanced security
Related Resources
- Slack API Documentation
- Slack Block Kit Builder
- Slack Events API
- Brevo Connector
- Customer Sync Skill
Open-Source Implementation Map
No official open-source repository was found in the current Tajo connector catalog for Slack. Keep this page focused on the verified public API contract and vendor documentation until an official schema, SDK, MCP server, or public integration repository is available.
Tajo Revamp Checklist
- Verify authentication and scope requirements against the vendor documentation before each connector release.
- Document primary sync objects, external IDs, pagination strategy, and rate limits explicitly.
- Add smoke tests from public API examples rather than undocumented behavior.
- Capture webhook signature verification and replay protection when the vendor supports webhooks.
- Record gaps where no official public repository or schema exists so future maintainers know what still needs source-backed validation.