Slack Connector
เชื่อมต่อ Slack workspace กับ Brevo ผ่าน Tajo สำหรับการแจ้งเตือนทางการตลาดแบบเรียลไทม์ การแจ้งเตือนทีมงานเกี่ยวกับเหตุการณ์ลูกค้า และระบบอัตโนมัติเวิร์กโฟลว์ที่ทริกเกอร์จากการโต้ตอบ Slack
ภาพรวม
| คุณสมบัติ | ค่า |
|---|---|
| แพลตฟอร์ม | Slack |
| หมวดหมู่ | การผสานรวมแบบกำหนดเอง |
| ความซับซ้อนในการตั้งค่า | ง่าย |
| การผสานรวมอย่างเป็นทางการ | ใช่ |
| ข้อมูลที่ซิงค์ | ผู้ใช้ Channels ข้อความ เหตุการณ์ |
| API Base URL | https://slack.com/api |
ฟีเจอร์
- การแจ้งเตือนทางการตลาด - ส่งการแจ้งเตือนแบบเรียลไทม์สำหรับเหตุการณ์แคมเปญ สมาชิกใหม่ และ revenue milestones
- การแจ้งเตือนเหตุการณ์ลูกค้า - แจ้งทีมงานเกี่ยวกับการกระทำของลูกค้าที่มีมูลค่าสูงจาก Brevo
- ทริกเกอร์เวิร์กโฟลว์ - ใช้การโต้ตอบ Slack (คลิกปุ่ม การส่งฟอร์ม) เพื่อทริกเกอร์ระบบอัตโนมัติ Brevo
- การกำหนดเส้นทางตาม channel - กำหนดเส้นทางการแจ้งเตือนไปยัง channels ที่เฉพาะเจาะจงตามประเภทเหตุการณ์หรือ customer segment
- การซิงค์ผู้ใช้ - แมปผู้ใช้ Slack workspace กับผู้ติดต่อ Brevo สำหรับการสื่อสารภายใน
- ข้อความโต้ตอบ - ส่งข้อความที่สมบูรณ์พร้อมปุ่มและการกระทำสำหรับเวิร์กโฟลว์ทีม
- ข้อความตามกำหนดเวลา - กำหนดเวลาการแจ้งเตือนสำหรับสรุปการตลาดรายวัน/รายสัปดาห์
- รองรับ Thread - จัดกลุ่มการแจ้งเตือนที่เกี่ยวข้องใน threads เพื่อการสื่อสารที่เป็นระเบียบ
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:
- Slack workspace ที่มีสิทธิ์ผู้ดูแลระบบ
- Slack app ที่สร้างที่ api.slack.com/apps
- Bot token ที่มี scopes ที่จำเป็น
- บัญชี Brevo ที่มีสิทธิ์เข้าถึง API
- บัญชี Tajo
การยืนยันตัวตน
Bot Token (แนะนำ)
ติดตั้ง Slack app ในพื้นที่ทำงานของคุณและใช้ bot token สำหรับการเข้าถึง API
- สร้าง app ที่ api.slack.com/apps
- เพิ่ม OAuth scopes ที่จำเป็นใต้ “OAuth & Permissions”
- ติดตั้ง app ในพื้นที่ทำงาน
- คัดลอก 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
สำหรับการแจกจ่าย Slack integration ของคุณไปยังหลาย 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}"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 filesการเข้าถึงอีเมลผู้ใช้
scope users:read.email จำเป็นสำหรับการจับคู่ผู้ใช้ Slack กับผู้ติดต่อ Brevo หากไม่มี การแมปผู้ใช้จะจำกัดเพียง display names
การกำหนดค่า
การตั้งค่าพื้นฐาน
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_alertการแมปฟิลด์
แมปข้อมูลผู้ใช้ Slack กับแอตทริบิวต์ผู้ติดต่อ Brevo:
การแมปค่าเริ่มต้น
| Parameter | Type | Description |
|---|---|---|
profile.email required | string | อีเมลผู้ใช้ (ตัวระบุที่ไม่ซ้ำกันสำหรับการจับคู่ Brevo) |
real_name optional | string | ชื่อเต็ม แยกเป็น FIRSTNAME/LASTNAME |
profile.phone optional | string | แมปกับแอตทริบิวต์ SMS |
profile.title optional | string | ตำแหน่งงาน |
tz optional | string | เขตเวลาของผู้ใช้ |
is_admin optional | boolean | สถานะผู้ดูแลระบบ workspace |
team_id optional | string | Team ID ของ workspace |
status_text optional | string | สถานะที่กำหนดเองของผู้ใช้ |
เมธอด API
การส่งข้อความ
| เมธอด | Endpoint | คำอธิบาย |
|---|---|---|
POST | chat.postMessage | ส่งข้อความไปยัง channel |
POST | chat.update | อัปเดตข้อความที่มีอยู่ |
POST | chat.delete | ลบข้อความ |
POST | chat.scheduleMessage | กำหนดเวลาข้อความ |
POST | chat.postEphemeral | ส่งข้อความ ephemeral ให้ผู้ใช้ |
Channels
| เมธอด | Endpoint | คำอธิบาย |
|---|---|---|
GET | conversations.list | แสดงรายการ channels |
GET | conversations.info | ดูข้อมูล channel |
GET | conversations.members | แสดงรายการสมาชิก channel |
GET | conversations.history | ดูข้อความ channel |
ผู้ใช้
| เมธอด | Endpoint | คำอธิบาย |
|---|---|---|
GET | users.list | แสดงรายการผู้ใช้ workspace |
GET | users.info | ดูข้อมูลผู้ใช้ |
GET | users.lookupByEmail | ค้นหาผู้ใช้ตามอีเมล |
GET | users.conversations | แสดงรายการ channels ของผู้ใช้ |
การโต้ตอบ
| เมธอด | Endpoint | คำอธิบาย |
|---|---|---|
POST | views.open | เปิด modal view |
POST | views.update | อัปเดต modal view |
POST | reactions.add | เพิ่ม emoji reaction |
เหตุการณ์
การแจ้งเตือน Brevo ไปยัง Slack
| เหตุการณ์ | ทริกเกอร์ | การกระทำ Slack |
|---|---|---|
new_subscriber | ผู้ติดต่อถูกสร้างใน Brevo | โพสต์ไปยัง #marketing |
campaign_sent | ส่งแคมเปญอีเมล | โพสต์สรุปไปยัง #marketing |
order_placed | ตรวจพบคำสั่งซื้อมูลค่าสูง | โพสต์ไปยัง #sales พร้อมรายละเอียด |
cart_abandoned | ตะกร้าถูกละทิ้ง 30 นาที | โพสต์ไปยัง #sales สำหรับติดตาม |
ticket_created | เปิดตั๋วสนับสนุน | โพสต์ไปยัง #support |
unsubscribed | ผู้ติดต่อยกเลิกการสมัคร | โพสต์การแจ้งเตือนไปยัง #marketing |
ทริกเกอร์ Slack ไปยัง Brevo
| เหตุการณ์ Slack | ทริกเกอร์ | การกระทำ Brevo |
|---|---|---|
message_action | Custom message shortcut | เพิ่มผู้ติดต่อในรายการหรือทริกเกอร์ระบบอัตโนมัติ |
block_actions | คลิกปุ่มในข้อความ | อัปเดตแอตทริบิวต์ผู้ติดต่อหรือส่งอีเมล |
view_submission | ส่งฟอร์ม Modal | สร้างผู้ติดต่อหรือทริกเกอร์เวิร์กโฟลว์ |
ตัวอย่างโค้ด
เริ่มต้น 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 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' } ] } ] }});จัดการการโต้ตอบ Slack
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();});ขีดจำกัดอัตรา
Slack API rate limits ใช้ระบบหลายระดับ:
| ระดับ | ขีดจำกัด | เมธอดทั่วไป |
|---|---|---|
| Tier 1 | 1 คำขอ/นาที | chat.delete, conversations.kick |
| Tier 2 | 20 คำขอ/นาที | conversations.history, users.info |
| Tier 3 | 50 คำขอ/นาที | conversations.list, users.list |
| Tier 4 | 100 คำขอ/นาที | chat.postMessage |
| พิเศษ | แตกต่างกัน | chat.postMessage ไปยัง channel เดียวกัน: 1/วินาที |
ขีดจำกัดเพิ่มเติม:
- Web API: Burst limit พร้อม short-term throttle
- Events API: ลองส่งซ้ำ 3 ครั้ง
- Incoming Webhooks: 1 ข้อความ/วินาทีต่อ webhook URL
- Block Kit: สูงสุด 50 blocks ต่อข้อความ
อัตราการโพสต์ใน Channel
การโพสต์ไปยัง channel เดียวกันจำกัดประมาณ 1 ข้อความต่อวินาที Batch การแจ้งเตือนหรือใช้ threads เพื่อหลีกเลี่ยงการถูกจำกัดอัตรา
การแก้ไขปัญหา
ปัญหาทั่วไป
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
not_authed | Bot token ไม่ถูกต้อง | ติดตั้ง app ใหม่และคัดลอก bot token ใหม่ |
channel_not_found | Bot ไม่ได้อยู่ใน channel | เชิญ bot เข้า channel เป้าหมาย |
missing_scope | ไม่ได้รับ scope ที่จำเป็น | เพิ่ม scope และติดตั้ง app ใหม่ |
| ไม่ได้รับเหตุการณ์ | ไม่ได้ตั้งค่า Event subscription | กำหนดค่า URL Event Subscriptions |
| หมดเวลาการโต้ตอบ | การตอบสนองนาน >3 วินาที | ตอบด้วย 200 ทันที ประมวลผลแบบ async |
โหมด Debug
เปิดใช้งาน verbose logging:
connectors: slack: debug: true log_level: verbose log_events: trueทดสอบการเชื่อมต่อ
tajo connectors test slack# ✓ Bot token valid# ✓ Workspace accessible# ✓ Channels readable# ✓ Message posting enabled# ✓ Event subscriptions activeแนวทางปฏิบัติที่ดีที่สุด
- ใช้ Block Kit - สร้างข้อความที่สมบูรณ์และโต้ตอบได้ด้วย Block Kit framework ของ Slack
- ตอบสนองอย่างรวดเร็ว - ยืนยันการโต้ตอบภายใน 3 วินาที ประมวลผลแบบ asynchronous
- จัดกลุ่มข้อความที่เกี่ยวข้องใน threads - จัดกลุ่มการแจ้งเตือนที่เกี่ยวข้องใน threads เพื่อลด noise
- กำหนดเส้นทางตาม channel - ส่งประเภทเหตุการณ์ที่แตกต่างกันไปยัง channels ของทีมที่เหมาะสม
- รวมปุ่มการกระทำ - เพิ่มปุ่ม “View in Brevo” สำหรับการเข้าถึงข้อมูลลูกค้าอย่างรวดเร็ว
- ใช้ unfurling - แสดงตัวอย่าง rich previews สำหรับลิงก์ Brevo ที่แชร์ใน Slack
ความปลอดภัย
- Bot Token - OAuth-scoped access token พร้อมสิทธิ์แบบละเอียด
- การตรวจสอบลายเซ็นคำขอ - HMAC SHA-256 signature verification สำหรับคำขอขาเข้า
- OAuth 2.0 - การอนุญาตมาตรฐานอุตสาหกรรมสำหรับการแจกจ่ายหลาย workspace
- การเข้ารหัส TLS - การสื่อสาร API ทั้งหมดเข้ารหัสผ่าน HTTPS
- การหมุนเวียน token - การหมุนเวียน token อัตโนมัติสำหรับความปลอดภัยที่เพิ่มขึ้น