← 返回首页 销售运营管理体系
客户生命周期 · 阶段判定逻辑规范

生命周期阶段
计算逻辑与取值规范

本文档面向开发团队,为模塑一体(6阶段)和商品模(6阶段)提供完整的 SAP/CRM 取数字段、判定公式、时间窗口定义及自动化触发机制。

SAP 自动取数 CRM 查询 需计算/推断 SAP + CRM 联合
00
判定逻辑概览
12 个阶段(两套业务各 6 个)的数据来源分类汇总
SAP 自动取数 — 直接查询 SAP 订单/账款/项目表
CRM 查询 — 直接查询 CRM 商机/RFQ/报价记录
需计算 — 基于 SAP 数据做时间窗口/增长率等衍生计算
SAP + CRM 联合 — 两系统数据同时参与判定(AND/OR 逻辑)
业务阶段名称数据来源核心判定逻辑类型
INT P1 潜在客户 联合 CRM 活跃商机 AND SAP 无成交(负向核验)
INT P2 新客户导入 SAP 项目号计数 = 1 AND 存在模具 SO
INT P3 成长阶段 计算 近6月新项目号 ≥ 2 OR 采购额环比增长 > 15%
INT P4 成熟阶段 计算 连续12月有 PO AND 项目总数 ≥ 3
INT P5 衰退阶段 联合 CRM 6月无新 RFQ AND SAP 采购额同比下降 > 15%
INT P6 流失/赢回 联合 SAP 6月无发货 AND CRM 无活跃 RFQ
COM P1 潜在客户 联合 CRM 活跃商机 AND SAP 无成交(同 INT-P1)
COM P2 新客户导入 SAP 项目号计数 = 1 AND 已转 PO
COM P3 成长阶段 计算 近12月项目号 > 2
COM P4 成熟阶段 计算 连续 2 个自然年均有成交记录
COM P6 衰退阶段 联合 SAP 12月无新成交 AND CRM 6月无新 RFQ
COM P7 流失/赢回 SAP SAP 连续18月无新成交
01
模塑一体业务(INT)· 阶段判定详细规范
6 个生命周期阶段,覆盖从潜在到流失的完整客户旅程
SAP + CRM INT P1 · 潜在客户 商务接洽期
CRM 取数
商机模块:状态为活跃(Open/In-Progress)的商机记录,按客户编号过滤
SAP 负向核验
SD 销售订单 / CO 项目:查询该客户是否存在任何已确认订单或项目号,结果为空才满足
判定逻辑
-- INT-P1: 潜在客户判定 -- 条件:CRM 有活跃商机 AND SAP 无任何成交记录 CRM_ACTIVE_OPP = COUNT(*) FROM crm.opportunities WHERE customer_id = :cust_id AND stage NOT IN ('Closed Won', 'Closed Lost') SAP_HAS_RECORD = COUNT(*) FROM sap.sales_orders -- VBAK/VBAP WHERE KUNNR = :cust_id AND order_status NOT IN ('Cancelled') IS_P1 = (CRM_ACTIVE_OPP > 0) AND (SAP_HAS_RECORD = 0)
SAP 负向核验范围:应包含销售订单(VBAK)、模具合同(CO 内部订单 AUFNR)、项目号(WBS/PRSNR)三类,任意一类存在均视为"有成交记录",P1 条件不满足。
SAP AUTO INT P2 · 新客户导入 准量产启动期
SAP 模块
CO / PS:项目号(AUFNR/PRSNR)+ SD:模具销售订单类型过滤
关键过滤条件
订单类型须为模具类(SO_TYPE = 'MOLD'),注塑量产 PO 不计入
判定逻辑
-- INT-P2: 新客户导入判定 -- 条件:SAP 项目号总数 = 1 AND 该项目已产生模具 SO PROJ_COUNT = COUNT(DISTINCT project_id) FROM sap.projects -- CO/PS 项目主数据 WHERE KUNNR = :cust_id AND project_status NOT IN ('Cancelled', 'Rejected') HAS_MOLD_SO = COUNT(*) FROM sap.sales_orders -- VBAK/VBAP WHERE KUNNR = :cust_id AND order_type = 'MOLD' -- 模具类订单类型 AND order_status = 'Confirmed' IS_P2 = (PROJ_COUNT = 1) AND (HAS_MOLD_SO > 0)
需计算 INT P3 · 成长阶段 业务爆发期
SAP 模块
CO/PS 项目(项目启动日期)+ SD/FI(采购金额统计)
时间窗口
滚动 6 个月(TODAY − 180 天至 TODAY)
判定逻辑(OR 关系,满足其一即进入P3)
-- INT-P3: 成长阶段判定(双条件 OR) -- 条件A:近6个月新启动项目号 ≥ 2 NEW_PROJ_6M = COUNT(DISTINCT project_id) FROM sap.projects WHERE KUNNR = :cust_id AND start_date >= (TODAY - 180) AND project_status NOT IN ('Cancelled') -- 条件B:采购金额环比增长 > 15% -- 定义:当前6个月采购额 vs 前6个月采购额 AMT_CURR_6M = SUM(net_value) -- VBAP.NETWR,已确认订单 FROM sap.sales_orders WHERE KUNNR = :cust_id AND confirm_date BETWEEN (TODAY-180) AND TODAY AMT_PREV_6M = SUM(net_value) FROM sap.sales_orders WHERE KUNNR = :cust_id AND confirm_date BETWEEN (TODAY-360) AND (TODAY-181) MOM_GROWTH = (AMT_CURR_6M - AMT_PREV_6M) / NULLIF(AMT_PREV_6M, 0) × 100 -- NULLIF 防止除零;前期无数据时 MOM_GROWTH = NULL,该条件不满足 IS_P3 = (NEW_PROJ_6M >= 2) OR (MOM_GROWTH > 15)
注意:前6个月(AMT_PREV_6M)为零时,增长率计算结果为 NULL(不满足增长条件),不应视为"无穷大增长"触发 P3。建议在业务文档中明确此边界,避免新客第一期数据被误判为成长期。
需计算 INT P4 · 成熟阶段 高效收益期
SAP 模块
SD 采购订单 EKKO/EKPO(PO 按月分组)+ CO/PS(项目号总数)
时间窗口
滚动 12 个月,按自然月分组(12 个 bucket)
判定逻辑(AND 关系,两条件同时满足)
-- INT-P4: 成熟阶段判定 -- 条件A:连续12个月均有滚动PO(每月至少1张) PO_MONTHS = COUNT(DISTINCT DATE_FORMAT(po_date, 'YYYY-MM')) FROM sap.purchase_orders -- EKKO/EKPO WHERE KUNNR = :cust_id AND po_date >= DATE_SUB(TODAY, INTERVAL 12 MONTH) AND po_status = 'Active' -- 连续性判断:需验证 12 个月内无断月,而非仅统计总月数 -- 建议实现:生成 12 个月日历,LEFT JOIN PO 数据,检查无空月 HAS_CONTINUOUS_PO= (MISSING_MONTHS_COUNT = 0) -- 见注释 -- 条件B:项目总数 ≥ 3 TOTAL_PROJ_COUNT = COUNT(DISTINCT project_id) FROM sap.projects WHERE KUNNR = :cust_id AND project_status NOT IN ('Cancelled', 'Rejected') IS_P4 = HAS_CONTINUOUS_PO AND (TOTAL_PROJ_COUNT >= 3)
连续性判断实现建议:使用日历表(dim_date)生成近12个月的月份列表,LEFT JOIN 到 PO 数据,统计 po_count = 0 的月份数(MISSING_MONTHS_COUNT)。若 = 0 则视为"连续",存在任何断月则 HAS_CONTINUOUS_PO = FALSE。
SAP + CRM INT P5 · 衰退阶段 产能萎缩预警
CRM 取数
RFQ / 商机模块:近6个月是否有新建 RFQ 记录
SAP 取数
SD 销售订单:采购金额同比(当年 vs 上年同期)
判定逻辑(AND 关系,两条件同时满足)
-- INT-P5: 衰退阶段判定(双系统 AND) -- 条件A(CRM):连续6个月无新 RFQ NEW_RFQ_6M = COUNT(*) FROM crm.rfq_records WHERE customer_id = :cust_id AND created_date >= (TODAY - 180) AND rfq_status != 'Cancelled' -- 条件B(SAP):采购金额同比下降 > 15% -- 定义:当前12个月 vs 上一个12个月(同比,非环比) AMT_CY = SUM(net_value) -- 当年滚动12月 FROM sap.sales_orders WHERE KUNNR = :cust_id AND confirm_date BETWEEN (TODAY-365) AND TODAY AMT_PY = SUM(net_value) -- 上年同期12月 FROM sap.sales_orders WHERE KUNNR = :cust_id AND confirm_date BETWEEN (TODAY-730) AND (TODAY-366) YOY_DECLINE = (AMT_PY - AMT_CY) / NULLIF(AMT_PY, 0) × 100 -- 正值表示下降,即 AMT_CY < AMT_PY IS_P5 = (NEW_RFQ_6M = 0) AND (YOY_DECLINE > 15)
预警前置建议:当 NEW_RFQ_6M = 0 但 YOY_DECLINE 尚未达到 15% 时,建议触发"衰退预警"(非正式阶段判定),推送给客户经理提前干预,而不是等到两条件同时满足才报警。
SAP + CRM INT P6 · 流失/赢回 供应脱钩期
SAP 取数
WM 发货通知 LIKPFI 收款凭证:近6个月是否有发货/入账记录
CRM 取数
RFQ / 商机模块:近6个月是否有任何活跃 RFQ
判定逻辑(AND 关系)
-- INT-P6: 流失/赢回判定 -- 注:原始规则"无发货(或无入账)"为OR关系,建议优先用发货记录,入账作为兜底 -- 条件A(SAP):连续6个月无发货记录 SHIP_6M = COUNT(*) FROM sap.deliveries -- LIKP,出库类型过滤 WHERE KUNNR = :cust_id AND actual_gi_date >= (TODAY - 180) AND delivery_status = 'Completed' -- 兜底方案(发货数据不可用时):查 FI 收款 PAYMENT_6M = COUNT(*) FROM sap.fi_payments -- BSID/BSAD 已清凭证 WHERE KUNNR = :cust_id AND clearing_date >= (TODAY - 180) -- 条件B(CRM):无活跃 RFQ ACTIVE_RFQ_6M = COUNT(*) FROM crm.rfq_records WHERE customer_id = :cust_id AND created_date >= (TODAY - 180) AND rfq_status NOT IN ('Cancelled', 'Closed Lost') IS_P6 = ((SHIP_6M = 0) OR (PAYMENT_6M = 0)) AND (ACTIVE_RFQ_6M = 0)
02
商品模业务(COM)· 阶段判定详细规范
6 个生命周期阶段,以模具项目为核心指标
SAP + CRM COM P1 · 潜在客户 准入与寻源期
与 INT-P1 的差异
逻辑完全相同,区别在于 CRM 商机类型须过滤为商品模类(OPP_TYPE = 'MOLD')
SAP 无成交定义
商品模无 SAP 注塑项目,仅查模具合同订单(AUFNR)是否存在
判定逻辑
-- COM-P1: 潜在客户(逻辑同 INT-P1,类型过滤不同) CRM_ACTIVE_OPP = COUNT(*) FROM crm.opportunities WHERE customer_id = :cust_id AND opp_type = 'MOLD' -- 商品模类型过滤 AND stage NOT IN ('Closed Won', 'Closed Lost') SAP_MOLD_ORDERS = COUNT(*) FROM sap.internal_orders -- CO AUFNR,模具合同 WHERE KUNNR = :cust_id AND order_status NOT IN ('Cancelled') IS_P1 = (CRM_ACTIVE_OPP > 0) AND (SAP_MOLD_ORDERS = 0)
SAP AUTO COM P2 · 新客户导入 破冰交付期
与 INT-P2 的差异
商品模不看"模具 SO",而是看是否已转 PO(Purchase Order)
SAP 模块
CO 内部订单 AUFNR(模具项目)+ MM/SD 采购订单 EKKO
判定逻辑
-- COM-P2: 新客户导入判定 -- 条件:SAP 模具项目号 = 1 AND 该项目已产生采购订单(PO) MOLD_PROJ_COUNT = COUNT(DISTINCT order_id) FROM sap.internal_orders -- CO AUFNR WHERE KUNNR = :cust_id AND order_type = 'MOLD' AND order_status NOT IN ('Cancelled') HAS_PO = COUNT(*) FROM sap.purchase_orders -- EKKO/EKPO WHERE KUNNR = :cust_id AND po_status = 'Released' -- 已转PO(已下单,非草稿) AND po_type = 'MOLD' IS_P2 = (MOLD_PROJ_COUNT = 1) AND (HAS_PO > 0)
需计算 COM P3 · 成长阶段 份额渗透期
与 INT-P3 的差异
时间窗口为12 个月(INT 为 6 个月),阈值为> 2 个(INT 为 ≥ 2),且无环比增长条件
SAP 模块
CO 内部订单:以项目启动日期在近12月内为统计口径
判定逻辑
-- COM-P3: 成长阶段判定(单一条件) -- 条件:近12个月内模具项目号数量 > 2 MOLD_PROJ_12M = COUNT(DISTINCT order_id) FROM sap.internal_orders -- CO AUFNR,模具项目 WHERE KUNNR = :cust_id AND start_date >= (TODAY - 365) AND order_status NOT IN ('Cancelled') IS_P3 = (MOLD_PROJ_12M > 2) -- 注:> 2 即 ≥ 3,与模塑一体 ≥ 2 的阈值不同,请注意区分
需计算 COM P4 · 成熟阶段 战略绑定期
与 INT-P4 的差异
商品模用自然年而非滚动月;判定逻辑为"2 个自然年均有成交",而非 PO 连续性
SAP 模块
CO 内部订单 / SD 销售订单:按自然年分组统计成交记录
判定逻辑
-- COM-P4: 成熟阶段判定 -- 条件:连续2个自然年均有模具项目成交记录 -- 当前自然年 = YEAR(TODAY),上一自然年 = YEAR(TODAY) - 1 ORDERS_CY = COUNT(DISTINCT order_id) FROM sap.internal_orders -- 模具合同/内部订单 WHERE KUNNR = :cust_id AND YEAR(confirmed_date) = YEAR(TODAY) AND order_status = 'Confirmed' ORDERS_PY = COUNT(DISTINCT order_id) FROM sap.internal_orders WHERE KUNNR = :cust_id AND YEAR(confirmed_date) = YEAR(TODAY) - 1 AND order_status = 'Confirmed' IS_P4 = (ORDERS_CY > 0) AND (ORDERS_PY > 0) -- ⚠ 边界情况:年初(如1月)时 ORDERS_CY 极可能为0 -- 建议:1-2月期间采用"最近24个月内跨自然年"替代方案 -- 替代方案:分别检查 [TODAY-730, TODAY-365] 和 [TODAY-365, TODAY] 两个区间
年初边界问题:每年 1–2 月期间,ORDERS_CY 极大概率为 0,导致几乎所有客户无法被判定为 P4(成熟),产生大规模误降级。建议采用"近24个月内跨越两个自然年"替代方案,或在 1–2 月期间使用滚动24个月的判定逻辑。
SAP + CRM COM P6 · 衰退阶段 份额流失预警期
SAP 时间窗口
连续 12 个月无新成交(比 INT-P5 的6个月更长)
CRM 时间窗口
6 个月内无新报价(RFQ),两条件均满足才触发
判定逻辑(AND 关系)
-- COM-P6: 衰退阶段判定 -- 条件A(SAP):连续12个月无新模具成交 NEW_ORDERS_12M = COUNT(*) FROM sap.internal_orders WHERE KUNNR = :cust_id AND confirmed_date >= (TODAY - 365) AND order_status = 'Confirmed' -- 条件B(CRM):近6个月内无新报价/RFQ NEW_RFQ_6M = COUNT(*) FROM crm.rfq_records WHERE customer_id = :cust_id AND created_date >= (TODAY - 180) AND rfq_status != 'Cancelled' IS_P6 = (NEW_ORDERS_12M = 0) AND (NEW_RFQ_6M = 0)
SAP AUTO COM P7 · 流失/赢回 业务静默期
与 COM-P6 的差异
时间窗口延长至 18 个月,仅看 SAP 成交,不再要求 CRM 无 RFQ
与 INT-P6 的差异
INT-P6 看发货记录(物流),COM-P7 看成交记录(合同),口径不同
判定逻辑
-- COM-P7: 流失/赢回判定(最终阶段) -- 条件:连续18个月无新模具成交记录 NEW_ORDERS_18M = COUNT(*) FROM sap.internal_orders WHERE KUNNR = :cust_id AND confirmed_date >= (TODAY - 548) -- 18个月 ≈ 548天 AND order_status = 'Confirmed' IS_P7 = (NEW_ORDERS_18M = 0) -- 注:P7 是在 P6 条件持续满足12个月后自然演进而来 -- 系统应优先判定 P7,若 IS_P7=TRUE 则不再判定 P6(避免同时触发)
03
共用 SAP / CRM 字段清单
两套业务复用的基础数据字段,建议统一封装为中台数据服务
SAP 核心字段
字段/表含义用于阶段
VBAK.KUNNR客户编号(销售订单)全部
VBAP.NETWR订单净额(金额统计)INT-P3/P5
VBAK.AUDAT订单日期(时间窗口过滤)INT-P3/P5
AUFNR(CO)内部订单号 = 模具项目号全部
EKKO/EKPO采购订单(PO),按月统计INT-P4/P2,COM-P2
LIKP.WADAT_IST实际发货日期INT-P6
BSAD.AUGDT收款清账日期(兜底)INT-P6
CRM 核心字段
字段含义用于阶段
customer_id客户编号(与 SAP KUNNR 映射)全部
opportunities.stage商机阶段(活跃/关闭)INT/COM-P1
opportunities.opp_type商机类型(MOLD/INJECTION)COM-P1
rfq_records.created_dateRFQ 创建日期INT-P5/P6,COM-P6
rfq_records.rfq_statusRFQ 状态(排除已取消)INT-P5/P6,COM-P6
🔗
客户ID映射是关键前提:SAP 的 KUNNR 与 CRM 的 customer_id 必须建立统一映射表(Customer Master Key)。所有联合判定(P1/P5/P6/COM-P6)都依赖此映射,若映射缺失或错误,将导致跨系统条件判定失败。建议在数据中台维护专用的客户主数据映射服务。
04
阶段判定执行流程与优先级
阶段之间存在包含关系,需按优先级顺序执行,命中即停止
推荐判定顺序(优先级从高到低)
-- 阶段判定主流程(每客户每次刷新时执行) -- 规则:按顺序判定,命中第一个满足的阶段即返回,不继续往下 FUNCTION detectStage(customer_id, biz_type): -- 0. 数据就绪检查 IF SAP_CRM_MAPPING_EXISTS(customer_id) = FALSE: RETURN 'DATA_ERROR' -- 映射缺失,无法判定 -- 1. 最终阶段优先(P6/P7 需最先判定,避免被更宽松的条件覆盖) IF biz_type = 'INT' AND IS_P6(customer_id): RETURN 'INT-P6' ELIF biz_type = 'COM' AND IS_P7(customer_id): RETURN 'COM-P7' ELIF biz_type = 'COM' AND IS_P6(customer_id): RETURN 'COM-P6' -- 2. 衰退阶段 ELIF biz_type = 'INT' AND IS_P5(customer_id): RETURN 'INT-P5' -- 3. 成熟阶段(条件最严格,需最先在正向阶段中判定) ELIF biz_type = 'INT' AND IS_P4(customer_id): RETURN 'INT-P4' ELIF biz_type = 'COM' AND IS_P4(customer_id): RETURN 'COM-P4' -- 4. 成长阶段 ELIF biz_type = 'INT' AND IS_P3(customer_id): RETURN 'INT-P3' ELIF biz_type = 'COM' AND IS_P3(customer_id): RETURN 'COM-P3' -- 5. 新客户导入 ELIF biz_type = 'INT' AND IS_P2(customer_id): RETURN 'INT-P2' ELIF biz_type = 'COM' AND IS_P2(customer_id): RETURN 'COM-P2' -- 6. 潜在客户(最宽松,排在最后) ELIF IS_P1(customer_id, biz_type): RETURN 'P1' -- 7. 无法归类 ELSE: RETURN 'UNCLASSIFIED' -- 如:历史档案客户,已离场但不满足P6/P7 -- 刷新触发机制: -- T1: 每月月结后 T+1 工作日批量刷新所有活跃客户 -- T2: CRM 新建 RFQ / 商机状态变更 → 即时触发单客户重判 -- T3: SAP 新建订单 / 发货完成 → 即时触发单客户重判
LC-STAGE · 客户生命周期阶段判定逻辑规范 优先落地:客户ID映射表 → SAP字段封装 → CRM RFQ统计接口 · 2026-04-20