Twilio Flex 连接器
通过 Tajo 将您的 Twilio Flex 联络中心连接到 Brevo,实现统一的客户互动历史、会话后营销流程和支持驱动的互动分析。
概览
| 属性 | 值 |
|---|---|
| 平台 | Twilio Flex |
| 类别 | 自定义 |
| 设置复杂度 | 高级 |
| 官方集成 | 否 |
| 同步数据 | 用户、会话、事件 |
| 使用的 API | Flex API、Conversations API、TaskRouter API |
| 认证方式 | Account SID + Auth Token / API 密钥 |
| 基础 URL | https://flex-api.twilio.com |
功能
- 会话同步 - 将语音、短信、WhatsApp 和聊天互动转发到 Brevo 时间线
- 客户档案富化 - 将 Flex 客户数据同步到 Brevo 联系人属性
- 会话后活动 - 支持会话结束后触发 Brevo 工作流
- CSAT 事件跟踪 - 将满意度调查结果作为 Brevo 事件同步
- 坐席活动数据 - 追踪坐席绩效指标,用于运营报告
- 队列分析 - 转发等待时间和放弃数据,用于体验优化
前提条件
开始之前,请确保您已具备:
- 已启用 Flex 的 Twilio 账户
- Twilio Account SID 和 Auth Token
- 具有活跃频道(语音、短信、聊天或 WhatsApp)的 Flex 实例
- 已配置 TaskRouter 工作区
- 具有 API 访问权限的 Brevo 账户
- 具有有效订阅的 Tajo 账户
认证
Twilio Flex 使用 Twilio 的标准认证方式。
账户凭据
# Basic Auth: Account SID as username, Auth Token as passwordcurl -X GET "https://flex-api.twilio.com/v1/Configuration" \ -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"API 密钥(推荐用于生产环境)
- 前往 Twilio 控制台 > 账户 > API 密钥和令牌
- 点击创建 API 密钥
- 选择标准密钥类型
- 安全存储 SID 和密钥
curl -X GET "https://flex-api.twilio.com/v1/Configuration" \ -u "$TWILIO_API_KEY_SID:$TWILIO_API_KEY_SECRET"Auth Token 与 API 密钥
您的 Auth Token 具有完整账户访问权限。生产环境请使用范围化的 API 密钥。API 密钥可单独撤销,不会影响其他集成。
连接到 Tajo
tajo connectors install twilio-flex \ --account-sid $TWILIO_ACCOUNT_SID \ --auth-token $TWILIO_AUTH_TOKEN \ --flex-flow-sid $TWILIO_FLEX_FLOW_SID配置
基础设置
connectors: twilio_flex: enabled: true account_sid: "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" flex_flow_sid: "FOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
sync: conversations: true tasks: true customers: true csat: true agent_activity: false
lists: support_contacts: 32 csat_respondents: 33
channels: - voice - sms - whatsapp - webchat字段映射
将 Flex 客户和互动数据映射到 Brevo 属性:
field_mapping: # Customer fields identity: FLEX_IDENTITY friendly_name: FIRSTNAME attributes.email: email attributes.phone: SMS
# Interaction metrics last_conversation_date: LAST_SUPPORT_DATE total_conversations: SUPPORT_TICKET_COUNT avg_wait_time: AVG_WAIT_TIME last_csat_score: CSAT_SCORE preferred_channel: PREFERRED_CHANNEL
# Custom attributes customer_tier: VIP_TIER account_id: ACCOUNT_ID事件映射
event_mapping: task.created: SUPPORT_REQUESTED task.completed: SUPPORT_RESOLVED task.canceled: SUPPORT_ABANDONED conversation.ended: CONVERSATION_ENDED survey.completed: CSAT_SUBMITTEDAPI 端点
Tajo 集成以下 Twilio Flex 及相关 API 端点:
| 端点 | 方法 | API | 用途 |
|---|---|---|---|
/v1/Configuration | GET | Flex | 获取 Flex 配置 |
/v1/Interactions | GET | Flex | 列出互动 |
/v1/Channels | GET | Flex | 列出 Flex 频道 |
/v1/WebChannels | POST | Flex | 创建网页聊天频道 |
/v1/Conversations | GET | Conversations | 列出会话 |
/v1/Conversations/{sid}/Messages | GET | Conversations | 列出会话消息 |
/v1/Conversations/{sid}/Participants | GET | Conversations | 列出参与者 |
/v1/Workspaces/{sid}/Tasks | GET | TaskRouter | 列出任务 |
/v1/Workspaces/{sid}/Workers | GET | TaskRouter | 列出工作人员(坐席) |
/v1/Workspaces/{sid}/TaskQueues | GET | TaskRouter | 列出任务队列 |
/v1/Workspaces/{sid}/Events | GET | TaskRouter | 列出工作区事件 |
代码示例
初始化连接器
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('twilio-flex', { accountSid: process.env.TWILIO_ACCOUNT_SID, authToken: process.env.TWILIO_AUTH_TOKEN, flexFlowSid: process.env.TWILIO_FLEX_FLOW_SID});同步会话历史
await tajo.connectors.sync('twilio-flex', { type: 'incremental', resources: ['conversations'], since: '2024-01-01', channels: ['voice', 'sms', 'whatsapp']});
const status = await tajo.connectors.status('twilio-flex');console.log(status);// {// connected: true,// lastSync: '2024-03-15T16:00:00Z',// conversationsTracked: 12400,// customersLinked: 8900,// agentsMonitored: 45// }会话后活动触发
// Trigger a Brevo follow-up after a support conversation endsapp.post('/webhooks/flex/task-complete', async (req, res) => { const task = req.body;
await tajo.connectors.handleEvent('twilio-flex', { type: 'task.completed', payload: { taskSid: task.TaskSid, customerEmail: task.TaskAttributes?.email, channel: task.TaskChannelUniqueName, duration: task.Age, queueName: task.TaskQueueFriendlyName } });
res.status(200).send('OK');});Flex 插件集成
// Inside a Flex UI Plugin - send data to Tajoimport { FlexPlugin } from '@twilio/flex-plugin';
class TajoPlugin extends FlexPlugin { init(flex, manager) { flex.Actions.addListener('afterCompleteTask', async (payload) => { await fetch('https://api.tajo.io/webhooks/flex/task-complete', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ TaskSid: payload.task.sid, TaskAttributes: payload.task.attributes, TaskChannelUniqueName: payload.task.taskChannelUniqueName, Age: payload.task.age }) }); }); }}速率限制
Twilio 跨其 API 实施速率限制:
| API | 速率限制 | 说明 |
|---|---|---|
| Flex API | 100 请求/秒 | 每账户 |
| Conversations API | 100 请求/秒 | 每账户 |
| TaskRouter API | 30 读取请求/秒 | 每工作区 |
| TaskRouter 事件 | 20 请求/秒 | 每工作区 |
事件流
对于高流量事件处理,考虑使用 Twilio 事件流而非轮询 TaskRouter 事件。事件流通过 Webhook 或 Kinesis 实时推送事件。
故障排除
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 401 Unauthorized | SID 或令牌无效 | 在 Twilio 控制台中验证 Account SID 和 Auth Token |
| 403 Forbidden | Flex 未启用 | 确保您的 Twilio 账户已激活 Flex |
| 会话缺失 | 日期范围错误 | 扩展同步日期范围或检查会话状态 |
| 任务未追踪 | TaskRouter 工作区不匹配 | 验证正确的工作区 SID |
| 插件未触发 | 事件监听器未注册 | 检查 Flex 插件是否已部署并激活 |
调试模式
connectors: twilio_flex: debug: true log_level: verbose log_api_calls: true测试连接
tajo connectors test twilio-flex# ✓ Flex API connection successful# ✓ Conversations API accessible# ✓ TaskRouter workspace found# ✓ Agent list readable# ✓ Queue configuration loaded最佳实践
- 使用 API 密钥而非 Auth Token - API 密钥可范围化且可单独撤销
- 利用事件流 - 基于推送的事件比轮询 TaskRouter 更高效
- 构建 Flex 插件 - 使用 UI 插件实时捕获任务完成事件
- 一致映射频道 - 将语音、短信和聊天数据规范化为统一的 Brevo 事件
- 追踪 CSAT 评分 - 将满意度数据同步到 Brevo 用于体验驱动的细分
- 监控队列指标 - 使用等待时间数据触发主动客户通信
安全
- Account SID + Auth Token - Twilio 标准认证
- API 密钥 - 可撤销的非根凭据,用于生产环境
- 仅 HTTPS - 所有 API 通信通过 TLS 1.2+ 加密
- Webhook 验证 - 使用
X-Twilio-Signature验证 Twilio Webhook 签名 - PCI 合规 - Twilio Flex 通过 PCI DSS Level 1 合规
- 加密存储 - 凭据在 Tajo 中静态加密