MyPromotion
促销引擎 · 让每一笔优惠都算得清
用户手册

第一章:产品概览与适用指南

💡 用15分钟,换一个不再为促销账扯皮的未来

促销规则配错了,后果有多严重?满减和折扣叠加后一单亏掉利润——大促高峰期的配置失误,一晚就可能吞掉整场活动的利润;退款金额和财务对不上,月底加班手动核对,大促的功劳变成了跨部门扯皮的消耗;活动上线了顾客却享受不到优惠,客服电话被打爆。

这些问题,很多时候不是单纯的运营失误,而是因为缺少一个能同时把促销规则"算清楚、管清楚、追溯清楚"的系统。MyPromotion 就是来解决这个问题的——它不负责交易闭环,只专注一件事:让每一笔优惠都算得清、管得住、追溯得到

1.1 MyPromotion 能帮你做什么?

MyPromotion 是一个促销规则计算引擎。你的业务系统(小程序、App、POS、OMS 等)只需传入商品和用户信息,引擎就会根据你配置好的规则,自动算出最优优惠组合商品级分摊明细,并留下完整的计算凭证。

简单来说,它解决了促销领域的三个核心痛点:

💡 不适合什么情况?

如果你只需要一个简单的"全场8折",在代码中直接固定可能更快;但如果你需要多种规则叠加、按人群/商品定向、退款要能精确回退,MyPromotion 的价值才会显现。

1.2 这本手册适合谁?

角色主要使用场景推荐阅读章节
运营/活动配置人员创建满减/满折/特价活动,管理商品池和用户分群第一章 → 第三章 → 第五章
业务分析师查看活动效果、分析优惠占比、排查异常订单第一章 → 第三章(任务监控) → 第五章(FAQ)
研发/架构师将 MyPromotion 接入现有订单/购物车系统第一章 → 第四章(集成指南) → 第六章(词汇表)
财务/审计人员核对优惠金额、追溯规则变更、导出 API 调用日志第一章 → 第三章(日志查询) → 第六章
系统管理员管理租户、配置外部数据源、监控系统状态全章通读
💡 企业规模有限制吗?

没有。MyPromotion 采用多租户架构,按租户隔离数据和规则。无论是单一品牌的初创团队,还是多品牌、多门店的大型集团,只要具备订单/购物车系统 + 商品信息,就可以接入。小到一场限时秒杀,大到全年大促矩阵,都能支持。

1.3 核心能力一览

MyPromotion 当前版本支持以下促销类型和配套能力:

能力分类具体支持对应 Admin 菜单
基础促销规则满减、满折、满赠、阶梯价(阶梯满减/阶梯折扣)、特价、秒杀、免运费、买赠、优惠券、积分抵扣、余额抵扣、预售等促销规则
标签促销按标签(场景、品类、活动主题)批量圈选规则标签管理
智能促销基于用户分群、商品池等条件自动筛选适用规则,并从中找出最划算的组合;规则太多时会自动切换为按优先级匹配智能促销
商品池按 SKU、类目、品牌、标签圈选活动商品商品池
用户分群按会员等级、消费频次、标签等圈选人群用户分群
消费券券模板管理(面额/门槛/总量定义)、可用性检查;退款时按券类型自动匹配分摊模型(比例分摊/阶梯重算/优先扣除),可为每种券类型选择处理方式(自动分摊/人工审核/不退回);平台不直接发券/核券,实际发放和核销由外部券系统完成消费券
价格保护成本价保护、普通会员价保护、VIP会员价保护;计算时自动拦截或警告低于保护线的促销结果价格保护
退款分摊按比例/按规则分摊已优惠金额到子项退款策略
售后策略定义退款时的优惠回退方式(比例分摊/优惠不退/优惠全退),并在正向计算时固化商品级分摊明细,确保退款可追溯售后规则
外部数据源同步商品、用户画像、消费券模板/实例等外部数据;支持 Pull 拉取、Push/Webhook 推送、Excel 文件导入三种方式数据源
多租户按租户隔离规则、数据、API Key租户管理
策略关联配置为每种策略类型设定允许使用的条件、动作、范围类型;创建规则时选项自动过滤,避免配置错误策略关联配置
审计与 Trace规则变更审计、API 调用统计、慢接口分析审计日志 / Trace

1.4 能力边界:✅ 支持与 ❌ 不支持

在接入前请务必确认以下边界,避免将不适用于 MyPromotion 的场景强行对接。

✅ 明确支持的场景

⚠️ 当前版本暂不支持(部分已纳入路线图)

如果你的业务场景涉及上述项目,不必直接排除 MyPromotion。标注 📋 已纳入路线图 的能力可联系产品团队了解进展;其余项目通常可通过业务系统前置处理 + MyPromotion 标准计算的组合方案实现。

1.5 策略选型指南

面对不同促销需求,该选哪种规则类型?以下决策树帮助你快速定位:

你的需求推荐规则类型关键配置
全场/部分商品满 X 元减 Y 元 满减 / 阶梯满减 阈值、优惠额、商品池、用户分群
全场/部分商品满 X 件打 Y 折 满折 / 阶梯满折 阈值、折扣率、商品池
指定 SKU 固定低价 特价 目标价格、生效时间
指定人群享受额外折扣 折扣 + 用户分群 折扣率、分群条件
大促期间多个活动统一管理 标签促销 创建标签 → 绑定规则 → 前端按标签调用
不确定该用哪个规则,让系统自动筛选 智能促销 用户分群、商品池、候选规则集;显式开启 optimal 模式才启用最优组合枚举
发放可领取的优惠券 消费券 券类型、发放总量、有效期、适用商品池
买X件送Y件 / 满额送赠品 买赠 / 满赠 购买数量门槛、赠品 SKU、赠送数量
支持积分或余额抵现 积分抵扣 / 余额抵扣 抵扣比例上限、与促销规则的互斥配置
退款时需要精确回退优惠金额 退款分摊策略 分摊方式(比例/优惠不退/优惠全退)、Fallback 兜底配置、退款计算 API

1.6 接入前必读

🚀 我只想先试试(运营/业务人员)

如果你是非技术角色,只想快速体验促销配置,不用读完本章。确认你已在 Admin 后台拥有账号和租户后,直接跳到 第二章:5分钟快速入门,用预置的测试数据完成第一次促销配置。正式接入时,再将本章转交给你的研发同事。

⚙️ 我要正式接入(研发/技术负责人)

请依次完成以下检查和步骤,确保业务系统与引擎顺利对接。

前提条件

接入四步走

  1. 环境准备:确认租户信息、获取 API 凭证、验证业务服务器可访问引擎服务。
  2. 数据同步:导入商品、用户、消费券等基础数据(支持接口同步、Excel 导入),数据量较小时也可直接在 Admin 后台手动配置。
  3. 规则联调:在 Admin 后台配置促销规则,调用促销计算接口验证结果,使用测试中心辅助调试。
  4. 上线观察:通过 Trace 看板监控调用量、成功率、P95 耗时,观察至少一个完整活动周期。

详细的技术规范、接口契约和集成时序图,请参阅 第四章:系统集成指南

第二章:5分钟快速入门

🎯 本章目标

假设你是某电商平台的运营,想做一个"全场满300减50"的活动。本章带你从零开始,10步之内让活动上线并验证效果

操作步骤

1
点击首页「➕ 新建规则」
或从左侧菜单进入 促销管理 → 促销规则 → 右上角「高级自定义」。
2
填写规则名称和基本信息
名称建议写清楚活动主题,如 618满300减50。设置生效时间范围。
3
选择策略类型为「满减」
在「规则类型」下拉框中选择「满减」。选择后,下方的条件、动作、范围选项会根据策略关联配置自动过滤,只显示该策略支持的类型。
策略类型选择截图
📷 策略类型选择截图
页面路径:/admin/promotions/promotionrule/add/ 截图保存至:images/quick-01-type.png
4
设置门槛和优惠金额
门槛填 300,优惠金额填 50。即"满300元减50元"。
5
点击「保存」
保存后规则状态为草稿,还未生效。
6
在规则详情页点击「测试」按钮验证
规则即使还是「草稿」状态,也可以直接点击「测试」进入调试页面。构造一个模拟购物车(商品A 200元 + 商品B 150元 = 350元),提交后查看是否命中满减规则、优惠金额是否正确。
💡 两种测试方式的区别

规则详情页「测试」:单条规则调试,草稿和生效中状态都能测,未命中会自动分析原因。适合快速验证刚创建的规则。
促销测试中心:测试所有「生效中」规则的叠加效果,适合验证多条规则同时存在时的计算结果。

7
确认结果正确后,将状态切换为「生效中」
进入规则详情页(或列表页批量操作),把状态从「草稿」改为「生效中」。只有生效中的规则才会参与线上 API 计算。
💡 状态说明:我该选「待生效」还是「生效中」?

系统提供 5 种状态,核心区别如下:

草稿:仅保存,不参与计算,可随时修改。
待生效:已确认配置,但生效时间还没到(如明天才开始)。到达生效时间后,系统自动转为「生效中」。
生效中:正在生效,参与促销计算。可直接从「草稿」切换,也可由「待生效」自动流转。
已过期:到达失效时间后,系统自动标记,不再参与计算。
已禁用 / 已暂停:手动停用,立即停止参与计算,可重新激活。

