Feature: 018-marketing-automation + 047-experiment-config
Marketing Automation 系统支持两种消息发送方式:
| 发送方式 | 触发条件 | 处理时机 | 使用场景 |
|---|---|---|---|
| 手动发送 | 用户点击"发送"按钮 | 立即发送 | 一次性营销活动、促销通知 |
| 自动触发 | 业务事件(生日、服务完成等) | 每 5 分钟批量处理 | 自动化营销、客户关怀 |
POST /api/marketing/campaigns/:id/send
Request Body:
{
"testMode": false, // 可选,测试模式只发给自己
"testEmail": "...", // 测试模式时的邮箱
"testPhone": "..." // 测试模式时的手机号
}
Response:
{
"success": true,
"message": "Campaign sent successfully",
"stats": {
"total": 100,
"sent": 98,
"failed": 2,
"skipped": 0
}
}
| 事件类型 | 说明 | 触发时机 |
|---|---|---|
service_completed | 服务完成 | 预约状态变为 completed |
birthday | 生日 | 客户生日当天 |
last_visit | 最后访问 | 超过 N 天未到店 |
membership_expiring | 会员到期 | 会员即将到期 |
points_expiring | 积分到期 | 积分即将过期 |
new_customer | 新客户 | 首次预约完成 |
| 状态 | 说明 |
|---|---|
pending | 等待处理 |
executing | 正在执行 |
completed | 执行成功 |
failed | 执行失败 |
skipped | 跳过(无联系方式等) |
| 文件 | 职责 |
|---|---|
| backend/api/marketing.js | Marketing API 路由,包含手动发送端点 |
| backend/services/messaging/index.js | 统一消息服务,封装 Email 和 SMS 发送 |
| backend/services/automation/trigger-engine.js | 触发器引擎,处理业务事件并调度执行 |
| backend/services/automation/execution-processor.js | 执行处理器,批量处理待发送消息 |
| backend/jobs/automationExecutionJob.js | 定时任务,每 5 分钟调用执行处理器 |
| backend/jobs/index.js | 任务调度中心,注册所有定时任务 |
| frontend/.../promotion/page.tsx | Campaign 管理页面 |
marketing_campaigns
├── id VARCHAR(50) PK
├── name VARCHAR(255)
├── type VARCHAR(20) -- 'email' | 'sms'
├── status VARCHAR(20) -- 'draft' | 'active' | 'paused'
├── content_source VARCHAR(20) -- 'template' | 'custom'
├── template_id INTEGER -- email/sms_templates.id
├── trigger_template_ids UUID[] -- 关联的触发器模板
├── subject VARCHAR(500) -- Email 主题
├── content TEXT -- 自定义内容
├── audience_type VARCHAR(50) -- 受众类型
├── target_tags VARCHAR[] -- 目标标签
├── last_manual_send_at TIMESTAMPTZ -- 最后手动发送时间
├── manual_send_count INTEGER -- 手动发送次数
└── ...
automation_executions
├── id UUID PK
├── rule_id UUID FK -- trigger_templates.id
├── customer_id UUID FK -- guests.id
├── channel VARCHAR(20) -- 'email' | 'sms' | 'both'
├── email_template_id INTEGER -- email_templates.id
├── sms_template_id INTEGER -- sms_templates.id
├── status VARCHAR(20) -- pending/executing/completed/failed
├── scheduled_for TIMESTAMPTZ -- 计划执行时间
├── executed_at TIMESTAMPTZ -- 实际执行时间
├── error_message TEXT -- 错误信息
└── metadata JSONB -- 扩展数据
Automation Execution Job 默认每 5 分钟执行一次:
cron.schedule('*/5 * * * *', async () => {
await this.jobs.automationExecution.run();
}, { timezone: 'America/New_York' });
| 参数 | 默认值 | 说明 |
|---|---|---|
batchSize | 50 | 每批处理的执行数量 |
maxExecutions | 500 | 单次运行最大处理数量 |
消息发送依赖以下环境变量:
# Email (AWS SES)
AWS_SES_ACCESS_KEY_ID=xxx
AWS_SES_SECRET_ACCESS_KEY=xxx
AWS_SES_REGION=us-east-1
AWS_SES_FROM_EMAIL=noreply@celoria.ai
# Email (Resend - 备选)
RESEND_API_KEY=xxx
# SMS (Twilio)
TWILIO_ACCOUNT_SID=xxx
TWILIO_AUTH_TOKEN=xxx
TWILIO_FROM_NUMBER=+1xxxxxxxxxx
# SMS (Telnyx - 备选)
TELNYX_API_KEY=xxx
# 查看定时任务日志
pm2 logs celoria-api --lines 100 | grep "automation-execution"
# 查看待处理执行
SELECT * FROM automation_executions
WHERE status = 'pending'
ORDER BY scheduled_for;
# 查看失败的执行
SELECT * FROM automation_executions
WHERE status = 'failed'
ORDER BY executed_at DESC
LIMIT 20;
# 通过 API 获取 Job 状态
GET /api/dev/jobs/status
# 手动运行 automation-execution job
POST /api/dev/jobs/run/automationExecution
更新日期: 2026-02-04