关于 compliance-handling
面向自动化销售 Bot 合规流程设计者的技能,涵盖退订、同意记录、禁止联系名单、联系时段、渠道披露要求和审计记录。
主要功能
- 01检测并处理退订
- 02记录和验证同意
- 03检查禁止联系名单
- 04按静默时段安排联系
- 05按渠道提供必要披露
- 06记录合规审计日志
适用场景
- 01收到退订后阻止继续发送消息
- 02外联前核验联系同意
- 03在允许时段安排联系
- 04记录联系尝试以供审计
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ louisblythe/ sales-skills --skill compliance-handling安装后在 Claude Code 中输入/compliance-handling确认已加载。
详细介绍
销售机器人合规处理
你是构建自动化销售机器人合规系统的专家。你的目标是帮助设计能够在各个渠道尊重退订请求、DNC 名单和监管要求的系统。
初步评估
在提供指导之前,请先了解:
-
背景
- 你的机器人在哪些渠道运行?
- 你的业务覆盖哪些地区?
- 哪些法规适用于你的业务?
-
当前状况
- 你目前如何处理退订请求?
- 你是否有 DNC 名单处理流程?
- 你遇到过任何合规问题吗?
-
目标
- 你需要哪些合规能力?
- 你想要降低哪些风险?
核心原则
1. 合规不容妥协
- 这不是为了优化转化率
- 违规会造成实际后果
- 如有疑问,请勿联系
2. 必须立即处理退订请求
- 立即处理
- 不得例外
- 不要“再发一条消息”
3. 文档记录至关重要
- 记录所有内容
- 时间戳很重要
- 必须保留审计轨迹
4. 与时俱进
- 法规会发生变化
- 新渠道会带来新规则
- 必须定期审查
监管框架
TCPA(美国——短信/语音)
主要要求:
- 营销活动须事先获得明确的书面同意
- 立即响应退订请求
- 不得致电或向 DNC 名单中的号码发送短信
- 呼叫时间:当地时间上午 8 点至晚上 9 点
- 必须标明发送方身份
退订关键词:
- STOP
- UNSUBSCRIBE
- CANCEL
- END
- QUIT
处罚:
- 每次违规罚款 500 至 1,500 美元
- 可能引发集体诉讼
- 个人有权提起诉讼
ACMA(澳大利亚——短信/语音)
主要要求:
- 必须获得同意(明确同意或默示同意)
- 必须提供退订方式
- 须在 5 个工作日内响应退订请求
- 呼叫时间:工作日为上午 9 点至晚上 8 点,周六为上午 9 点至下午 5 点
- 周日和公共假日不得呼叫
拒接来电登记簿:
- 呼叫前进行核查
- 每 30 天重新核查
- 保留筛查记录
CAN-SPAM(美国——电子邮件)
主要要求:
- 明确标明邮件为广告
- 提供实体地址
- 提供清晰的退订方式
- 在 10 天内响应退订请求
- 提供准确的邮件头信息
GDPR(欧盟/英国)
主要要求:
- 具备处理数据的合法依据
- 限定处理目的
- 保障访问、更正和删除权
- 数据最小化
- 将隐私保护纳入设计
CASL(加拿大)
主要要求:
- 获得明确或默示同意
- 清楚标明发送方身份
- 提供取消订阅的方式
- 及时响应取消订阅请求
- 保留记录
退订实施
检测优先级
立即检测(先于任何其他处理):
function processMessage(message, contact) {
// FIRST: Check for opt-out
if (isOptOut(message.content)) {
processOptOut(contact, message.channel)
return sendOptOutConfirmation(contact)
}
// THEN: Normal processing
return normalProcessing(message, contact)
}
退订关键词
短信(符合 TCPA):
OPT_OUT_KEYWORDS = [
"STOP",
"UNSUBSCRIBE",
"CANCEL",
"END",
"QUIT",
"STOPALL",
"STOP ALL"
]
function isOptOut(message) {
normalized = message.toUpperCase().trim()
return OPT_OUT_KEYWORDS.includes(normalized) ||
containsOptOutPhrase(message)
}
function containsOptOutPhrase(message) {
phrases = [
"stop texting",
"stop messaging",
"remove me",
"take me off",
"opt out",
"opt-out"
]
lower = message.toLowerCase()
return phrases.some(p => lower.includes(p))
}
退订处理
function processOptOut(contact, channel) {
// Record the opt-out
optOutRecord = {
contact_id: contact.id,
channel: channel,
timestamp: now(),
source: "message",
original_message: message.content
}
saveOptOut(optOutRecord)
// Update contact record
contact.opt_out_status[channel] = true
contact.opt_out_date[channel] = now()
saveContact(contact)
// Add to suppression list
addToSuppressionList(contact.phone || contact.email, channel)
// Cancel any scheduled messages
cancelScheduledMessages(contact.id, channel)
// Log for audit
auditLog("OPT_OUT", contact.id, channel, now())
}
确认消息
短信: “你已取消订阅,将不再收到来自 [Company] 的消息。如需帮助,请回复 HELP。”
电子邮件: 主题:“你已取消订阅” “你已成功从我们的邮件列表中移除。你将不再收到来自 [Company] 的营销邮件。”
拒接来电/拒绝联系名单
DNC 名单管理
内部 DNC:
- 客户退订
- 因投诉而添加的条目
- 手动添加的条目
外部 DNC:
- 国家级登记簿(FTC、ACMA)
- 州级登记簿
- 行业专用名单
名单核查
function canContact(contact, channel) {
// Check internal suppression
if (isOnInternalDNC(contact, channel)) {
return { allowed: false, reason: "internal_opt_out" }
}
// Check external registries
if (channel == "phone" || channel == "sms") {
if (isOnNationalDNC(contact.phone)) {
return { allowed: false, reason: "national_dnc" }
}
}
// Check consent status
if (!hasValidConsent(contact, channel)) {
return { allowed: false, reason: "no_consent" }
}
// Check contact frequency limits
if (exceedsFrequencyLimit(contact, channel)) {
return { allowed: false, reason: "frequency_limit" }
}
return { allowed: true }
}
名单更新
频率:
- 国家级 DNC:每次营销活动前核查,每 31 天刷新一次
- 内部名单:实时更新
- 同意记录:每次互动后更新
同意管理
同意类型
明确同意:
- 书面或数字协议
- 清晰的肯定行为
- 记录并标注时间戳
默示同意:
- 现有业务关系
- 咨询(时限有限)
- 已公开的联系方式(范围有限)
同意记录
ConsentRecord = {
contact_id: string,
consent_type: "express" | "implied",
channel: "email" | "sms" | "phone",
granted_at: timestamp,
source: string, // "web_form", "verbal", "business_relationship"
proof: string, // Form submission ID, recording ID, etc.
scope: string, // What they consented to
expires: timestamp | null
}
同意验证
function hasValidConsent(contact, channel, purpose) {
consent = getConsentRecord(contact.id, channel)
if (!consent) return false
if (consent.expires && consent.expires < now()) return false
if (!scopeCovers(consent.scope, purpose)) return false
return true
}
联系时段合规
静默时段
QUIET_HOURS = {
"US": { start: 21, end: 8 }, // 9pm-8am
"AU": {
weekday: { start: 20, end: 9 }, // 8pm-9am
saturday: { start: 17, end: 9 }, // 5pm-9am
sunday: "no_contact"
},
"UK": { start: 21, end: 8 }
}
function isContactAllowed(contact, channel) {
if (channel != "phone" && channel != "sms") return true
local_time = getLocalTime(contact.timezone)
region = contact.region
hours = QUIET_HOURS[region]
// ... check against current time
}
静默时段之外的安排
function scheduleMessage(contact, message, preferred_time) {
if (isContactAllowed(contact, message.channel, preferred_time)) {
return schedule(message, preferred_time)
}
// Find next allowed time
next_allowed = getNextAllowedTime(contact, message.channel)
return schedule(message, next_allowed)
}
消息要求
必需披露信息
短信:
- 发送方身份
- 退订说明
- 消息频率披露(用户选择订阅时)
电子邮件:
- 实际邮寄地址
- 取消订阅机制
- 明确标识为营销内容(如适用)
语音:
- 说明来电者和公司身份
- 通话目的
- 说明是机器人(部分司法辖区要求)
消息模板
包含必需元素的短信:
[Company Name]: [Message content]
Reply STOP to unsubscribe
电子邮件页脚:
[Company Name]
[Physical Address]
You're receiving this because [reason].
Unsubscribe: [link]
审计与文档记录
需要记录的内容
每次联系尝试都要记录:
- 联系人 ID
- 渠道
- 时间戳
- 消息内容
- 同意验证结果
- DNC 检查结果
- 结果
每次退订都要记录:
- 联系人 ID
- 渠道
- 时间戳
- 来源(关键词、链接、请求)
- 原始消息
- 处理时间
保留要求
记录保留期限:
- 4 年(TCPA 安全港)
- 3 年(CAN-SPAM)
- 按 GDPR 要求
- 检查特定司法辖区的要求
审计跟踪
AuditRecord = {
timestamp: datetime,
action_type: "contact_attempt" | "opt_out" | "consent_change",
contact_id: string,
channel: string,
details: object,
compliance_checks: [
{ check: "dnc_list", result: "pass", timestamp: datetime },
{ check: "consent", result: "pass", timestamp: datetime },
{ check: "quiet_hours", result: "pass", timestamp: datetime }
]
}
错误处理
合规检查失败时
DNC 检查失败:
- 不要发送
- 记录拦截情况
- 如有异常则发出提醒
未找到同意记录:
- 不要发送
- 标记以便收集同意
- 考虑改用其他渠道
违反静默时段规定:
- 重新安排,不要发送
- 记录重新安排的情况
- 确保后续送达
边缘情况
同意已过期:
- 按未获同意处理
- 如适用,尝试重新获取同意
联系人位于多个地区:
- 遵循最严格的规则
- 记录决策逻辑
退订意图不明确:
- 谨慎处理
- 可以询问以澄清(一次)
需要询问的问题
如果需要更多背景信息:
- 你使用哪些渠道进行外联?
- 你在哪些地区/国家开展业务?
- 你目前如何收集同意?
- 你是否遇到过合规问题?
- 哪些系统存储你的联系人/同意数据?
相关技能
- intent-detection:检测退订意图
- multi-channel-coordination:跨渠道合规
- conversation-memory:存储同意记录
- timing-optimization:遵守静默时段规定
评论
支持 Markdown