一句话建议:活动立即开始 → 选「生效中」;活动未来开始 → 选「待生效」更省心。

常见踩坑:忘了切状态

很多用户创建完规则就以为活动上线了,其实状态还是「草稿」。顾客下单时系统不会命中这条规则。创建后务必检查状态。

8
打开「促销测试中心」再次验证(可选)
如果你配置了多条规则,想在生效环境下验证叠加效果,可进入促销测试中心构造同样的购物车再次测试。注意:测试中心只匹配「生效中」的规则。
促销测试中心结果截图
📷 促销测试中心结果截图
页面路径:/admin/promotions/promotionrule/test/smart/ 截图保存至:images/quick-02-test.png
9
活动正式上线
将规则编码提供给技术团队,配置到业务系统的促销计算调用中。
10
查看「数据统计」
业务系统调用促销计算接口后,进入数据统计页查看这条规则被使用了多少次、优惠了多少金额。数据通常实时更新,高峰期间可能有分钟级延迟。
✅ 验证你已完成

在规则详情页点击「测试」,如果你能看到"应付金额 = 原价 - 50元",说明规则配置正确。接下来把规则编码告诉开发,让他们接入 API 即可。


第三章:核心任务指南

如何创建一场满减/满折/特价活动?

🛒 场景

你运营一家服装店,打算做"春上新满300减50"和"全场满99包邮"两个活动。满减和包邮不在同一互斥组,可以同时生效。下面分步操作。

第一步:创建满减活动

1
进入「促销规则」列表,点击「高级自定义」
路径:首页 → 促销规则 → 右上角「高级自定义」。
2
填写基本信息
- 规则名称:春上新满300减50
- 生效时间:2026-06-01 至 2026-6-30
- 优先级:10(数字越大越优先,建议重要活动设高一些)
3
配置条件范围(可选)
如果你想限制只有部分商品参与,在这里设置商品范围;如果想限制只有会员参与,设置用户人群条件。不做限制则全场通用。
4
选择策略类型并填写参数
策略类型选「满减」,门槛填 300,优惠金额填 50
满减参数配置截图
📷 满减参数配置截图
页面路径:/admin/promotions/promotionrule/add/ 截图保存至:images/task-01-full-reduction.png
5
保存并将状态设为「待生效」
保存后进入详情页,把状态从「草稿」改为「待生效」。因为活动生效时间是 2026-06-01,还没到开始时间,选「待生效」后系统会在到达生效时间时自动转为「生效中」。如果想立即生效,也可直接选「生效中」。

第二步:创建包邮活动

6
重复上述步骤,再创建一条规则
- 名称:春上新包邮
- 策略类型:「包邮」
- 门槛:99(满99元免运费)
- 优先级:5(低于满减)
常见踩坑:满减和满折默认互斥

系统预设「基础折扣互斥组」包含满减、满折、特价三种策略类型。这三种优惠默认不能同时生效。如果你想做"满减+折扣"叠加,需要先把满折和满减从互斥组中移除(或创建新的互斥组替代)。新手建议先用"满减+包邮"这种不互斥的组合。

💡 典型策略类型一览

金额/数量门槛型
「满减」= 满X元减Y元 「满折」= 满X元打Y折 「满赠」= 满X元送赠品
「阶梯价」= 多档阶梯优惠(如满100减10、满200减30、满300减60)
价格直降型
「秒杀」= 限时固定低价(通常配合高优先级 + 互斥组实现)
「特价」= 指定商品固定成交价(通过「固定价格」动作实现)
费用减免型
「包邮」= 满X元免运费 「优惠券」= 领券后抵扣(满减券/折扣券)
资产抵扣型
「积分抵扣」= 用积分抵现 「余额抵扣」= 用账户余额抵现
营销玩法型
「买赠」= 买X件送Y件 「预售」= 定金预售模式
组合场景:通过「用户分群 + 商品池 + 策略类型」可组合出无限场景,如「新用户首单立减」「会员专享折扣」「指定渠道支付优惠」等

✅ 验证方法

打开「促销测试中心」,构造一个350元的购物车,提交后查看结果:应同时命中满减和包邮两条规则。如果只看到一条命中,检查另一条的状态是否为「生效中」、是否被互斥组拦截。


多个优惠叠加会亏吗?如何设置互斥?

💰 场景

你同时在做"全场满300减50"和"新用户首单立减20元"两个活动。如果新用户买了350元的商品,两个优惠同时生效:350-50-20=280元,利润空间太薄。你只想让用户享受其中一个。

操作步骤

1
进入「互斥组」管理页面
路径:首页 → 互斥组,或左侧菜单 促销配置 → 互斥组
互斥组列表截图
📷 互斥组列表截图
页面路径:/admin/promotions/mutexgroup/ 截图保存至:images/task-02-mutex-list.png
2
点击「增加 互斥组」
- 组编码:填 discount_exclusive(英文唯一标识符,可自定义)
- 组名:基础折扣互斥组
- 互斥策略类型:勾选「满减」和「首单优惠」
- 优先级:50
3
保存后,进入促销测试中心验证
构造一个350元的购物车,用户标记为新用户。提交后查看:应该只命中优先级高的那条规则(满减或首单,取决于谁的优先级数字更大),另一条被跳过。
常见踩坑 1:互斥组没启用

创建互斥组后默认是启用的,但如果你之前手动停用过,或者复制了一条禁用的记录,规则就不会互斥。在互斥组列表页检查「是否启用」列。

常见踩坑 2:互斥策略类型选错了

互斥是按「策略类型」匹配的,不是按规则名称。如果你的规则类型是「满减」,互斥组里就必须选「满减」。如果规则实际是「阶梯价」,互斥组选了「满减」就不生效。

常见踩坑 3:秒杀商品被普通优惠叠加了

秒杀商品通常不与任何优惠叠加。建议创建一个「秒杀互斥组」,策略类型勾选「秒杀」+「满减」+「满折」+「优惠券」等所有可能叠加的类型,优先级设为最高(如100)。这样秒杀规则命中后,其他所有规则都被跳过。

✅ 验证方法

在促销测试中心中,同时满足两个互斥规则的条件,提交后应只看到一条规则被应用。如果两条都命中,检查互斥组的策略类型是否与规则的实际类型匹配。


如何按活动场景(双11/年货节)管理规则?

🏷️ 场景

2026年双11大促即将来临,你计划同时上线「满300减50」和「满199送赠品」两条规则。日常还有「新用户首单立减」在跑。你希望双11期间业务系统只计算双11相关的规则,不要混在一起;活动结束后也能一键批量下线。

操作步骤

1
创建活动标签
路径:首页 → 促销标签 → 「增加 促销标签」。
- 标签编码:double11_2026(编码用于 API 调用,建议英文+数字)
- 标签名称:2026双11大促
标签创建截图
📷 标签创建截图
页面路径:/admin/promotions/promotiontag/add/ 截图保存至:images/task-03-tag-create.png
2
创建双11规则并绑定标签
分别创建两条规则,都在「标签」字段中勾选 2026双11大促
规则A(满减):策略类型选「满减」,门槛300元,优惠50元,绑定双11标签。
规则B(满赠):策略类型选「满赠」,门槛199元,赠品选「双11限定礼品」,同样绑定双11标签。
一条规则可以绑定多个标签,比如同时绑定「2026双11大促」和「全平台通用」。
3
让业务系统按标签调用计算
告诉技术团队:双11期间调用计算接口时,传入 tag_code: "double11_2026"。引擎只会筛选该标签下「生效中」的规则参与计算,不会把日常的「新用户首单立减」也算进去。
活动结束后,直接在标签列表找到「2026双11大促」,批量停用或删除该标签下的所有规则,无需逐条操作。
4
按标签筛选和审计
在促销规则列表页,使用右侧过滤器按「2026双11大促」筛选,即可查看该活动下的全部规则。也可进入数据统计页,按标签维度查看双11活动的整体优惠金额、规则命中次数等。
💡 标签的三种典型用法

用法一(活动隔离):大促期间传入 tag_code,只计算指定活动的规则,避免与日常促销混算。
用法二(批量管理):按标签筛选后批量启停,活动上线/下线只需操作一次。
用法三(效果统计):数据统计支持按标签聚合,快速查看「双11」整体投入和产出。

✅ 验证方法

在促销规则列表按「2026双11大促」标签筛选,应同时看到满减和满赠两条规则。然后在促销测试中心传入 tag_code: "double11_2026" 测试,结果应只命中这两条双11规则。


怎么确认规则计算结果正确?

🧪 场景

你刚配置了一条复杂的阶梯满减规则(满100减10、满200减30、满300减60),但不确定不同金额的购物车会命中哪一档。你想在正式上线前验证清楚。

操作步骤

