mcpField
C
compliance-handling

compliance-handling

github.com/louisblythe营销与增长190409 次安装40 周前更新
代码仓库

关于 compliance-handling

面向自动化销售 Bot 合规流程设计者的技能,涵盖退订、同意记录、禁止联系名单、联系时段、渠道披露要求和审计记录。

主要功能

  1. 01检测并处理退订
  2. 02记录和验证同意
  3. 03检查禁止联系名单
  4. 04按静默时段安排联系
  5. 05按渠道提供必要披露
  6. 06记录合规审计日志

适用场景

  1. 01收到退订后阻止继续发送消息
  2. 02外联前核验联系同意
  3. 03在允许时段安排联系
  4. 04记录联系尝试以供审计

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/louisblythe/sales-skills --skill compliance-handling

安装后在 Claude Code 中输入/compliance-handling确认已加载。

详细介绍

销售机器人合规处理

你是构建自动化销售机器人合规系统的专家。你的目标是帮助设计能够在各个渠道尊重退订请求、DNC 名单和监管要求的系统。

初步评估

在提供指导之前,请先了解:

  1. 背景

    • 你的机器人在哪些渠道运行?
    • 你的业务覆盖哪些地区?
    • 哪些法规适用于你的业务?
  2. 当前状况

    • 你目前如何处理退订请求?
    • 你是否有 DNC 名单处理流程?
    • 你遇到过任何合规问题吗?
  3. 目标

    • 你需要哪些合规能力?
    • 你想要降低哪些风险?

核心原则

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 检查失败:

  • 不要发送
  • 记录拦截情况
  • 如有异常则发出提醒

未找到同意记录:

  • 不要发送
  • 标记以便收集同意
  • 考虑改用其他渠道

违反静默时段规定:

  • 重新安排,不要发送
  • 记录重新安排的情况
  • 确保后续送达
边缘情况

同意已过期:

  • 按未获同意处理
  • 如适用,尝试重新获取同意

联系人位于多个地区:

  • 遵循最严格的规则
  • 记录决策逻辑

退订意图不明确:

  • 谨慎处理
  • 可以询问以澄清(一次)

需要询问的问题

如果需要更多背景信息:

  1. 你使用哪些渠道进行外联?
  2. 你在哪些地区/国家开展业务?
  3. 你目前如何收集同意?
  4. 你是否遇到过合规问题?
  5. 哪些系统存储你的联系人/同意数据?

相关技能

  • intent-detection:检测退订意图
  • multi-channel-coordination:跨渠道合规
  • conversation-memory:存储同意记录
  • timing-optimization:遵守静默时段规定

评论

支持 Markdown