Twilio Flex 连接器

通过 Tajo 将您的 Twilio Flex 联络中心连接到 Brevo,实现统一的客户互动历史、会话后营销流程和支持驱动的互动分析。

概览

属性
平台Twilio Flex
类别自定义
设置复杂度高级
官方集成
同步数据用户、会话、事件
使用的 APIFlex API、Conversations API、TaskRouter API
认证方式Account SID + Auth Token / API 密钥
基础 URLhttps://flex-api.twilio.com

功能

  • 会话同步 - 将语音、短信、WhatsApp 和聊天互动转发到 Brevo 时间线
  • 客户档案富化 - 将 Flex 客户数据同步到 Brevo 联系人属性
  • 会话后活动 - 支持会话结束后触发 Brevo 工作流
  • CSAT 事件跟踪 - 将满意度调查结果作为 Brevo 事件同步
  • 坐席活动数据 - 追踪坐席绩效指标,用于运营报告
  • 队列分析 - 转发等待时间和放弃数据,用于体验优化

前提条件

开始之前,请确保您已具备:

  1. 已启用 Flex 的 Twilio 账户
  2. Twilio Account SID 和 Auth Token
  3. 具有活跃频道(语音、短信、聊天或 WhatsApp)的 Flex 实例
  4. 已配置 TaskRouter 工作区
  5. 具有 API 访问权限的 Brevo 账户
  6. 具有有效订阅的 Tajo 账户

认证

Twilio Flex 使用 Twilio 的标准认证方式。

账户凭据

Terminal window
# Basic Auth: Account SID as username, Auth Token as password
curl -X GET "https://flex-api.twilio.com/v1/Configuration" \
-u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN"

API 密钥(推荐用于生产环境)

  1. 前往 Twilio 控制台 > 账户 > API 密钥和令牌
  2. 点击创建 API 密钥
  3. 选择标准密钥类型
  4. 安全存储 SID 和密钥
Terminal window
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

Terminal window
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_SUBMITTED

API 端点

Tajo 集成以下 Twilio Flex 及相关 API 端点:

端点方法API用途
/v1/ConfigurationGETFlex获取 Flex 配置
/v1/InteractionsGETFlex列出互动
/v1/ChannelsGETFlex列出 Flex 频道
/v1/WebChannelsPOSTFlex创建网页聊天频道
/v1/ConversationsGETConversations列出会话
/v1/Conversations/{sid}/MessagesGETConversations列出会话消息
/v1/Conversations/{sid}/ParticipantsGETConversations列出参与者
/v1/Workspaces/{sid}/TasksGETTaskRouter列出任务
/v1/Workspaces/{sid}/WorkersGETTaskRouter列出工作人员(坐席)
/v1/Workspaces/{sid}/TaskQueuesGETTaskRouter列出任务队列
/v1/Workspaces/{sid}/EventsGETTaskRouter列出工作区事件

代码示例

初始化连接器

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 ends
app.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 Tajo
import { 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 API100 请求/秒每账户
Conversations API100 请求/秒每账户
TaskRouter API30 读取请求/秒每工作区
TaskRouter 事件20 请求/秒每工作区

事件流

对于高流量事件处理,考虑使用 Twilio 事件流而非轮询 TaskRouter 事件。事件流通过 Webhook 或 Kinesis 实时推送事件。

故障排除

常见问题

问题原因解决方案
401 UnauthorizedSID 或令牌无效在 Twilio 控制台中验证 Account SID 和 Auth Token
403 ForbiddenFlex 未启用确保您的 Twilio 账户已激活 Flex
会话缺失日期范围错误扩展同步日期范围或检查会话状态
任务未追踪TaskRouter 工作区不匹配验证正确的工作区 SID
插件未触发事件监听器未注册检查 Flex 插件是否已部署并激活

调试模式

connectors:
twilio_flex:
debug: true
log_level: verbose
log_api_calls: true

测试连接

Terminal window
tajo connectors test twilio-flex
# ✓ Flex API connection successful
# ✓ Conversations API accessible
# ✓ TaskRouter workspace found
# ✓ Agent list readable
# ✓ Queue configuration loaded

最佳实践

  1. 使用 API 密钥而非 Auth Token - API 密钥可范围化且可单独撤销
  2. 利用事件流 - 基于推送的事件比轮询 TaskRouter 更高效
  3. 构建 Flex 插件 - 使用 UI 插件实时捕获任务完成事件
  4. 一致映射频道 - 将语音、短信和聊天数据规范化为统一的 Brevo 事件
  5. 追踪 CSAT 评分 - 将满意度数据同步到 Brevo 用于体验驱动的细分
  6. 监控队列指标 - 使用等待时间数据触发主动客户通信

安全

  • 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 中静态加密

相关资源

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI 助手

你好!关于文档有任何问题都可以问我。