1
进入「促销测试中心」页面
路径:首页 → 效果测试(页面标题为「促销测试中心」)。
促销测试中心页面截图
📷 促销测试中心页面截图
页面路径:/admin/promotions/promotionrule/test/smart/ 截图保存至:images/task-04-test-page.png
2
(可选)直接在规则详情页调试单条规则
如果你只想验证刚创建的那一条规则,不需要去测试中心。进入该规则的详情页,点击右下角浮动按钮「测试」,进入「规则调试测试」页面。
与促销测试中心的区别:规则调试测试可以测试「草稿」和「生效中」状态的规则,且如果规则未命中,会自动分析原因(如条件不满足、时间未生效、范围不匹配等)。促销测试中心只测试「生效中」的规则,适合验证多条规则叠加效果。
规则调试测试页面截图
📷 规则调试测试页面截图
页面路径:/admin/promotions/promotionrule/1/debug/ 截图保存至:images/task-04-rule-debug.png
3
填写测试购物车
在 JSON 编辑区构造 cart_items。例如测试150元购物车:
{"sku":"SKU001","quantity":1,"price":"150.00"}
4
点击「执行计算」,查看结果
结果区域显示:命中了哪些规则、每条的优惠金额、最终应付金额。对于阶梯满减,150元应命中「满100减10」档。
测试结果截图
📷 测试结果截图
页面路径:/admin/promotions/promotionrule/test/smart/ 截图保存至:images/task-04-test-result.png
5
多测几组边界值
阶梯满减建议测试:99元(不命中)、100元(命中第一档)、199元(第一档)、200元(第二档)、299元(第二档)、300元(第三档)。确保边界值处理正确。
常见踩坑:测试时规则状态是「草稿」

促销测试中心调用的是真实计算引擎,只匹配状态为「生效中」的规则。

常见踩坑:条件范围限制了测试用户

如果你的规则设置了「仅限指定商品」,测试时也要传入对应的用户属性或商品 SKU,否则规则因条件不匹配而被跳过。

✅ 验证方法

手动计算一遍预期结果,和系统输出对比。例如 150元购物车 + 满100减10 = 应付140元。如果系统输出一致,说明配置正确。


活动上线后,如何查看效果数据?

📊 场景

双11活动已经上线3天了,老板问你:这个活动带来了多少订单?优惠了多少钱?有多少订单取消或退款了?你需要快速给出数据。

查看汇总数据

1
进入「促销使用统计」页面
路径:首页 → 数据统计(页面标题为「促销使用统计」)。
促销使用统计截图
📷 促销使用统计截图
页面路径:/admin/trace/dashboard/promotion-usage/ 截图保存至:images/task-05-dashboard.png
2
选择时间范围
页面上方提供两种时间筛选方式:
快捷范围:点击「近1天/近3天/近7天/近30天」按钮,系统会自动填充起始和结束日期并刷新数据。
自定义日期:手动选择起始日期和结束日期,支持跨月统计,修改后自动刷新。
月度营销预算:在筛选栏输入本月营销预算金额,页面会显示独立的预算进度条(达成率、预估月末支出)。预算数据始终按自然月统计
3
查看核心指标
页面按信息层级分为多个区域:
预算进度条:本月优惠花了多少 vs 预算目标,以及按当前速度预估月末是否超支。预算始终按自然月统计,不受上方时间筛选影响。
风险状态灯:损耗率、退款率、取消率三色警示。绿=正常,黄=注意,红=危险。
核心 KPI 六宫格:带动 GMV(促销拉动的订单总金额)、实付总额(用户实际支付)、优惠总金额(促销减免)、优惠渗透率(优惠力度)、覆盖用户/订单。均只统计已成交订单,每张卡片带环比变化。
转化漏斗:订单从「未成交」→「已成交」→「取消/退款」的全链路分布。超过 7 天未成交的订单会自动视为已成交。
损耗分析:促销优惠最终没生效的订单。损耗 = 取消 + 退款。
趋势分析:每日/每小时的优惠金额和订单数走势。同一天自动展示小时粒度。
策略效能矩阵:哪种策略花钱多、订单少(识别高投入低产出)。
状态分布:已成交 / 取消 / 退款的金额占比。
Top 促销排行:哪条规则优惠金额最多,以及与上期对比。
促销明细表格:每条规则的 GMV、优惠金额、命中率等。

查看逐笔明细

4
查看逐笔明细
在「促销使用统计」页面下方的Top 促销效能排行表格中,点击促销编码可跳转到规则详情页,查看该规则的完整使用数据。
5
排查争议订单
如需查看单笔订单的完整计算上下文(命中了哪些规则、各促销分别优惠了多少钱等),进入左侧菜单 数据统计 → 促销使用记录,在搜索框输入订单号查找。
💡 数据什么时候有?

数据统计来源于「使用留痕接口」。业务系统在订单完成后需调用该接口上报数据。如果页面暂无数据,说明技术团队尚未接入或暂无订单。

常见踩坑:数据对不上业务系统的统计

如果数据与业务系统对不上,通常是因为:1)部分订单未调用使用留痕接口上报;2)同一订单多次计算产生了多条记录,但业务系统未绑定最后一次的记录。

正确做法:业务系统需维护「订单 → 计算凭证」的映射关系。用户修改购物车后重新调用促销计算接口会生成新的凭证;业务系统应始终用最新凭证覆盖旧值,确保一个订单最终只对应一个有效凭证。订单支付完成后,使用最终凭证调用使用留痕接口上报。

📦 数据保留策略

促销使用记录默认只保留 90 天热数据。超过 90 天的记录会自动按订单ID聚合归档,释放数据库空间,同时保留完整数据用于财务审计。

如需查询 90 天前的历史记录,请联系平台技术人员,提供订单号及大致时间范围,技术人员可从归档存储中协助调取。

如何用模板快速创建一场活动?

📚 场景

你需要创建一场「满减」活动,但从零开始填写门槛条件、优惠动作、适用范围等参数比较繁琐。系统预置了常用场景的模板,能不能直接选用并快速生成?

操作步骤

1
进入「模板库」
路径:左侧菜单 促销管理 → 模板库
模板库列表截图
📷 模板库列表截图
页面路径:/admin/promotions/promotionrule/template-library/ 截图保存至:images/task-06-template-lib.png
2
选择一个合适的模板
系统预置了多种常用模板:满减模板、满折模板、秒杀模板、首单立减模板等。选择最接近你需求的模板。
3
基于模板创建规则
点击「使用此模板」,系统会自动填充模板的参数(策略类型、门槛、优惠金额等)。你只需修改活动名称、生效时间和差异化参数。
4
保存并设为「生效中」
和新建规则一样,保存后切状态。
💡 模板 vs 新建的区别

模板只帮你预填参数,创建后就是一条独立的规则,和模板再无关联。修改这条规则不会影响模板,修改模板也不会影响已创建的规则。

✅ 验证方法

使用模板创建规则后,进入规则详情页,确认策略类型和参数与预期一致。


如何检查规则之间是否有冲突?

🔍 场景

你同时运营着十几个活动,担心它们之间会互相冲突:比如两个规则的条件范围重叠,导致系统不知道用哪个;或者互斥组配置遗漏,导致不该叠加的优惠被叠加了。

操作步骤

1
进入「规则冲突检测」页面
路径:左侧菜单 促销管理 → 规则冲突检测
规则冲突检测截图
📷 规则冲突检测截图
页面路径:/admin/promotions/promotionrule/conflicts/ 截图保存至:images/task-07-conflict.png
2
选择要检测的规则范围
可以检测全部生效中的规则,也可以只检测选定的几条规则。
3
查看冲突报告
系统会列出检测到的冲突项,包括:条件范围重叠、互斥组遗漏、时间冲突等。每条冲突会给出建议处理方案。
4
根据建议修复
点击冲突项可以直接跳转到相关规则的编辑页,修改后重新检测,直到报告为空。
常见踩坑:冲突检测只覆盖部分场景

冲突检测主要检查「静态配置冲突」(条件重叠、互斥遗漏),不检查「动态业务冲突」(如商品库存不足导致实际未命中)。上线前仍需通过促销测试中心验证实际计算结果。

✅ 验证方法

冲突检测报告显示「未检测到冲突」后,再用促销测试中心构造边界场景验证一次,双重保险。


配置字段:分群和商品池的字段从哪里来?

🔧 场景

你想按「会员等级」给用户分群,按「品牌」筛选商品池,但配置时看不到这些字段。因为字段必须先经过「字段定义管理」启用和配置,才能在分群、商品池、退款规则中使用。

操作步骤

1
进入字段定义管理
路径:左侧菜单 数据配置 → 字段定义管理
字段定义管理列表截图
📷 字段定义管理列表
页面路径:/admin/metadata/metadatafield/ 截图保存至:images/task-fields-list.png
2
选择数据源字段
点击「+ 选择数据源字段」,进入字段选择弹窗:
实体类型:选择「用户画像」或「商品信息」
字段列表:系统会自动扫描数据源表(如 UserProfile、Product)的所有字段,排除系统字段(id、created_at 等)后展示业务字段
• 已配置的字段会标记为「已配置」,未配置的为「待配置」
• 勾选需要的字段,点击确认
字段选择弹窗截图
📷 字段选择弹窗
页面路径:/admin/metadata/metadatafield/select-fields/ 截图保存至:images/task-fields-select.png
3
配置字段详情
每个字段需要配置以下信息:
显示名称:对外展示的中文名,如「会员等级」「累计消费金额」
字段类型
  • 枚举:离散值(如会员等级 = 普通 / VIP / SVIP),系统会自动从数据源抓取所有值,可启用/禁用特定值、设置显示别名
  • 数值:范围筛选(如消费金额 0 ~ 10000),可配置区间范围、大于等于、小于等于等
  • 日期时间:时间筛选(如注册时间、最后消费时间),支持绝对时间区间、相对时间(近N天/月/年)
