Slack 커넥터
Tajo를 통해 Slack 워크스페이스를 Brevo에 연결하여 실시간 마케팅 알림, 고객 이벤트에 대한 팀 알림, Slack 상호작용으로 트리거되는 워크플로 자동화를 구현하십시오.
개요
| 속성 | 값 |
|---|---|
| 플랫폼 | Slack |
| 카테고리 | Custom Integration |
| 설정 복잡도 | 쉬움 |
| 공식 통합 | 예 |
| 동기화 데이터 | 사용자, 채널, 메시지, 이벤트 |
| API Base URL | https://slack.com/api |
기능
- 마케팅 알림 - 캠페인 이벤트, 신규 구독자, 매출 마일스톤에 대한 실시간 알림 전송
- 고객 이벤트 알림 - Brevo의 고가치 고객 액션에 대해 팀에게 알림
- 워크플로 트리거 - Slack 상호작용(버튼 클릭, 폼 제출)을 사용하여 Brevo 자동화 트리거
- 채널 기반 라우팅 - 이벤트 유형이나 고객 세그먼트에 따라 특정 채널로 알림 라우팅
- 사용자 동기화 - 내부 커뮤니케이션을 위해 Slack 워크스페이스 사용자를 Brevo 연락처에 매핑
- 대화형 메시지 - 팀 워크플로용 버튼과 액션이 포함된 풍부한 메시지 전송
- 예약 메시지 - 일일/주간 마케팅 요약 알림 예약
- 스레드 지원 - 정리된 커뮤니케이션을 위해 관련 알림을 스레드로 그룹화
사전 요구 사항
시작하기 전에 다음이 준비되어 있는지 확인하십시오.
- 관리자 접근 권한이 있는 Slack 워크스페이스
- api.slack.com/apps에서 생성된 Slack 앱
- 필수 범위가 있는 봇 토큰
- API 접근이 가능한 Brevo 계정
- Tajo 계정
인증
봇 토큰 (권장)
Slack 앱을 워크스페이스에 설치하고 API 접근에 봇 토큰을 사용하십시오.
- api.slack.com/apps에서 앱 생성
- “OAuth & Permissions” 아래에서 필수 OAuth 범위 추가
- 워크스페이스에 앱 설치
- 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 통합을 여러 워크스페이스에 배포하려면:
# 인증 URLhttps://slack.com/oauth/v2/authorize? client_id={client_id}& scope=chat:write,channels:read,users:read& redirect_uri={redirect_uri}
# 토큰 교환curl -X POST "https://slack.com/api/oauth.v2.access" \ -d "client_id={client_id}" \ -d "client_secret={client_secret}" \ -d "code={auth_code}"필수 봇 범위
chat:write # 메시지 전송channels:read # 채널 목록channels:history # 채널 메시지 읽기users:read # 워크스페이스 사용자 목록users:read.email # 사용자 이메일 주소 읽기reactions:write # 메시지에 반응 추가files:write # 파일 업로드사용자 이메일 접근
users:read.email 범위는 Slack 사용자를 Brevo 연락처와 일치시키기 위해 필요합니다. 이것이 없으면 사용자 매핑이 표시 이름으로 제한됩니다.
구성
기본 설정
connectors: slack: enabled: true bot_token: "${SLACK_BOT_TOKEN}" signing_secret: "${SLACK_SIGNING_SECRET}"
# 알림 채널 channels: marketing: "C01234567" sales: "C01234568" support: "C01234569" alerts: "C01234570"
# 이벤트 라우팅 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 | 워크스페이스 관리자 상태 |
team_id optional | string | 워크스페이스 팀 ID |
status_text optional | string | 사용자 맞춤 상태 |
API 메서드
메시징
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
POST | chat.postMessage | 채널에 메시지 전송 |
POST | chat.update | 기존 메시지 업데이트 |
POST | chat.delete | 메시지 삭제 |
POST | chat.scheduleMessage | 메시지 예약 |
POST | chat.postEphemeral | 사용자에게 임시 메시지 전송 |
채널
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | conversations.list | 채널 목록 |
GET | conversations.info | 채널 정보 가져오기 |
GET | conversations.members | 채널 멤버 목록 |
GET | conversations.history | 채널 메시지 가져오기 |
사용자
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | users.list | 워크스페이스 사용자 목록 |
GET | users.info | 사용자 정보 가져오기 |
GET | users.lookupByEmail | 이메일로 사용자 찾기 |
GET | users.conversations | 사용자 채널 목록 |
상호작용
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
POST | views.open | 모달 뷰 열기 |
POST | views.update | 모달 뷰 업데이트 |
POST | reactions.add | 이모지 반응 추가 |
이벤트
Brevo-to-Slack 알림
| 이벤트 | 트리거 | Slack 액션 |
|---|---|---|
new_subscriber | Brevo에 연락처 생성 | #marketing에 게시 |
campaign_sent | 이메일 캠페인 전송됨 | #marketing에 요약 게시 |
order_placed | 고가치 주문 감지됨 | 상세 정보와 함께 #sales에 게시 |
cart_abandoned | 30분 동안 카트 방치됨 | 후속 조치를 위해 #sales에 게시 |
ticket_created | 지원 티켓 열림 | #support에 게시 |
unsubscribed | 연락처 구독 취소됨 | #marketing에 알림 게시 |
Slack-to-Brevo 트리거
| Slack 이벤트 | 트리거 | Brevo 액션 |
|---|---|---|
message_action | 맞춤 메시지 단축키 | 목록에 연락처 추가 또는 자동화 트리거 |
block_actions | 메시지의 버튼 클릭 | 연락처 속성 업데이트 또는 이메일 전송 |
view_submission | 모달 폼 제출됨 | 연락처 생성 또는 워크플로 트리거 |
코드 예제
커넥터 초기화
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Slack 연결await tajo.connectors.connect('slack', { botToken: process.env.SLACK_BOT_TOKEN, signingSecret: process.env.SLACK_SIGNING_SECRET});마케팅 알림 전송
// 고가치 주문이 발생하면 알림 전송await 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) => { // Slack 요청 서명 확인 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);
// 버튼 액션 처리 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 속도 제한은 계층화된 시스템을 사용합니다.
| 티어 | 제한 | 일반적인 메서드 |
|---|---|---|
| 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: 1/초 |
추가 제한:
- Web API: 단기 스로틀을 사용한 버스트 제한
- Events API: 3회 배달 재시도
- Incoming Webhooks: 웹훅 URL당 1 메시지/초
- Block Kit: 메시지당 최대 50 블록
채널 게시 속도
동일한 채널에 게시하는 것은 약 초당 1 메시지로 제한됩니다. 속도 제한을 피하려면 알림을 배치 처리하거나 스레드를 사용하십시오.
문제 해결
일반적인 문제
| 문제 | 원인 | 해결 방법 |
|---|---|---|
not_authed | 잘못된 봇 토큰 | 앱을 재설치하고 새 봇 토큰 복사 |
channel_not_found | 봇이 채널에 없음 | 봇을 대상 채널에 초대 |
missing_scope | 필수 범위가 부여되지 않음 | 범위를 추가하고 앱 재설치 |
| 이벤트가 수신되지 않음 | 이벤트 구독이 설정되지 않음 | Event Subscriptions URL 구성 |
| 상호작용 시간 초과 | 응답이 3초 초과 | 즉시 200으로 응답하고 비동기 처리 |
디버그 모드
자세한 로깅 활성화:
connectors: slack: debug: true log_level: verbose log_events: true연결 테스트
tajo connectors test slack# ✓ 봇 토큰 유효함# ✓ 워크스페이스 접근 가능# ✓ 채널 읽기 가능# ✓ 메시지 게시 활성화됨# ✓ 이벤트 구독 활성 상태모범 사례
- Block Kit 사용 - Slack의 Block Kit 프레임워크로 풍부하고 대화형 메시지 구축
- 빠른 응답 - 3초 이내에 상호작용을 확인하고 비동기로 처리
- 관련 메시지를 스레드화 - 노이즈를 줄이기 위해 관련 알림을 스레드로 그룹화
- 채널별 라우팅 - 다양한 이벤트 유형을 적절한 팀 채널로 전송
- 액션 버튼 포함 - 고객 데이터에 빠르게 접근할 수 있도록 “View in Brevo” 버튼 추가
- 언퍼링 구현 - Slack에서 공유된 Brevo 링크에 대한 풍부한 미리보기 표시
보안
- 봇 토큰 - 세분화된 권한이 있는 OAuth 범위 액세스 토큰
- 요청 서명 - 들어오는 요청에 대한 HMAC SHA-256 서명 확인
- OAuth 2.0 - 다중 워크스페이스 배포를 위한 업계 표준 인증
- TLS 암호화 - HTTPS를 통한 모든 API 통신 암호화
- 토큰 교체 - 향상된 보안을 위한 자동 토큰 교체