应用场景:默认 default,同一字段可配置多个场景(如 default、vip_promotion)
数组筛选逻辑:JSON 数组字段(如 tags)支持「包含任意(OR)」或「包含全部(AND)」
字段配置详情截图
📷 字段配置详情
页面路径:/admin/metadata/metadatafield/configure/<id>/ 截图保存至:images/task-fields-config.png
💡 字段配置好后去哪里用?

配置完成的字段会出现在以下模块的筛选条件中:

  • 用户分群:用户画像字段(会员等级、消费金额、注册时间等)
  • 商品池:商品信息字段(品类、品牌、售价、上架时间等)
  • 退款规则:用于退款策略的条件判断
常见踩坑:字段改了数据源但筛选值没更新

枚举字段的值是从数据源实时同步的。如果业务系统新增了会员等级(如新增了「黑卡」),但字段定义管理中没看到这个值,回到字段定义管理列表页,勾选该字段,从顶部 action 下拉中选择「🔄 同步字段值」,点击执行即可手动刷新。

✅ 验证方法

配置完成后,进入「动态用户分群」创建页面,查看字段下拉列表中是否出现了刚配置的字段。如果没有,检查字段是否已启用以及实体类型是否匹配。


如何给特定人群发优惠?

👥 场景

你想给「VIP会员」发一张专属9折券,给「近30天未下单用户」发一张召回满减券。不同人群享受不同优惠,怎么配置?

操作步骤

1
创建用户分群
路径:左侧菜单 促销管理 → 动态用户分群 → 「增加 动态用户分群」。
用户分群创建截图
📷 用户分群创建截图
页面路径:/admin/user_segment/usersegmentrule/add/ 截图保存至:images/task-08-segment.png
2
设置分群条件
- 分群名称:VIP会员
- 条件:用户等级 = VIP,或消费金额 ≥ 5000元
- 条件支持组合:and(同时满足)/ or(满足其一)
3
在促销规则中引用分群
创建或编辑促销规则时,在「用户范围」条件中选择刚才创建的分群。只有满足分群条件的用户才能命中这条规则。
💡 分群条件的字段来源

分群条件的字段来自「字段定义管理」。如果字段列表为空,说明用户画像字段尚未配置。路径:数据配置 → 字段定义管理,选择「用户画像」实体类型,启用需要的字段(如会员等级、消费金额)。详见上文「配置字段:分群和商品池的字段从哪里来?」

常见踩坑:分群数据未实时同步

用户分群的数据通常定时同步(如每小时一次)。刚成为 VIP 的用户可能需要等下次同步后才能享受优惠。如需实时生效,联系技术团队调整同步频率。

✅ 验证方法

在促销测试中心中,构造一个满足分群条件的用户(如 user_id 对应 VIP 用户),提交后应命中该规则。再换一个不满足条件的用户测试,应不命中。


如何限制活动只针对部分商品?

📦 场景

你只想让「春季新品」参与满减活动,其他商品不参与。或者想给「清仓商品」单独做特价活动,不影响正价商品。

操作步骤

1
创建商品池
路径:左侧菜单 促销管理 → 动态商品池 → 「增加 动态商品池」。
商品池创建截图
📷 商品池创建截图
页面路径:/admin/product_pool/productpoolrule/add/ 截图保存至:images/task-09-pool.png
2
设置商品筛选条件
- 商品池名称:春季新品
- 条件:品类 = 春装,或 上架时间 ≥ 2026-03-01,或 SKU 在白名单中
- 支持按品类、品牌、价格区间、上架时间、SKU列表等多种维度筛选
3
在促销规则中引用商品池
创建或编辑促销规则时,在「商品范围」条件中选择该商品池。只有商品池内的商品才能触发这条规则。
💡 商品池与用户分群的组合使用

可以实现精细化的定向优惠:「春季新品(商品池)+ VIP会员(用户分群)= 只有VIP用户买春季新品才享受满减」。两者条件同时满足时才命中。

✅ 验证方法

在促销测试中心中,购物车同时放入池内商品和池外商品,提交后查看:池内商品享受优惠,池外商品不参与优惠计算。


如何创建和管理消费券?

🎫 场景

除了系统自动计算的促销规则,你还想给顾客发「可领取的优惠券」:如「新人注册领50元券」「满200减30通用券」。顾客在结算时手动选择使用。

操作步骤

1
创建消费券模板
路径:左侧菜单 消费券管理 → 消费券池 → 「增加 消费券池模板」。
消费券池创建截图
📷 消费券池创建截图
页面路径:/admin/coupons/couponpooltemplate/add/ 截图保存至:images/task-10-coupon.png
2
填写券的基本信息
- 券名称:新人注册礼50元
- 券类型:满减券 / 折扣券 / 无门槛券
- 门槛和优惠金额:如满100减50
- 发放总量:10000张
- 每人限领:1张
- 有效期:领取后7天内有效
3
设置领取和发放规则
配置哪些用户可以领取(全员/新用户/指定分群)、领取方式(自动发放/手动领取/兑换码)。
4
保存并启用
保存后状态为「草稿」,设为「生效中」后顾客才能领取和使用。
5
(可选)配置券的互斥和叠加规则
路径:消费券管理 → 组合规则。设置哪些券可以叠加使用、哪些券互斥。例如:店铺券和平台券可以叠加,但两张店铺券互斥。
💡 促销规则 vs 消费券的区别

促销规则:系统自动计算,顾客无感知。如满300减50,购物车满足条件自动减。
消费券:顾客主动领取/使用,有感知。如领取优惠券后在结算页勾选使用。
两者可以叠加:先算促销规则,再算消费券(分层计算)。

常见踩坑:券和促销规则叠加后亏损

促销规则(自动)+ 消费券(手动)叠加后,可能出现优惠过多、利润为负的情况。建议在「促销测试中心」中模拟「促销后金额 + 消费券」的组合场景,确保叠加后仍有利润空间。

✅ 验证方法

进入「消费券统计」页面,查看券的领取量、使用量、核销率。路径:数据统计 → 消费券统计


如何配置退款时的分摊策略?

🔧 场景

顾客买了两件商品享受了"满300减50",现在想退其中一件。退款时应该退多少钱?是退原价还是按比例扣除优惠?如果退款金额太大,要不要转人工审核?

操作步骤

1
创建售后策略
路径:左侧菜单 促销配置 → 售后规则 → 「增加 售后策略」。
售后策略截图
📷 售后策略截图
页面路径:/admin/promotions/refundconfigtemplate/add/ 截图保存至:images/task-11-refund.png
2
选择退款分摊策略
- 「按比例分摊」:默认,按商品金额比例分摊优惠。如买300+200=500,满减50,退300的商品退30元优惠。
- 「优惠不退」:部分退款时保持优惠不退还,由商家/平台承担损失。适用于首单礼金、新客专享等营销场景。
- 「优惠全退」:退该商品时,该规则给该商品的全部优惠都收回(不按数量比例)。适用于严格促销场景。
- 「兜底人工审核」:当退款满足特定条件时自动转人工,如退款金额超过阈值、退款比例过高(如超过80%)、同一订单多次退款(如第3笔起)、或所有退款一律转人工。
3
消费券退款处理
订单使用了消费券时,系统按券类型自动匹配分摊模型,并为每种券类型选择处理方式。目前支持的券类型共 5 种:

1. 金额减免(满X减Y):按比例分摊——按订单实付比例分摊券面额,退款时按商品金额占比退回对应券额
2. 百分比折扣(X折):按比例分摊——按订单实付比例分摊折扣金额,退款时按商品金额占比退回对应折扣
3. 无门槛直抵(立减Y):按比例分摊——按订单实付比例分摊直抵金额,退款时按商品金额占比退回对应直抵额
4. 阶梯减免(每满X减Y):阶梯重算——退款后订单金额低于阶梯门槛时,重新计算适用的阶梯档位并退回差额券
5. 特价券(指定价):优先扣除——退款时优先扣除券优惠部分,剩余部分按实付比例退回

每种券类型可选择三种处理方式之一:
自动分摊(默认):按上述分摊模型自动计算退款
人工审核:该类型券退款一律转人工处理
不退回:该类型券在退款时作废不退
注意:平台只给出返券建议,实际返券/退券操作需由外部券系统执行。
4
(可选)配置兜底人工处理
当退款满足特定条件时,自动转人工审核:
- 「金额超限」:退款金额超过阈值(如超过1000元)
- 「退款比例超限」:退款比例过高(如超过80%)
- 「多次退款」:同一订单多次退款(如第3笔起)
- 「全量人工」:所有退款一律转人工
4
在促销规则中关联模板
编辑促销规则,在「售后策略」区块勾选「启用售后策略」,选择刚才创建的模板。结算阶段引擎会将商品级分摊明细写入计算凭证(trace),随订单一起保存。
常见踩坑:模板修改不影响已有计算凭证

售后策略修改后,只影响新订单,不影响已生成的计算凭证(trace)。这是设计上的「凭证固化」机制——正向计算时写入 trace 的数据永久不可变更,确保退款时不受模板后续变更的影响。历史订单无法按新策略退款,技术上不支持回刷或重写。

如业务上确需处理历史订单,建议通过业务层面解决:线下补差价、单独发放补偿券、或引导用户重新下单后按新策略退款。

✅ 验证方法

在「促销测试中心」中执行一次计算,查看结果中是否包含商品级优惠分摊明细(item_discounts)。然后进入「促销计算凭证」(Admin 菜单中显示为「促销计算快照」)列表,找到对应的 trace_id,查看凭证中的商品分摊明细是否正确。


如何查看规则变更和API调用记录?

📋 场景

有同事说某个活动突然失效了,你想查是谁改动了规则。或者技术团队说API响应慢,你想看看最近的调用量和错误率。

查看规则变更记录

1
进入「规则审计日志」
路径:左侧菜单 数据统计 → 规则审计日志
规则审计日志截图
📷 规则审计日志截图
页面路径:/admin/trace/ruleauditlog/ 截图保存至:images/task-12-audit.png
2
筛选目标规则和操作类型
查看谁(哪个用户)在什么时间(何时)做了什么(改了什么字段)。支持按促销编码、操作人搜索,按操作类型、常用时间范围(今天/最近7天/本月/本季度)筛选,也可通过日期分层导航逐层定位。

查看API调用记录

3
进入「API调用统计」或「API调用记录」
- API调用统计(路径:数据统计 → API调用统计):汇总视图,展示调用量、响应时间、错误率趋势。
- API调用记录(路径:数据统计 → API调用记录):逐笔明细,展示每次调用的请求参数、响应结果、耗时。
API调用统计截图
📷 API调用统计截图
页面路径:/admin/trace/dashboard/api-calls/ 截图保存至:images/task-12-api-stats.png
💡 什么时候看审计日志?

规则意外变更、活动突然失效、计算结果异常 —— 先看审计日志确认是否有人改了配置,再排查其他原因。

✅ 验证方法

修改一条规则后保存,等待1-2分钟,进入规则审计日志,应能看到刚才的操作记录。

如何把外部系统的商品、用户和券数据接进来?

📥 场景

你刚接入 MyPromotion 系统,外部数据同步是可选增强,不是强制要求。平台的核心促销计算能力(满减、满折、阶梯价、秒杀等)不需要任何外部数据同步即可正常工作

不接入外部数据时,你可以这样使用平台:

条件配置:金额门槛、数量门槛、时间段、星期几、用户分组(请求传入)、购买渠道(请求传入)、支付方式(请求传入)、首单用户(请求传入)、指定 SKU / 品类 / 标签(在规则配置中直接指定)
范围配置:全部商品、指定 SKU 列表、指定品类 ID 列表、指定标签列表、排除 SKU 列表
动作配置:固定金额减免、百分比折扣、固定价格、免运费、赠送积分
请求要求:必须在 cart_items 中传入商品 SKU、数量、价格;条件相关的字段(如 category_idtagsuser_groupchannelpayment_methodis_first_order 等)需在 context 中传入

接入外部数据后,才能使用以下高级功能:

① 商品数据 → 配置动态商品池(用可视化规则自动筛选商品,池内成员自动更新),替代手动维护 SKU 列表的方式
② 用户画像 → 配置动态用户分群(用 RFM、标签、行为等多维度规则自动筛选用户),替代手动维护用户分组的方式
③ 消费券模板 → 促销规则「赠送优惠券」动作时选择券模板;用户用券计算时自动查询可用券
④ 消费券实例 → 退款计算时读取券实例状态,按券类型匹配分摊模型并选择处理方式给出返券建议

系统支持三种接入方式,根据你的业务需求选择最适合的一种。

💡 三种方式怎么选?

方式一 Pull(平台拉取):外部系统有开放 API,平台定时主动去拉数据。适合商品、用户画像、券模板等批量数据。
方式二 Push/Webhook(推送接收):外部系统能主动推送数据到本平台。适合对实时性要求高的数据,强烈建议用于消费券实例同步
方式三 文件导入:手动上传 Excel 文件。适合券模板初始化、历史数据一次性迁移。

📤 请求时必须传入的条件数据

即使不接入任何外部数据同步,外部系统在调用促销计算 API 时,也必须在请求体中传入以下数据:

cart_items(必填):每个商品需包含 skuquantityprice。如果规则用到品类/标签/品牌范围,还需传入 category_idtagsbrand_id
context(按需):如果规则配置了对应条件,需传入 user_group(用户分组)、channel(渠道)、payment_method(支付方式)、shipping_method(配送方式)、is_first_order(是否首单)、user_info.birthday(用户生日)等。

平台不会主动查询外部系统获取这些字段,全靠请求体传入。传入什么,平台就用什么做计算。

🎟️ 券数据同步须知

为什么需要同步券数据?

如果不同步券数据,以下功能无法使用,但基础促销计算不受影响

• 促销规则配置「买赠 → 赠送优惠券」时,下拉列表为空,无法选择券模板
• 用户用券计算时,无法按 coupon_codes(精确匹配券实例)或 coupon_template_ids(自动匹配可用实例)查询并使用券
• 订单退款时,无法查询券实例状态,系统无法按券类型匹配分摊模型,返券建议可能不准确

券模板 vs 券实例的区别:

券模板 = 券的"定义"(如「满100减20」这张券的规则)。用于促销买赠配置和用户用券计算。数据量小,变化少,Pull 或文件导入均可。
券实例 = 用户实际领取的"一张张券码"(如用户A领取了码 COUPON_001)。用于退款计算和用户用券自动匹配。数据量大、状态变化频繁(领取/使用/过期),强烈建议用 Push/Webhook 实时同步

重要:平台不发放券,也不负责核销券。券的创建、发放、使用核销均由外部券系统负责。平台只是读取同步过来的券数据用于计算和退款建议。促销计算用券成功后,平台不会更新券实例状态(不会把 unused 改成 used),必须由外部券系统同步最新状态到平台。

方式一:Pull 拉取同步

1
创建数据源
路径:左侧菜单 数据配置 → 数据源管理 → 「增加 数据源配置」。
填写外部系统的 API 基础地址(如 https://api.mall.example.com),选择认证方式(AccessKey / OAuth2 / Bearer Token),填入对应的密钥。点击「测试连接」确认能正常连通。
数据源创建截图
📷 数据源创建截图
页面路径:/admin/datasources/datasource/add/ 截图保存至:images/task-13-datasource.png
2
创建 Pull 同步任务
路径:左侧菜单 数据配置 → 数据同步任务 → 「增加 数据同步任务」。
- 同步方式:选择 Pull(平台拉取)
- 数据类型:选择商品 / 用户画像 / 消费券模板 / 消费券实例
- 数据源:选择刚才创建的数据源
- API 端点:填写外部系统提供的接口路径(如商品列表接口)
- 请求方法:GET
- 批次大小:每次拉取多少条(默认100条)
数据类型选择建议:
• 商品 / 用户画像 / 券模板:适合 Pull,定时同步即可。
• 券实例:也可以用 Pull,但频率建议设高一点(如每5分钟),否则退款时可能读到旧状态。
保存后配置默认处于「启用」状态。在页面底部勾选「启用拉取作业」,系统才会按配置的频率自动定时拉取数据;不勾选则定时任务不会执行,但手动触发不受影响。首次同步建议先手动触发一次,确认数据能正常写入。
数据同步任务列表截图
📷 数据同步任务列表截图
页面路径:/admin/datasources/datasyncconfig/ 截图保存至:images/task-13-sync-task.png
3
配置字段映射
将外部系统的字段名映射到平台的标准字段。例如:外部系统的 product_name → 平台的 namesale_priceprice。字段映射支持自动识别,也可以手动调整。
券实例的关键字段务必映射准确:outer_id(券码)、status(unused/used/expired/returned/frozen)、used_amount(已使用金额)、use_order_id(使用订单号),这些直接影响退款计算结果。

方式二:Push/Webhook 推送接收(券实例强烈推荐)

1
创建 Push 接收配置
路径:左侧菜单 数据配置 → 数据同步任务 → 「增加 数据同步任务」。同步方式选择 Push(Webhook 推送)
Push 模式最大的好处是实时无延迟:用户在外部系统领券、用券、退券后,数据立即推送到平台,退款计算时读到的通常是最新状态(相比 Pull 定时拉取,延迟从分钟级降至毫秒级)。
2
配置安全参数
- IP 白名单:填写允许推送数据的外部服务器 IP 地址(至少一个)
- 签名密钥:系统会自动生成一个密钥,用于验证推送请求的来源合法性。把这个密钥提供给外部系统的技术团队。
3
配置字段映射
和 Pull 模式一样,把外部系统推送的字段映射到平台标准字段。特别注意券实例状态字段的映射。
4
把 Webhook 地址提供给外部系统
保存后,系统会生成一个唯一的 Webhook 接收地址(如 /webhook/v1/product)。把这个完整 URL 提供给外部系统的技术团队,他们配置好后,数据变更时会自动推送到本平台。
Push 配置截图
📷 Push 配置截图
页面路径:/admin/datasources/datasyncconfig/add/ 截图保存至:images/task-13-push.png

方式三:文件导入

1
进入「文件导入」页面
路径:左侧菜单 数据配置 → 数据导入
文件导入页面截图
📷 文件导入页面截图
页面路径:/admin/datasources/datasyncconfig/file-import/ 截图保存至:images/task-13-import.png
2
选择数据类型并下载模板
选择要导入的数据类型(商品 / 用户画像 / 消费券模板 / 消费券实例),点击「下载模板」。模板中包含所有必填字段和字段说明,黄色高亮为必填。
文件导入最典型场景是券模板的初始化:外部券系统有几十上百种券类型,先导出为 Excel,一次性导入平台,后续运营配置促销规则时就能直接选择。
3
按模板填写并上传文件
支持 Excel(.xlsx/.xls)格式。必填字段不能为空,价格字段必须是纯数字(如 199.00,不能写 199元)。上传后系统先进行预检查,列出格式错误和具体位置,修正后重新上传。
4
查看导入结果
导入成功后显示统计:成功导入多少条、跳过多少条(重复数据自动跳过)。如果失败会显示具体原因。

查看同步状态

5
查看数据同步日志
路径:数据统计 → 数据同步日志。查看所有同步任务的执行记录:开始时间、结束时间、处理条数、成功/失败条数、错误详情。Pull 和 Push 任务的日志都会在这里集中展示。
数据同步日志截图
📷 数据同步日志截图
页面路径:/admin/datasources/datasyncsession/ 截图保存至:images/task-13-sync-log.png
常见踩坑 1:Pull 模式数据源连不上

创建数据源后务必点击「测试连接」。如果连不上,检查:1)API 地址是否正确;2)密钥是否过期;3)外部系统的 IP 白名单是否放行了本平台的出口 IP。

常见踩坑 2:字段映射不匹配导致数据为空

同步任务显示"成功"但数据资产页面看不到数据,通常是字段映射配错了。例如外部系统字段叫 product_name,但你映射成了 name,而平台实际期望的字段是 title。对照模板中的标准字段名逐一核对。

常见踩坑 3:Push 模式收不到数据

如果外部系统说已推送但平台没收到,检查:1)IP 白名单是否包含了对方服务器的 IP;2)签名密钥是否一致;3)Webhook 地址是否完整(包括域名和路径)。可以在 API 调用记录中筛选 webhook 路径,查看是否有请求进来。

常见踩坑 4:文件导入时 sku / user_id 重复

sku 和用户 ID 是唯一键。模板中有重复值或值已存在于系统中时,导入会跳过或报错。导入前先在 Excel 中检查重复项。

常见踩坑 5:券实例不同步导致退款计算错误

如果外部系统已经核销了某张券,但平台还没同步到最新状态,退款时会误判为"未使用"而建议返券,造成资损。券实例务必用 Push/Webhook 实时同步;如果用 Pull,频率不能低于 5 分钟,且退款前务必确认同步时间戳。

常见踩坑 6:促销买赠选不到券

配置促销规则 → 动作选择「赠送优惠券」时,下拉列表为空,通常是因为消费券模板没有同步。券模板是"可选赠品列表"的数据来源,务必先完成同步,再配置促销规则。

💡 三种方式的适用场景总结

Pull:外部系统有 API → 配置一次,自动定时同步 → 适合商品、用户画像、券模板
Push:外部系统能推数据 → 实时接收,无延迟 → 强烈推荐用于消费券实例
文件导入:无 API 或历史数据迁移 → 手动上传 Excel,操作简单 → 适合券模板初始化、一次性导入

✅ 验证方法

同步完成后,进入对应的数据资产页面查看:商品数据(数据资产 → 商品数据)、用户画像(数据资产 → 用户画像)、券模板/实例(数据资产 → 券模板/券实例)。确认数据已正确显示,字段内容无乱码、无空值。

特别验证券实例:找一张外部系统已使用的券,查看平台中该券实例的 status 是否为 useduse_order_id 是否正确,确保与外部系统一致。


第四章:系统集成指南——不同架构如何接入促销计算

🎯 本章目标

如果你是技术负责人或运维人员,想知道「我们的系统该怎么接促销引擎」,本章用几张流程图帮你理清:下单时(正向)怎么调接口、退款时(逆向)谁来调接口、不同系统架构能拿到什么价值。看完就能给研发团队写接入方案。

第一步:先判断你属于哪一类

促销引擎的价值能兑现多少,80% 取决于你的「商城系统」「售后/OMS 系统」是自研的还是第三方的。回答下面 3 个问题,10 秒定位。

问题 你的情况 你属于 建议动作
Q1:你的商城(小程序/APP/官网)是自研的吗? 用有赞/微盟等 SaaS → E 类 当前不适合,选完整电商 SaaS
Q2:你的 OMS/售后系统是自研还是外包/第三方? 自研或外包定制 → A / B 类 可直接 POC 全流程
用旺店通/百胜等标准产品 → D 类 优先验证正向 + 对账追溯
Q3:你是 SaaS 服务商(向客户提供软件)? 是 → C 类 最理想的落地场景
💡 关键结论

引擎的「正向逆向一致性」价值,只有在「正向计算结果能被退款环节读取」时才能兑现。商城自研 + OMS 可控(A/B/C 类)= 价值最大化;商城自研 + 第三方 OMS(D 类)= 至少做对账追溯。

第二步:正向计算链路(下单时)—— 所有类型都一样

正向计算就是「用户下单时,引擎算优惠金额」。不管你的系统架构是哪一类,正向计算的调用方都是商城系统,链路完全相同。

📦 正向计算完整调用链路
用户浏览商品
商城系统
展示价格
用户把商品加入购物车,商城维护购物车数据
加入购物车 / 查看凑单
商城调引擎
POST /api/v1/promotions/calculate/
引擎返回可用优惠
preview = true
购物车阶段(preview 模式):实时计算优惠金额,让用户看到「用了哪些规则、省了多少钱」;同时给出凑单提示作为辅助参考。只算金额、不生成 trace_id,用户修改购物车后可再次调用。
进入订单确认页
商城系统
用户勾选/取消促销或券
若用户未修改促销选择 → 可复用购物车阶段的计算结果;若修改了 → 需重新调用引擎计算
商城生成订单号
商城调引擎精确计算
POST /api/v1/promotions/calculate/
引擎返回结果
preview = false(默认)
结算阶段:必须传入 order_id + 用户最终勾选的 promotion_codes / coupon_codes。引擎生成 trace_id 并绑定订单,同时返回 item_discounts 商品级分摊明细。
引擎异步保存计算凭证
trace 永久固化
商城保存 trace_id
到订单表
支付网关
按应付金额扣款
trace_id 是后续退款的唯一凭证,必须存到订单表(如 order.promotion_trace_id)。
订单支付完成
商城异步上报使用留痕
POST /api/v1/promotions/usage/ status=pending
引擎记录为「待确认」
优惠预占,KPI 不计入
支付完成后第一次上报,默认 status = pending(待确认)。此时优惠已预占但未正式生效,核心 KPI 不计入。
订单发货 / 超可取消期限
商城再次上报使用留痕
POST /api/v1/promotions/usage/ status=confirmed
引擎更新为「已确认」
优惠正式生效,计入 KPI
订单发货后更新为 confirmed(已确认),促销优惠正式生效,核心 KPI 只统计此状态。若业务系统不主动更新,pending 超过 7 天引擎自动乐观确认为 confirmed。
订单在发货前被取消
商城上报使用留痕
POST /api/v1/promotions/usage/ status=cancelled
引擎更新为「已取消」
优惠作废,释放预占
订单取消时必须主动调用 usage 接口更新为 cancelled(已取消),促销使用作废并释放预占配额。引擎不会自动感知订单取消。
💡 发货前取消 vs 售后退款

发货前取消只需将 usage 更新为 cancelled 释放优惠预占;退款资金如何处理(原路退回、退到余额、退到卡券等)由业务系统自行决定,不经过引擎 refund 链路。只有用户「收到货后申请退货退款」(可能部分退、可能多次退)才需要调用 refund/calculate + refund/execute

商城系统(你的) 促销引擎(MyPromotion) 支付网关(你的)
关键注意:trace_id 必须保存

正向计算返回的 trace_id 是后续退款、对账、客服争议处理的唯一钥匙。如果商城没保存,退款时引擎找不到原始分摊记录,只能按「本地比例」兜底计算,偏差又会回来。

第三步:逆向计算链路(售后退款时)—— 这才是差异所在

逆向计算针对「用户收到货后申请退货退款」的场景(可能是部分退),引擎读取正向计算保存的计算凭证(trace),返回该退多少钱。发货前的「整单取消」不走此链路,由业务系统自行处理。不同架构的「谁来调引擎退款接口」差别很大,直接决定了你能拿到什么价值。

A 类 双自研(商城 + OMS 均自研)
价值最大化:正向精确 + 退款全自动闭环 + 对账全自动
🔁 退款链路:OMS 直接调引擎
用户申请退款
OMS / 售后系统
你的自研系统
OMS 接收退款申请,从订单表读取 trace_id
OMS 调引擎退款计算
POST /api/v1/refund/calculate/
引擎按正向凭证精确计算退款
读取 trace 中 item_discounts 商品级分摊
引擎读取正向计算锁定的商品级分摊明细(item_discounts),确保退款金额与下单时完全一致,避免重新算价产生偏差
引擎记录退款并更新剩余可退
POST /api/v1/refund/execute/
OMS 调用支付网关
按引擎金额原路退回
引擎记录本次退款流水,扣减剩余可退金额,支持整单退和多次部分退的累计追踪。OMS 按引擎返回金额执行打款即可
用户 OMS / 售后系统 促销引擎(MyPromotion)
⚠️ 异常处理:引擎已记录但支付网关打款失败

退款链路采用「先扣减引擎可退余额,后调用支付网关」的顺序,目的是利用引擎乐观锁防止并发超退。若支付网关调用失败:

1. OMS 应重试支付网关:同一 refund_no 重复请求 refund/execute 引擎不会重复扣减(幂等),但也不要重复调用引擎,只需重试支付网关;
2. 多次重试仍失败时标记异常:由人工介入处理,引擎状态已是 executed,不可回滚;
3. 对账依据:通过计算凭证查询(GET /api/v1/traces/{trace_id}/)核对引擎退款记录与实际支付流水。

✅ A 类能拿到的价值

财务对账可建 T+1 自动化脚本;客服零介入(退款金额精确计算);超退风险归零(乐观锁 + 累计金额校验)。

B 类 自研商城 + 外包定制 OMS
价值较高:正向精确 + 对账人力释放;前提是外包 OMS 愿意配合接口改造
🔁 退款链路:商城代理调用,结果推给 OMS
用户申请退款
OMS
外包系统
商城系统
代理调用引擎
OMS 可能不配合直接调引擎,由商城(正向计算的调用方)代为调用
商城调引擎退款计算
POST /api/v1/refund/calculate/
引擎返回退款金额
商城推送结果给 OMS
商城拿到引擎计算的退款金额后,推送给 OMS 执行。OMS 只「执行」不「计算」
OMS 确认退款并通知商城
商城调引擎执行退款
POST /api/v1/refund/execute/
OMS 调用支付网关打款
OMS 确认退款后通知商城调 refund/execute,引擎扣减余额后 OMS 再调支付网关。具体时序由双方约定,推荐「OMS 确认 → 商城 execute → OMS 打款」。
用户 OMS(外包系统) 商城系统 促销引擎(MyPromotion)
⚠️ B 类的关键前提

外包 OMS 团队必须愿意配合:1)接收商城推送的退款金额;2)或允许商城代调引擎后把结果写回 OMS。如果外包团队不配合,价值退化为 D 类(仅正向 + 对账追溯)。

⚠️ 异常处理:引擎已记录但支付网关打款失败

与 A 类相同,B 类也是先执行 refund/execute 扣减引擎可退余额,再由 OMS 调用支付网关。若支付网关调用失败:OMS 应重试支付网关(不要重复调引擎),多次失败标记异常人工介入,引擎状态不可回滚。

✅ B 类能拿到的价值

月末对账不再抽调专人核对促销退款异常;争议退款处理从数分钟/笔降至秒级调取 trace 凭证;消除按比例退款的系统性偏差。

C 类 SaaS 服务商
适合希望快速补齐促销能力、又不愿自研引擎的 SaaS 平台;前提是能接受订单数据与外部引擎交互
🔁 退款链路:SaaS 自身统一调用
用户申请退款
SaaS 售后模块
你产品中的一部分
售后模块直接读取订单表中的 trace_id
SaaS 调引擎退款计算
POST /api/v1/refund/calculate/
引擎读取计算凭证
返回退款金额
SaaS 调引擎执行退款
POST /api/v1/refund/execute/
因为商城和售后都是同一套 SaaS 系统,不存在「OMS 不配合」的问题,和 A 类一样全自动
SaaS 调用支付网关
按引擎金额原路退回
用户 SaaS 售后模块 促销引擎(MyPromotion)
⚠️ C 类的现实考量

SaaS 平台接入引擎前通常会有两方面顾虑:1)服务依赖——引擎故障或延迟会直接影响 SaaS 平台的退款链路,即使私有化部署也需考虑引擎服务的运维和升级成本;2)定制灵活性——引擎的促销模型是标准化的,平台自有业务逻辑(如特殊会员体系、平台补贴规则)需要额外适配。数据安全方面,SaaS 平台通常选择私有化部署,订单数据不出内网,合规风险可控。建议先用隔离环境做 PoC 验证,确认性能和模型适配度满足要求后再全面接入。

⚠️ 异常处理:引擎已记录但支付网关打款失败

与 A 类相同,SaaS 先执行 refund/execute 扣减引擎可退余额,再调用支付网关。若支付网关调用失败:重试支付网关(不要重复调引擎),多次失败标记异常人工介入,引擎状态不可回滚。

✅ C 类能拿到的价值

省去自研促销引擎的研发和运维成本;产品竞争力从「没有促销」跃升为「支持满减、阶梯价、秒杀、优惠券」;正向逆向完全闭环。

D 类 自研商城 + 第三方标准 OMS
价值下限:正向精确 + 对账追溯 + 客服仲裁有据可依;退款自动化受限
退款链路:引擎只能做「兜底查询」
商城下单时调引擎
POST /api/v1/promotions/calculate/
引擎生成并保存 trace_id
作为正向计算凭证
D 类的正向计算仍调用引擎,trace_id 已固化。只是逆向退款阶段 OMS 不经过引擎
用户申请退款
第三方 OMS
旺店通/百胜等
第三方 OMS 按自己的逻辑计算退款金额(通常是固定比例),不会调引擎接口
OMS 自行计算退款
比例均摊/固定规则
支付网关打款
此时正向和逆向是分开计算的,偏差可能存在
月末对账 / 客服争议时
商城调引擎 Trace 查询
GET /api/v1/traces/{trace_id}/
引擎返回原始分摊明细
虽然不能干预 OMS 的退款逻辑,但引擎保存了完整的正向分摊凭证。月末对账时导出比对,客服争议时秒级调取凭证
用户 第三方 OMS 支付网关 商城系统 促销引擎(MyPromotion)
⚠️ D 类的现实边界

第三方 OMS 的核心商业模式是按订单量收费,其售后模块是产品闭环的一部分,没有动力为单一客户接入外部退款 API。引擎无法强迫 OMS 改变退款逻辑,但「有凭证可依」本身就能显著节省争议排查时间。

✅ D 类能拿到的价值

偏差定位:过去月末对账是「大海捞针」,现在引擎保存了完整正向分摊明细,可导出后与 OMS 退款明细比对,自行标记偏差订单。客服仲裁:消费者质疑退款金额时,客服可调取 trace_id 原始凭证,给出有据可依的解释。

第四步:四种架构对比一览

对比维度 A. 双自研 B. 商城+外包OMS C. SaaS 服务商 D. 商城+第三方OMS
正向计算精度 ✅ 引擎直接计算 ✅ 引擎直接计算 ✅ 引擎直接计算 ✅ 引擎直接计算
退款自动化 ✅ OMS 直接调引擎,全自动 ⚠️ 商城代理推送,取决于 OMS 配合度 ✅ SaaS 自身统一调用,全自动 ❌ OMS 不接入引擎,只能追溯
对账效率 ✅ 凭证完整,可建 T+1 自动比对 ✅ 凭证完整,可建 T+1 自动比对 ✅ 凭证完整,可建 T+1 自动比对 ⚠️ 正向凭证完整,逆向数据受限于 OMS
核心价值 全流程自动化,价值最大化 消除系统性偏差 + 释放对账人力 产品竞争力跃升,直接影响收入 至少实现对账追溯和偏差定位
落地阻力 低(自己说了算) 中(需外包团队配合) 低(自己说了算) 高(第三方不配合)

第五步:接入关键检查清单

1
商城系统保存 trace_id
正向计算返回的 trace_id 必须写入订单表(如 order.promotion_trace_id),并随订单持久化。这是后续退款和对账的唯一凭证。
2
配置售后策略模板
在 Admin 后台 → 售后策略模板 → 创建模板(比例分摊 / 保持优惠不退还 / 全额退优惠 / 阶梯降档重算)。然后在促销规则中引用该模板,正向响应才会返回 item_discounts 商品级分摊明细。
3
正向计算接口选择(根据业务场景)
标准计算POST /api/v1/promotions/calculate/ —— 传入显式规则编码列表,精确控制参与计算的规则。
标签计算POST /api/v1/promotions/tags/<tag_code>/calculate/ —— 按活动标签批量触发,适合大促场景(如"双11"标签下的所有规则)。
智能计算POST /api/v1/promotions/calculate/smart/ —— 支持 auto/tags/explicit 三种子模式,系统自动匹配可用规则。
计算调试POST /api/v1/promotions/calculate/debug/ —— 查看互斥检查详情,用于排查规则未命中的原因。
4
配置 Fallback 降级策略
引擎异常时不阻塞交易:正向计算超时 → 降级为原价或本地折扣;退款时 trace 过期 → 本地比例退款兜底。退款计算基于正向计算时保存的 trace 计算凭证读取分摊明细,不是重新计算促销
5
支付完成后上报使用留痕
调用 POST /api/v1/promotions/usage/ 异步上报(非阻塞),状态流转:pending → confirmed / cancelled。用于运营看板的 GMV、优惠渗透率等核心指标统计。
💡 给技术负责人的一句话总结

正向计算 = 商城调引擎算优惠,保存 trace_id。逆向计算 = 谁能读 trace_id 谁就调引擎退款 API;OMS 不配合时,引擎至少当「账本」用,对账和客服争议不再空口无凭。


第五章:常见问题与排查

Q1:规则已经设为「生效中」了,为什么顾客下单没享受到优惠?

最可能的原因:业务系统没有调用促销计算 API,或者调用时传了显式编码(promotion_codes)但没有包含你的规则编码。

排查步骤:1)让技术团队确认下单流程是否调用了促销计算接口(标准计算、标签计算、智能计算均可);2)检查请求参数中是否传了 promotion_codes 限制了规则范围;3)在「促销测试中心」中用同样的参数测试,看能否命中。

Q2:活动已经开始运行了,还能修改规则吗?

不可以。状态为「生效中」的规则,所有字段(包括规则名称、描述、门槛、优惠金额、时间范围等)均会被锁定,只能修改状态(改为「已暂停」或「已禁用」)。这是为了防止影响正在进行的订单。

如果需要修改规则内容:请先将状态改为「已暂停」或「已禁用」,修改完成后再重新激活。也可以停用旧规则后创建一条新规则。

Q3:为什么退款金额和下单金额差了几分钱?

原因:金额计算涉及 Decimal 精度舍入(四舍五入到分),多层计算可能产生 ±0.01 元的误差。这是正常情况。

建议:业务系统在处理金额时,允许 ±0.01 元的误差范围。如果误差超过这个范围,联系技术支持排查。

Q4:同一笔订单能享受多个优惠吗?

取决于互斥组配置。如果两个规则的策略类型在同一个互斥组内,只能享受其中一个(优先级高的)。如果不在同一互斥组,默认可以同时叠加。

常见可叠加组合:满减 + 包邮(通常是不同策略类型,不互斥);满减 + 折扣(如果在同一互斥组则互斥)。

Q5:怎么让秒杀商品不参与其他任何优惠?

创建一个互斥组:编码填 seckill(英文唯一标识符),策略类型勾选「秒杀」+「满减」+「满折」+「优惠券」+「阶梯价」,优先级设为最高(如100)。秒杀规则命中后,其他所有规则都会被跳过。

Q6:促销使用统计页面为什么是空的?

数据统计依赖使用留痕接口上报的数据。业务系统需要在订单完成后调用该接口传入 trace_idorder_id。如果还没接入或没有真实订单,页面就是空的。

Q7:trace_id 是什么?丢了怎么办?

trace_id 是每次促销计算生成的唯一凭证 ID,用于退款时读取计算凭证。如果丢了,退款计算会失败(返回错误码 TRACE_NOT_FOUND,未找到计算凭证)。

建议:让技术团队在创建订单时把 trace_id 和订单一起持久化保存。计算凭证在热库保留90天,超期后自动转入 OSS 归档存储;如需查询超过90天的凭证,请联系促销引擎平台技术支持线下处理。

Q8:促销测试中心的结果和实际下单结果不一致,为什么?

常见原因有以下几种,按排查顺序检查:

1)规则状态不同:促销测试中心只测试「生效中」的规则,而实际下单时如果规则状态是「草稿」或「已暂停」,不会命中。
2)显式编码限制:实际下单时业务系统可能传了 promotion_codes 参数,只让特定规则参与计算。测试中心默认不限制编码,会匹配所有生效中规则。
3)时间/用户/商品条件不同:测试中心传入的 contextcart_items 与实际下单参数不一致(如用户等级、商品品类等),导致条件匹配结果不同。
4)消费券差异:测试中心通常不测试消费券叠加,而实际下单时用户可能使用了优惠券,导致最终金额不同。

建议:用「规则调试测试」(单条规则详情页的测试按钮)验证单条规则的命中逻辑;同时让技术团队对比测试中心和生产环境的请求参数是否一致。

Q9:API 调用统计看板里的 P50、P95、P99 是什么意思?

这是衡量 API 响应时间稳定性的分位值(Percentile),比「平均值」更能反映真实用户体验:

P50(中位数):50% 的请求响应时间低于该值,代表典型情况。
P95:95% 的请求响应时间低于该值,代表绝大多数用户的体验。如果 P95 突然升高,说明有少部分请求变慢,需要排查。
P99:99% 的请求响应时间低于该值,代表最差情况。P99 飙高通常意味着有极端慢查询或网络抖动。

MyPromotion 的标准计算 API 正常 P95 应在 50ms ~ 200ms 之间。如果持续超过 500ms,请联系技术团队排查。

Q10:我想修改一条已生效的规则,必须先停用吗?会影响历史订单吗?

修改规则:状态为「生效中」或「待生效」的规则不能直接编辑。你需要先将状态改为「已暂停」或「已禁用」,修改后再重新激活。修改后的规则只影响后续的新订单

历史订单:历史订单的促销计算结果由当时的计算凭证(trace)固化保存,不受规则后续修改的影响。退款时读取的是凭证中的原始分摊明细,不是最新规则配置。这是设计上的「凭证固化」机制,确保退款金额与下单时一致。


第六章:词汇表与参考

术语一句话解释
促销规则定义「在什么条件下给什么优惠」的配置单元,如"满300减50"
策略类型优惠的计算方式,如满减、满折、特价、秒杀、包邮等
优先级规则之间的排序依据,数字越大越优先,同优先级时先创建的先应用
互斥组一组策略类型的集合,组内规则不能同时生效
标签规则的分类维度,用于批量管理和按标签触发计算
trace_id促销计算的唯一凭证 ID,用于退款时读取计算凭证
计算凭证(Trace / 快照)一次促销计算的完整上下文(请求参数、响应结果、商品级分摊明细)。凭 trace_id 查询,热库保留90天,超期后转入 OSS 归档。退款时直接读取凭证中的分摊明细,不再重新计算。在 Admin 后台菜单中也称为「促销计算快照」
使用留痕订单完成后上报促销使用记录的过程,用于数据统计
促销测试中心后台调试工具,测试所有「生效中」规则的计算结果,支持显式编码/标签/智能三种测试模式
规则调试测试单条规则的调试页面,可测试「草稿」和「生效中」状态,未命中时自动诊断原因
分层计算把优惠分为「平台促销层」和「外部券层」,明确各方职责
模板库预置的促销规则模板,用于快速复用常见活动配置
规则冲突检测自动检查多条规则之间是否存在条件重叠、互斥遗漏等冲突
动态用户分群按用户属性(等级、消费金额等)划分人群,用于规则定向
动态商品池按商品属性(品类、品牌、SKU等)划分商品集合,用于规则定向
消费券顾客主动领取/使用的优惠券,区别于系统自动计算的促销规则
消费券池消费券的模板管理中心,定义券的面额、门槛、发放总量等
组合规则控制多张消费券之间能否叠加使用的配置
售后策略定义退款时分摊方式、兜底人工处理的配置模板
item_discounts商品级优惠分摊明细,退款时直接读取,不再重新计算
价格保护防止促销后售价低于成本价或会员价的保护机制
策略关联配置定义每种促销策略允许使用的条件类型、动作类型和范围类型。创建规则时系统据此自动过滤可选项,避免给满减策略配了秒杀专属动作这类错误
规则审计日志记录促销规则的每一次增删改操作,用于追溯变更
数据源外部系统(电商平台/ERP/CRM等)的API连接配置,供同步任务使用
数据同步自动或手动将外部系统的商品/用户/券数据同步到本平台
Pull(拉取)平台定时调用外部系统的 API 主动拉取数据,适合有开放接口的系统
Push(Webhook 推送)外部系统主动推送数据到本平台的接收端点,适合有推送能力的 ERP/CRM
文件导入通过上传 Excel 文件批量导入数据,支持商品、用户、券等类型
同步日志记录每次数据同步/导入任务的执行详情,包括成功/失败条数
preview 模式促销计算的预览模式(preview=true),只返回优惠金额、不生成 trace_id,用于购物车凑单展示
promotion_codesAPI 请求参数,显式指定要参与计算的促销规则编码列表。不传则系统从所有生效中规则自动筛选
order_id业务系统的订单号,结算阶段调用计算接口时必须传入,用于绑定 trace_id 和订单
cost_price / member_price商品成本价和会员价,用于价格保护 POC 测试,未传时自动从商品库补全
P50 / P95 / P99API 响应时间的分位值。P95 表示 95% 的请求响应时间低于该值,是衡量接口稳定性的核心指标
access_key / secret_key租户级别的 API 身份凭证,业务系统调用接口时用于鉴权。不同租户完全隔离
购物车实时算价购物车阶段调用引擎实时计算优惠金额(preview 模式),让用户随时看到用了哪些规则、省了多少钱;同时返回凑单提示作为辅助参考
最优组合计算系统枚举所有合法规则子集,选出优惠力度最大的组合。规则数≤15且子集数≤500时精确枚举,超出时降级为贪心优先级模式
强制叠加 force_stackable规则级配置,开启后该规则强制与其他规则叠加,不受互斥组限制
叠加白名单/黑名单stackable_with(白名单,指定可叠加的促销编码)和 mutex_with(黑名单,指定不可叠加的促销编码)
Fallback 兜底退款时的降级策略:当退款满足金额超限、比例超限、多次退款等条件时,自动转人工审核
refund_version退款执行时的乐观锁版本号,防止同一笔退款被重复执行(幂等控制)
券售后策略按券类型自动匹配分摊模型(金额减免/折扣券/无门槛券→按比例分摊,阶梯券→阶梯重算,特价券→优先扣除),可为每种券类型选择处理方式:自动分摊/人工审核/不退回
测试用例在促销测试中心保存的固定测试参数组合,支持增删改查和自动 Payload 生成

MyPromotion 促销引擎 · 用户手册 · 最后更新:2026-05-03
遇到问题?点击页面右上角头像 → 「用户反馈」提交问题

×