商品页上被划掉的那个原价,只有你自己的价格历史能证明它存在过
本文目录
- 折扣的说服力全长在页面上,可它成不成立一个像素都不在页面上?
- 四个展示上的坑,来自十几万小时的可用性测试
- 可是这四条全都在处理同一个层面
- 划线价是一句话,不是一个数
- 说服力和真实性挤在同一个数字上
- 这个字段和商品页上别的字段有一处关键差别
- 打折没问题,问题在拿什么当基准
- 这篇和另一个价格数字讲的不是一回事
- 为什么这件事对做出海的人格外要紧
- 先给一个不太舒服的判断
- 你的划线价到底能拿哪个数字来划?
- 一份1967年的规则,把可比对象列了三种
- 第一种:跟自己的过去比,标准是善意
- 那个钢笔的例子,今天的独立站还在天天重演
- 一句只写“大促”不写数字的文案,也可能出问题
- 这份指南的性质:不是条文,但是执法的依据
- 第二种和第三种,需要的是站外的事实
- 做直连消费者品牌的人,把中间那两个参照系吃掉了
- 于是唯一剩下的参照系,是你自己的价格历史
- 顺带把两个常见的替代方案说死
- 欧盟为什么把“你是不是真心的”换成了一个能查询的数?
- 一条只有五款的新条文
- 把这条翻译成一句工程语言
- 定性标准和定量标准,差别不在严格程度
- 可自动化,意味着这件事该归工程
- 三个成员国选项,决定了你必须按国家分表
- 三十天到底从哪一天往回数
- 罚则那一条,对多市场经营的人有额外含义
- 顺便说一下英国不在这套体系里
- 一句总结
- 一条判决为什么把“立省23%”和“超值优惠”放进了同一条规则?
- 案子的事实,是一份周报上的两种水果
- 最要命的细节,在白框下面那一行小字里
- Aldi做对了一件事,做错了另一件
- 法院的结论只有一句话,但覆盖面很宽
- 这句话落到你的页面上是什么后果
- 那行小字里还藏着一个更细的毛病
- 披露是名词,基准是动词
- 顺带把散装商品那条也点一下
- 为什么这个案子对中国出海团队特别有参考价值
- 同一部条例为什么一边给你减负、一边给你加负?
- 第11条:打折时必须多标一个数
- 第11条第2款给了一条唯一的缓和路径
- 第11条第4款:两类不受约束的降价
- 但个性化这条豁免,不是一把万能钥匙
- 第9条第2款那条豁免,是写给多规格产品线的
- 由此长出一条真正可操作的策略
- 第9条:打折时可以少标一个数
- 同一部条例,一边减负一边加负
- 这条区别对系统设计的直接指导
- 同一个字段在六十年里为什么被改得越来越不敢说话?
- 数据源里那个price字段,定义是“不打折时的价格”
- 对一个常年在打折的品类,这个假设不成立
- 渠道还要求这两处保持一致
- 还有一条经常被忽视的展示要求
- 结构化数据这一层,词表刚刚改了名字
- 促销的起止时间同样是有字段的
- 这次改名,是一次悄悄的撤退
- 把三个定义按时间排开,会看到一条退让的曲线
- 为什么词表会做这种撤退
- 那四个展示上的坑,搬到多币种站上还剩几个?
- 第一条:价格别淹在页面里,这条完全成立
- 第二条:折扣信息别离价格太远,这条也成立
- 第三条:同一个优惠别写好几遍,这条要加一层
- 可这个毛病的根源不在文案,在系统
- 第四条:百分比还是绝对金额,这条一出海就失效
- 正确的做法是把法则本身实现出来,而不是把阈值抄过来
- 这四条在移动端上,优先级要重排
- 还有一个研究没测到、却最容易掉量的坑
- 还有一条研究没说、但跨境必须补的
- 价格历史该怎么存,才经得起“过去30天最低价是多少”这一问?
- 先破一个最常见的误解
- 那张表该记什么
- 为什么很多站真的没有这张表
- 所以该记的是渲染出来的那个数
- 价格历史的六维治理,和售价对比一下
- 变体和多规格,是这张表最容易记错的地方
- 一个能报数的指标:折扣兑现率
- 保留期该定多长
- 价格历史不是只有你在存
- 先做诊断,别急着改代码
- 促销日历一加密,一段一直正确的代码就开始违规
- 客户与背景
- 那个看起来完全合理的决定
- 它上线后有整整一年是无害的
- 第二年,业务把它激活了
- 为什么没人发现
- 那张图给我的教训比警告函本身更重
- 改了三处
- 结果,以及一个意料之外的收获
- 这件事从哪一步开始做,才不会变成每次大促前的救火?
- 第一周:只出三张清单,一行代码不改
- 第二周:先修数据,别碰展示
- 第三周:把计算前移到排期环节
- 第四周:统一表达层
- 上线前的十八项自查
- 三条该让你停下来的反信号
- 三种投入档位,按团队规模挑一个
- 该写进帮助中心的那段公共答案
- 最后回到那个被划掉的数字
- 常见问题解答
- 划线价一定要等于三十天最低价吗,标日常价不行吗?
- 新品刚上架不满三十天,怎么打折?
- 会员价和优惠券能绕开这条规则吗?
- 大促期间促销一场接一场,前价是不是会越标越低?
- 美国站和欧盟站能用同一套划线价逻辑吗?
- 完全没有历史数据,从零开始要多久才能正常打折?
- 干脆不显示划线价、只标现价,是不是最安全?
- 权威参考资料
摘要:商品页上被划掉的那个价格不是价格,是一句断言,断言你以前卖过这个数。美国1967年的规则问你是不是善意挂过,欧盟2019年起改问你过去三十天的最低价是多少,Google的词表干脆把这个字段从厂商建议零售价改名成划线价。做直连消费者品牌的人没有同区域比价、也没有第三方厂商,唯一合法的参照系只剩自己的价格历史。
折扣的说服力全长在页面上,可它成不成立一个像素都不在页面上?
先把这件事的性质说清楚:划线价不是一个价格,它是一句关于过去的话,而这句话的真假不由版式决定。
先说清楚这篇要处理的是哪个数字。商品页上那个带删除线的价格,行业里叫划线价,代码里通常叫originalPrice或者compareAtPrice,营销同学口中叫原价。它挨着实际售价,字号小一号,颜色浅一档,几乎所有做电商的人都默认它是个装饰件。
它不是装饰件。它是整个商品页上唯一一个对过去做出事实陈述的元素。
四个展示上的坑,来自十几万小时的可用性测试
Baymard Institute那篇讲商品页折扣展示的研究里,把常见毛病归成四类:价格与折扣淹没在页面其他元素里、折扣信息离价格太远、同一个促销在页面上被写了好几遍、以及没有把降幅用百分比或者绝对金额突出出来。他们给的量化结论是,18%以上的站至少中了其中一条,其中桌面端有18%的站让用户找价格找得费劲,14%的站把促销信息摆在离价格很远的地方,而在展示促销的站里有19%用多种说法描述同一个优惠,把用户绕晕。
这些结论我基本都认。测试里有个受试者在Patagonia的商品页上反复上下滚动找价格,最后骂了一句才发现它就在标题下面;Baymard记的那次测试里,67%的参与者在这个站上找价格有困难。另一个受试者在MVMT上看到全站横幅在推折扣,商品页的价格却没体现,只好先把商品加进购物车才看到折后价。这类观察很扎实,它们描述的是人眼在一屏信息里的搜寻行为。要把这类问题一条条验过去,从按钮到结账的三十个对照实验方案里有现成的题目可以照着排。
可是这四条全都在处理同一个层面
字号、颜色、位置、重复次数、用百分比还是用绝对金额——这五个变量有一个共同点:它们全都关于这个数字长什么样,没有一个关于这个数字是什么。
把划线价放大两号、涂成红色、挪到价格旁边,用户确实更容易看见它,也确实更容易相信自己捡到了便宜。但这一整套操作里没有任何一步验证过一件事:这个商品在此之前,究竟有没有卖过那个被划掉的价。
划线价是一句话,不是一个数
把它翻译成中文就清楚了。页面上写着划掉的 €59.00、现价 €39.00,等于对着买家说了一句:这件东西原来卖59欧元,现在卖39欧元。这是一个可以为真也可以为假的陈述句,跟天气预报、财务报表、产品参数是同一类东西。
而排版能做的事只有一件——让这句话更容易被听见,更容易被相信。排版不改变这句话的真假,它只放大这句话说错时的后果。把一句假话印得更大更红,不叫优化,叫加重情节。
说服力和真实性挤在同一个数字上
这是折扣展示这件事真正拧巴的地方。商品页上大多数元素,说服力和真实性是分开的:产品图负责说服,规格表负责真实;文案负责说服,成分表负责真实。你可以把图拍得好看,规格表照实写,两者互不干扰。
划线价不行。同一个数字既是说服工具又是事实陈述,而这两种身份的优化方向恰好相反——作为说服工具它越大越好,作为事实陈述它必须精确等于某个特定的值。营销团队天然往前一个方向推,而后一个方向没有人负责推,因为它看起来根本不像一个需要有人负责的事。
这个字段和商品页上别的字段有一处关键差别
售价填错了,你会在几分钟内知道。支付网关会照着它扣款,财务会照着它对账,毛利报表会照着它跳水,客服会接到电话。售价周围站着一圈随时会替你报警的系统。
划线价周围一个都没有。它不参与结算,不进对账,不影响任何一张财务报表,改了不会有任何下游系统抗议。它在数据库里是一个自由输入的数字,谁有后台权限谁就能改,改完没有日志、没有审批、没有比对。一个能被随便写、没有任何一方会因为它不对而叫痛的字段,最后长成什么样,基本可以预料。这跟法务与业务之间那些没人认领的动作点是同一类组织毛病,缺的从来不是能力,是一个会因为它出错而难受的人。
打折没问题,问题在拿什么当基准
这里先把立场说明白,免得后面几节读起来像在劝人别打折。促销是正当的商业手段,限时降价、清仓、季末处理、节日活动,全都合法也全都有效。所有这些规则处理的都不是“能不能降价”,而是“降价的时候,你拿哪个数字来衡量自己降了多少”。
换句话说,被管的是那句比较,不是那个动作。你把59欧元的东西卖39欧元,这件事没人有意见;你说这是打了六六折,这句话就得站得住。差别在于前者是你的经营自由,后者是你对公众做的一次陈述。
这篇和另一个价格数字讲的不是一回事
我前不久写过商品列表页上那个每千克价格的分母到底该取哪个数,两篇很容易被当成一件事,这里先划清界限。那篇处理的是分母:单位价格等于售价除以含量,麻烦全在含量那一侧——净含量、稀释后等效量、能用多少次,三个数都在你系统里,法律只认其中一个。
这一篇处理的是分子的参照物:不是这个价格该除以什么,而是这个价格该跟什么比。两者在条文上甚至分属不同章节,在代码里分属不同模块,在组织里往往也分属不同的人。唯一的共同点是,它们都是页面上看起来最不重要、实际上最没人管的那类数字。
为什么这件事对做出海的人格外要紧
国内电商环境里,划线价长期是个软规则,平台管得比法律紧,处理方式通常是平台侧的规则限制加事后申诉。出海之后规则的形态完全变了:在欧盟,它是一条写进指令、由成员国转化成本国条例、可以被消费者协会和竞争对手直接告上法庭的强制义务;在美国,它是联邦贸易委员会一份沿用了半个多世纪的指南;在英国,它2025年4月起进了一份无条件禁止清单。
更麻烦的是,这三套规则对同一个数字给出了三个不同的定义,而你的系统里通常只存了一个数。这篇文章要做的事,就是把这三个定义摆开、把它们各自要求你存下什么摆开,然后说清楚在只有一张商品表和一个compareAtPrice字段的现实里,该怎么把这件事收拾干净。顺带一提,主体设在哪个法域也会影响你先撞上哪一套规则,这方面可以对照美国、英国与香港三地架构的税务与合规差异。
先给一个不太舒服的判断
如果你现在打开自己的后台,找不到一张能回答“这个SKU在过去三十天里,对消费者适用过的最低价是多少”的表,那么你所有的折扣展示优化——不管做得多漂亮——都建立在一个你没有能力验证的断言上。
这不是危言耸听,这只是把顺序摆正:先有可验证的参照价,再谈这个数字该用多大的字号。顺序反过来的时候,做得越用力,暴露得越快。
你的划线价到底能拿哪个数字来划?
美国那份1967年的老指南里其实写了三个可比对象,而做直连消费者品牌的人,亲手把其中两个吃掉了。
要判断一句“原价59欧元”是真是假,你得先回答一个更基础的问题:跟谁比。这个问题的答案不止一个,而且不同答案对应完全不同的举证责任。
一份1967年的规则,把可比对象列了三种
美国联邦贸易委员会的《反欺骗性定价指南》收在联邦法规汇编第16编第233部分,最初发布于1967年11月8日,五十多年没有实质改动,今天仍然生效。它一共五节,前三节各处理一种比较方式,读下来会发现它其实是在给“打折”这件事做分类。
第233.1节处理的是跟自己的历史价比:广告里说“原价多少、现价多少”。第233.2节处理的是跟同区域别家的价比:广告里说“别处卖10美元,我们卖7.5美元”。第233.3节处理的是跟厂商建议零售价比:广告里说“建议零售价10美元,我们卖7.5美元”。第233.4节管买一赠一那类,第233.5节兜底。
第一种:跟自己的过去比,标准是善意
第233.1节(a)款给的判据是,前价必须是实际的、善意的、在合理相当的一段时间内按常规向公众提供过的价格。反过来,如果那个前价是虚构的——比如人为设一个虚高价,就为了随后能宣布一次大降价——那么这个所谓的便宜就是假的,买家没有得到他以为自己得到的那份额外价值。
这一节里有一句话特别容易被误读,值得单独拎出来:前价不会仅仅因为没有人按那个价成交过就被认定为虚构。也就是说,挂牌但零成交的价格,在美国规则下仍然可以当前价用。但紧接着的限定条件很重,这个价格必须是公开且主动地、在合理相当的时间内、在近期的正常经营过程中、诚实并善意地提供过的。而且第233.1节(b)款还补了一句:除非确实有相当数量的成交,否则要避免任何暗示前价是成交价的措辞,比如“原售价多少”这种写法。
那个钢笔的例子,今天的独立站还在天天重演
第233.1节(c)款举了个例子。零售商约翰进货成本5美元一支钢笔,惯常加价五成,也就是常规售价7.5美元。为了随后能推出一个惊人的优惠,他先把标价挂到10美元。他清楚这个价格基本卖不掉,但他不在乎,因为只挂几天。然后他把价格“降”回7.5美元这个原本的水平,打出广告:超值特惠,原价10美元,现仅售7.5美元。
这个手法在今天有个更好听的名字,叫“新品上架高开”,在给零流量商品重新找机会这类场景里尤其常见。做法完全一样:新品上线时挂一个没打算卖的价,挂两周,然后进入长期折扣状态。半个多世纪前就被点名的做法,换了个说辞又活了一遍。
一句只写“大促”不写数字的文案,也可能出问题
第233.1节(e)款处理的是另一种情形:广告里既不写前价也不写降幅,只写一个“Sale”。条文说,这时候商家要注意降价幅度不能小到毫无意义,它应当大到足以让消费者在知道具体数额后仍然认为自己得到了真实的优惠。举的例子是把原价10美元的商品标成“降至9.99美元”——消费者会理解成这是一次相当可观的让利,而不是一分钱。
这一条在国内的运营语境里几乎没有对应物,但它揭示了美国这套规则的性质:它管的不只是数字对不对,还管这次促销在实质上算不算一次促销。这种判断没法写进代码,只能由人来做,最终由法院来做。
这份指南的性质:不是条文,但是执法的依据
需要说明一句,第233部分的正式名称是《反欺骗性定价指南》,属于指南而非规则,授权来自《联邦贸易委员会法》第5条和第6条。它本身不直接设定罚则,作用是说明委员会在什么情况下会认为某种定价宣传构成不公平或欺骗性行为。换句话说,违反它不等于自动挨罚,但它是执法机构判断的公开标准,也是原告律师起草诉状时的现成模板。
对做出海的人来说,这个性质意味着两件事:一是没有一个明确的数字门槛让你踩着线走;二是判断权在别人手里,而对方使用的判据里有大量“善意”“合理”“相当数量”这类词。这是一套你无法在发布前自证合规的规则。面对这类规则,唯一靠谱的做法是把判断交给流程而不是交给某个人的记忆,思路可以参考出海合规架构的分层做法。
第二种和第三种,需要的是站外的事实
第233.2节和第233.3节的判据都指向你的门外。前者要求你合理确信自己宣称的那个较高价格没有明显超过本区域内该商品实际大量成交的价格;第233.3节则说得更直白:厂商建议零售价只有在你的经营区域内有相当数量的实际成交发生在这个价位上时,才不算虚构。它明确指出,如果这个建议零售价明显高于本区域内实际大量成交的最高价,消费者被误导的风险就很清楚也很严重。
第233.3节(i)款还堵了一个口子:厂商不得为了配合特定零售商而在标签上印虚高价,让对方拿去做虚假的降价比较。这句话是写给品牌方看的。
做直连消费者品牌的人,把中间那两个参照系吃掉了
现在把这三种比较方式放到一个直连消费者的独立站上,逐条对一遍。
| 可比对象 | 传统零售商能不能用 | 直连消费者品牌能不能用 | 原因 |
|---|---|---|---|
| 自己的历史价 | 能用 | 能用 | 只要留了价格变更记录 |
| 同区域别家的售价 | 能用 | 基本用不了 | 自有品牌在本区域没有第二家在卖同一件商品 |
| 厂商建议零售价 | 能用 | 用不了 | 你自己就是厂商,你建议的价就是你自己定的价 |
| 同类可比商品价 | 能用 | 风险高 | 要证明对方商品在品质上确实相当,且在本地买得到 |
第二行的原因很直接:自有品牌商品只在自己站上卖,所谓的本区域市场价不存在。第三行更彻底——当你既是厂商又是唯一的零售商,厂商建议零售价这个概念在逻辑上就塌掉了:你在拿自己定的一个数字,去证明自己定的另一个数字很划算。第233.3节要求的“相当数量的实际成交发生在这个价位”,在只有一个销售渠道的情况下,等价于要求你自己真的按那个价卖过——绕一圈又回到了第233.1节。
于是唯一剩下的参照系,是你自己的价格历史
这就是这篇文章的核心判断。传统零售商手上有三条可比路径,做直连消费者品牌的人在商业模式上主动砍掉了两条——砍得很值,因为砍掉中间商正是这个模式的全部意义——但砍掉的同时,也把折扣宣称的举证责任全部压回了自己的价格历史上。
这也是高客单价品牌更依赖内容和信任的另一面:既然没有第三方价格可供比较,你就得自己把这件东西凭什么值这个价说清楚。这里还有个不太好笑的对称:直连消费者品牌最引以为豪的那件事,恰好让它在折扣合规上只剩一条退路,而那条退路是一张多数人根本没建的表。参考出海独立站定价的决策框架里的说法,价值定价的品牌尤其吃亏——它的定价本来就不参照成本也不参照同行,那它更没有第二个数可拿来比。
顺带把两个常见的替代方案说死
方案一是拿别的市场的价来划。比如欧洲站显示的原价其实是美国站的价格,或者是没打折那个国家的价格。这个做法在第233.2节下站不住,因为它比较的不是消费者所在区域的价格;在欧盟规则下更站不住,理由下一节讲。多市场的价格本来就该按各市场独立的店铺架构来管,跨市场借用一个数字,等于把两边的口径同时弄脏。
方案二是拿建议零售价当划线价,而这个建议零售价是自己拍的。这个在第233.3节下就是典型的虚构价,而且是被条文点名的那一种。一个只在你自己的价格表里出现过、从没被任何人按这个价买走过的数字,不管你在后台把它命名成什么,都不能拿去做比较。
欧盟为什么把“你是不是真心的”换成了一个能查询的数?
同一件事,一边问动机,一边问数据。这个差别决定了它在你这儿是法务议题还是工程议题。
欧盟处理同一件事的路径完全不同。它没有去定义什么叫善意,而是把这个概念替换成了一个可以从数据库里查出来的数。
一条只有五款的新条文
2019年11月27日通过的第2019/2161号指令,业内习惯叫它现代化指令,做的事之一是给1998年的价格标示指令插入了一条新的第6a条。这条不长,五款,值得逐款读。
第6a条的五款条文可以这样拆。第1款:任何降价公告都应当标明商家在降价适用之前的某一确定期间内所适用的前价。第2款给出前价的定义:前价指商家在降价适用之前不短于三十天的期间内所适用的最低价格。第3款允许成员国对易腐或保质期短的商品另定规则。第4款允许成员国对上市不满三十天的商品缩短这个期间。第5款允许成员国规定,在降价幅度逐步加大的情况下,前价取首次降价开始之前的那个未降价的价格。
把这条翻译成一句工程语言
它说的其实是一句SQL。取这个商品在过去三十天里所有对消费者生效过的价格,求最小值,这个最小值就是你唯一可以拿去划线、也是唯一可以拿去算百分比的那个数。
注意条文用的动词是“适用过”,不是“成交过”。只要这个价格在你的站上对消费者生效过——哪怕一单没卖出去——它就进入了那个取最小值的集合。这一点和美国规则表面上一致(都不要求成交),实质上正好相反:美国允许你把一个没成交的高价当前价,欧盟则强迫你把一个没成交的低价算进来。同一个“不要求成交”,一个是给你放宽,一个是给你收紧。
定性标准和定量标准,差别不在严格程度
很多人的第一反应是欧盟这条更严。我的看法不太一样,它们严格程度未必可比,真正的差别在别处。
| 对比维度 | 美国那套(第233部分) | 欧盟那套(第6a条) |
|---|---|---|
| 问的问题 | 你当时是不是真心想按那个价卖 | 你过去三十天的最低价是多少 |
| 判据类型 | 意图、商业惯例、是否公开主动 | 一个可计算的统计量 |
| 需要的证据 | 邮件、会议纪要、上架决策、销售记录 | 一张带时间戳的价格变更表 |
| 谁能判定 | 执法机构与法院,事后 | 你自己,事前 |
| 发布前能否自证 | 不能,只能自我评估风险 | 能,跑一次查询就知道 |
| 在组织里归谁 | 法务与市场负责人 | 数据与工程 |
| 降幅太小算不算问题 | 算,第233.1节(e)款明确管 | 不算,标出前价即可 |
最后一行的差别很有意思。在欧盟,你把三十天最低价老实标出来,然后只降五分钱,条文层面挑不出毛病;在美国,这样做本身就可能构成误导。一个管披露,一个管实质。管披露的规则可以自动化,管实质的规则不能。
可自动化,意味着这件事该归工程
这是我认为最值得跟团队讲清楚的一层。当一条规则的判据是一个可计算的数,它就从法务议题变成了工程议题,处理方式也跟着变——不再是每次大促前请法务过一遍文案,而是在促销排期系统里加一道发布前的校验。
这个转变的收益不只是省了法务的时间。更重要的是它把这件事从事后挪到了事前:法务过文案只能告诉你“这么写风险有点高”,而一次查询能告诉你“这次能标的前价是39欧元不是59欧元”,是个确切答案。团队对确切答案的执行率,比对风险提示的执行率高得多。
三个成员国选项,决定了你必须按国家分表
第3、4、5款都是“成员国可以”,也就是说这三处规则在二十七个国家里未必一样。易腐商品的例外、新品不满三十天的处理、逐步加大降幅时前价怎么取——每一条都可能在德国是一个样,在法国是另一个样。
落到实现上就一句话:三十天这个窗口长度和例外规则必须做成按市场配置的表,不能硬编码。这和单位价格那篇里分母必须按市场加品类做映射是同一种结构,都是欧盟指令留了成员国选项之后必然长出来的形态。做多语言多货币站点的价格体系时,这类按市场分叉的配置最好从一开始就集中在一处,别散落在主题模板里。
三十天到底从哪一天往回数
条文写的是“降价适用之前”,这个起点比想象中容易搞错。它不是你在排期表里填的活动开始日,不是营销物料的定稿日,也不是你把商品加进促销组的那一刻,而是新价格第一次对消费者生效的那个时点。促销提前配好但定时在凌晨生效,窗口就从凌晨那一刻往回数。
这带出两个很实际的问题。第一是时区:如果你的价格调度器跑在服务器所在时区,而消费者在另一个时区看到页面,窗口的两个端点就会各偏几个小时;对一次跨过月末的促销来说,这几个小时足够把某天的一次降价挪进或挪出窗口。第二是同一天内的多次改价:手动改错了又改回来的那个短暂的低价,同样属于对消费者适用过的价格。含税与不含税之间的换算也会引入同类偏差,处理方式可以对照税率、税务类与含税显示的配置。只在页面上存在过十分钟的一个错误低价,进不进那个最小值集合,条文没有给你留缝。
罚则那一条,对多市场经营的人有额外含义
同一份现代化指令还改写了价格标示指令的第8条,要求成员国规定有效、相称且具劝阻力的罚则,并列了六项在裁量时应予考虑的标准:违法行为的性质、严重程度、规模与持续时间;商家为减轻或补救消费者损害所采取的行动;商家此前的违法行为;因违法获得的收益或避免的损失;以及一条对跨境经营者特别重要的——在跨境案件中,若可通过第2017/2394号条例建立的机制获知信息,商家在其他成员国因同一违法行为已受的处罚也在考虑之列。
把这条读明白:欧盟内部有一套合作机制在传递处罚信息。在德国被处理过一次,会成为法国那边加重考量的情节,而你不需要做任何事这个信息就会传过去。对同时开着好几个国家站点的团队来说,这意味着不能把各国的合规问题当成互相独立的事件来处理。这一点跟商品页上的环保声明要拿得出证据是同一条线上的事:欧盟这几年在商品页上加的义务,都是把一句口号换成一份可核验的材料。
顺便说一下英国不在这套体系里
英国脱欧之后没有跟进第6a条,所以英国站上没有三十天最低价这个硬性口径。但这不等于英国更宽松,只是它的规则形态更接近美国那一侧——靠不公平交易行为的一般条款加执法机构的指引来管,判据也是定性的。
2024年的《数字市场、竞争与消费者法》给出了一份在任何情况下都被禁止的商业行为清单,其中一条从2025年4月6日起生效,禁止虚假声称某商品仅在有限时间内可得,或仅在有限时间内可按特定条件获得,以促使消费者立即作出决定、剥夺其充分了解与思考的机会。这条管的不是价格数字,而是促销窗口的真实性。也就是说,同一块促销组件,德国审查的是那个划线数字,英国审查的是旁边那个倒计时。
一句总结
欧盟做的事是把一个关于动机的问题,换成了一个关于数据的问题。这个替换让合规变得可预测,代价是它不再听你解释。你不能说我们本来打算按这个价长期卖的,也不能说那次降价是个失误——条文只看那张表里的最小值。而这恰恰是好消息:可预测的规则,才有可能被工程化地满足。
一条判决为什么把“立省23%”和“超值优惠”放进了同一条规则?
卢森堡那份判决里的香蕉和菠萝,把披露和基准这两件常被当成一回事的东西彻底分开了。
把前价标出来,和把降幅算在前价上,是两件事。很多团队做到了第一件就以为完事了,而欧盟法院2024年的一份判决恰恰是冲着第二件去的。
案子的事实,是一份周报上的两种水果
德国巴登符腾堡州消费者中心把Aldi Süd的一家服务公司告到了杜塞尔多夫地方法院,后者在2023年5月19日决定向欧盟法院提出先决裁判请求,案号C-330/23,判决由第八庭在2024年9月26日作出。
争议对象是2022年10月17日到22日那一周的宣传册。册子上把几样生鲜标成“已降价”,其中包括散装的公平贸易有机香蕉和雨林联盟认证菠萝。每样商品旁边有一个白色矩形,矩形中间是大字号的价格(香蕉1.29欧元、菠萝1.49欧元),右下角是一个小字号的划线价(两样都是1.69欧元)。香蕉那格上叠着一个德国国旗配色的方块,标着降价百分比;菠萝那格用了同样形状的叠加块,写的是“价格亮点”。
最要命的细节,在白框下面那一行小字里
两个白框下方各有一行文字:“上次售价。最近三十天内最低价”,后面跟着第三个价格——香蕉1.29欧元,菠萝1.39欧元。
停下来看一眼这两个数。香蕉的最近三十天最低价是1.29欧元,而这次促销的售价也是1.29欧元。也就是说,按第6a条的口径,这次香蕉的降幅是零,而广告上正印着一个国旗配色的百分比。菠萝更进一步:三十天最低价1.39欧元,本次促销价1.49欧元——那个被标注为“价格亮点”的价格,比它自己过去三十天里的最低价还高出一毛。
裁判请求书还交代了一个背景:香蕉在Aldi各门店的售价自2022年9月中旬起一直稳定在每公斤1.69欧元,只有9月19日到24日那一周降到过一块二出头。
Aldi做对了一件事,做错了另一件
这个案子有意思的地方在于,被告并不是一家藏着掖着的公司。它把三十天最低价老老实实印在了页面上——多数中国出海站到今天都没做到这一步。它做的是把披露义务当成了全部义务。
错在哪里?错在那个大大的百分比和那个“价格亮点”的表述,都是拿1.69欧元这个日常价当基准算出来的,而条文规定的基准是1.29欧元。一个页面上同时存在两个基准:给人看的那个和给合规看的那个,而醒目程度差着好几个量级。
法院的结论只有一句话,但覆盖面很宽
判决主文的意思是:第6a条第1款和第2款必须解释为,商家以百分比形式宣布的降价,或者以旨在突出所宣布价格优惠性的促销表述形式宣布的降价,都必须以该条第2款意义上的前价为基准来确定。
请注意后半句的范围。它没有停在百分比上,而是把“旨在突出价格优惠性的促销表述”一并纳入。这一句让规则从一个数字扩张到了一整类文案。做品牌声音体系的时候,这类促销措辞通常被划在市场同学的自由创作区里,而现在它们全部落进了受约束的范围。
这句话落到你的页面上是什么后果
把常见的促销表述按这个口径过一遍,很多写法要重新算。
| 页面上的写法 | 是不是降价公告 | 必须以三十天最低价为基准吗 |
|---|---|---|
| 划掉59欧元,现价39欧元 | 是 | 是,被划掉的那个数就得是前价 |
| 立省33% | 是 | 是,判决直接点名百分比 |
| 省20欧元 | 是 | 是,绝对金额同样是在算降幅 |
| 价格亮点、超值特惠、本季最划算 | 是 | 是,属于突出优惠性的促销表述 |
| 年度最低价 | 是 | 是,而且这句话本身还得为真 |
| 新品上市、限量发售 | 不是 | 不涉及降价宣称 |
| 会员专享价 | 通常不是 | 个性化降价另有规则,见下一节 |
第四行是这份判决扩出来的新地盘。过去很多团队以为只要不写数字就安全,把“立省33%”换成“超值特惠”当作规避手段——这条路被这份判决明确堵死了。
那行小字里还藏着一个更细的毛病
回头再看Aldi那行文案:“上次售价。最近三十天内最低价”,一个句号隔开两句话,后面跟着一个数字。这行字用两个不同的定义指向了同一个数——上次售价是一个时间上最近的值,三十天最低价是一个区间上的最小值,它们只在特定情况下才相等。
这个毛病在中文站上更常见,因为翻译过程会把口径进一步磨平。原价、日常价、参考价、前价、上次售价、三十天最低价,这六个词在运营的口头表达里几乎通用,落到页面上却是六个可能不同的数。文案措辞会替你给这个数字下定义,而买家和执法者读到的是文案给的那个定义,不是你代码里算的那个。所以文案定稿这一步,必须和口径确认放在一起做,不能各走各的评审流程。同样的问题在社会证明体系里也存在——一句“上万人选择”背后到底对应哪个统计口径,多数站也答不上来。
披露是名词,基准是动词
我觉得这个案子最值得记住的是这组区分。把三十天最低价印出来,是一个静态的展示动作,做起来不难,加个字段加行文案就行。而以它为基准,是一个运算约束,它要求页面上所有跟“便宜了多少”有关的表达,都必须从同一个数出发。
后者难得多,因为这些表达散落在各处:商品页的价格模块、列表页的角标、全站横幅、邮件模板、广告素材、商品数据源里的字段。做披露只要改一个地方,改基准要把所有会说“省了多少”的地方都接到同一个数上。
顺带把散装商品那条也点一下
这个案子还有个容易被忽略的层次。香蕉是按每公斤1.69欧元散装标价的,而按价格标示指令第3条第3款,散装商品只需标单位价格。那么被拿去算百分比的那个基准价,本身就是一个单位价格。换句话说,我在前一篇里处理的分母口径和这篇处理的参照价口径,在这个案子里落到了同一个数上。
这不是巧合。只要你的商品是按单位价格标示的,两套规则就会叠在一起:分母得对,参照系也得对,错一个整句话就不成立。做食品、日化、耗材这类品类的站,需要同时把两件事纳入自查。
为什么这个案子对中国出海团队特别有参考价值
因为原告不是政府。德国这条赛道的执行主体是消费者协会和竞争对手,路径是发警告函加要求签署附违约金的停止侵害承诺书。这套机制的启动成本极低,对方只需要保存一份你的页面截图。而截图这件事,任何一个竞争对手的市场专员都能每周做一次。做大促排期时把这条算进风险清单,比事后请律师便宜得多。
更值得注意的是被告的规模。一家把三十天最低价印在页面上、显然请过法律顾问的连锁零售巨头,仍然在这个点上输掉了官司。如果连它都会在“披露对了、基准错了”这里翻车,那么一个只用一个compareAtPrice字段撑着的独立站,风险是什么水平,不用我多说。
同一部条例为什么一边给你减负、一边给你加负?
德国价格标示条例里有两条挨得很近的规定,一条说打折时可以少标一个数,另一条说必须多标一个数。
指令要靠成员国转化成本国法才有牙齿。德国2022年重写的价格标示条例把第6a条落成了第11条,而在它前面两条的位置上还有一条第9条,两条挨得很近,方向却相反。
第11条:打折时必须多标一个数
德国价格标示条例第11条标题是“商品降价时的附加价格标示义务”,第1款说:负有标示总价义务的人,在向消费者公布任何商品降价时,必须标明其在降价适用前最后三十天内对消费者适用过的最低总价。
这是第6a条第1款和第2款的德文版本,措辞更紧一点。关键动词是angewendet,适用过。它没有说“通常售价”,也没有说“成交价”,只说你对消费者适用过的价格。促销价适用过,闪购价适用过,改错了又改回来的那个价也适用过。三十天窗口里所有这些值一起进入取最小值的集合。
第11条第2款给了一条唯一的缓和路径
第2款处理逐步加大降幅的情形:如果一次降价是分步的、中间不间断地持续加大,那么在整个降价期间,可以一直标示这一系列降价开始之前对消费者适用过的那个最低总价。
这句话是整条里唯一对运营有利的规则,值得记牢。它意味着一次五折起、逐周加码到三折的清仓活动,全程可以用同一个前价,不必每加一档就把前价换成上一档的促销价。代价是这个降价序列必须不间断且单向加大——中间涨回去一次,或者插进来一次不相干的活动,这个豁免就断了。
做清仓、季末处理、库存周转的团队应该按这条来设计活动结构。海外仓的滞销品处理本来就常常是阶梯降价,把它配成一个连续的序列而不是几次独立促销,在合规上完全不是一回事。
第11条第4款:两类不受约束的降价
第4款排除两种情形。第一种是个性化降价;第二种是易腐或保质期短的商品因临近变质或过期而降价,且已用适当方式向消费者标明这一点。
第一种排除的分量很重,值得单独说。个性化降价指的是只对特定个人生效的价格:生日券、召回流失用户的专属码、按行为触发的挽留优惠。它们不受三十天最低价约束,因为它们从来不是一次面向公众的降价公告。
但个性化这条豁免,不是一把万能钥匙
用它之前得先确认这个优惠真的是个性化的。判据不是你在后台把它建成了券,而是它是否只对被选定的个人生效。一张挂在首页、任何人点一下就能领的券,实质上就是一次面向公众的降价公告,换个技术形态不改变它的性质。同理,一个在结账页对所有人自动生效的折扣码,也不是个性化。
另一条边界来自渠道侧。Google明确要求不要把需要加入忠诚计划才能享受的会员价提交为促销价,而应使用专门的忠诚计划属性。也就是说,如果你把会员价当成普通折扣往数据源里塞,落地页和数据源就会对不上,这是另一类麻烦。做推荐计划这类双边激励时也一样,谁能拿到、怎么触发,决定了它算不算公开降价。
第9条第2款那条豁免,是写给多规格产品线的
第2款处理的场景在日化和食品站上很常见:同一条产品线有250毫升、500毫升、1升三个规格,三者的每升价格设计成一样的。这时候如果你按统一金额或统一百分比给整条线降价,三个规格的每升价格仍然彼此相等,重算一遍不会给消费者带来任何新信息,条例干脆免了这道手续。
值得注意的是这条豁免的前提有两个:降价必须是统一金额或统一百分比,而且降价前各规格的基本价格必须本来就相同。只要你给大包装多让了两个点——这恰恰是最常见的促销设计——前提就不成立了,豁免随之失效。把这条写进促销配置的校验逻辑里,比事后靠人记住可靠得多。折扣规则与防薅设计里那套先定边界再配规则的顺序,在这里同样适用。
由此长出一条真正可操作的策略
把前面几节的结论合起来看,会得到一个不太直观但很实用的推论:当参照价被锁死,折扣力度的天花板也跟着被锁死了;想突破这个天花板,唯一在条文上站得住的方向是把优惠从公开的降价改成别的形态。
| 优惠形态 | 是不是降价公告 | 受三十天最低价约束吗 | 力度天花板由谁决定 |
|---|---|---|---|
| 全站或单品公开降价 | 是 | 是 | 你过去三十天的最低价 |
| 个性化券码、专属优惠 | 否 | 否 | 你的毛利 |
| 会员价 | 通常否 | 否 | 会员体系的设计 |
| 加量不加价、赠品、套装 | 否 | 否 | 供应链 |
| 满额免运费、免费退换 | 否 | 否 | 履约成本 |
| 先涨价再打折 | 是 | 是,且这么做没有任何用 | 被条文直接抵消 |
最后一行值得多说一句。在三十天最低价的规则下,先涨后降这个动作在数学上完全失效——你临时抬高的那个价格不进最小值集合,最低价还是原来那个,抬价既不能提高可标示的前价,又留下了一条明确的价格变更记录。这条老手法被这条规则精确地废掉了,这也是我认为定量规则比定性规则好用的原因之一:它不靠威慑,它靠让作弊在算术上不生效。在大促与日常运营的差异里,这类被规则直接注销掉的老动作还有好几个,值得整批清理一次。
第9条:打折时可以少标一个数
现在看条例第9条,标题就叫“价格降低”。第1款说,在三种情形下不必标示新的总价或新的基本价格:个性化降价;按日历日限定期间、并通过广告或其他方式公布的一般性降价;以及易腐商品因临近变质而降价并已适当标明的情形。
第2款还有一条:对于标称重量、体积、长度或面积不同但基本价格相同的商品,如果总价按统一金额或统一百分比降低,不必标示新的基本价格。
同一部条例,一边减负一边加负
把第9条和第11条并排放,会看到一个很漂亮的分工。
基本价格就是前面提过的每千克、每升那个数。第9条说的是:促销期间,分母那条链可以歇一歇,你不用为一场为期五天的活动把全站的每升价格重算一遍。第11条说的是:与此同时,分子那条链要多干一件事,你必须把三十天最低价算出来并标上去。
一部条例,同一次修订,对同一场促销,一个环节松、一个环节紧。这不是立法者精神分裂,而是两条链的成本结构不同:单位价格是一个可以由售价现算的派生值,促销期间重算它对消费者没有增量信息;而前价是一个只能从历史里取的原始值,不标出来消费者就无从判断。松的是能算出来的,紧的是只能存下来的。
这条区别对系统设计的直接指导
如果你正在做促销引擎,这两条落到代码上是两件不同的事。单位价格模块在促销期间可以按未降价的价格继续显示,不必接进促销管线——少一个改动点,就少一个出错点。而前价模块必须接进促销管线,并且要在促销生效之前就完成计算,因为它的输入是历史数据,促销一旦生效,历史就多了一条记录。
顺序上有个容易踩的坑:先写价格再算前价,算出来的最小值里会混进这次促销自己的价格。这个错误在单次促销里表现为前价等于现价、降幅为零,很容易发现;但在批量任务里,如果价格写入和前价计算是两个异步作业,谁先跑完就不一定了。目录价格规则和购物车价格规则分层的电商系统里尤其要注意,因为规则生效时点和价格快照时点常常不在同一个环节。
同一个字段在六十年里为什么被改得越来越不敢说话?
从厂商建议零售价到划线价,词表放弃的不是一个属性名,是对这个数字来源的最后一点声称。
法律那一侧看完了,现在看渠道这一侧。你的商品数据要提交给购物渠道,页面上的价格也要用结构化数据标记出来,这两处各自对“原价”下了定义,而它们和法律给的定义都不一样。
数据源里那个price字段,定义是“不打折时的价格”
Google商家中心的规则是:商品在促销时,用促销价属性提交新价格,同时继续用价格属性提交商品的完整价格,也就是它不在促销时的价格。文档里还有一条容易被忽略的补充:如果商品在促销但你没有提交促销价属性,那就应该把促销价直接填进价格属性。
请注意这个定义的类型。“不在促销时的价格”是一个类型化的概念——它假设每个商品都存在一个常规状态和一个促销状态,而常规状态下有一个稳定的价格。它不是过去三十天的最小值,也不是最近一次的售价,它是一个关于商品应然状态的判断。
对一个常年在打折的品类,这个假设不成立
美妆、服饰、家居这类品类,一年里不打折的日子屈指可数。这时候“不打折时的价格”是一个虚构的状态——它在日历上从来没有真正出现过。你往数据源里填的那个价格,实质上是一个设计出来的锚点,而不是一个观测到的事实。
而欧盟要的那个数是观测出来的:三十天窗口里实际生效过的最小值。在一个促销密集的站上,这两个数几乎必然不相等,而且方向固定——设计出来的锚点总是更高。于是同一个商品,数据源里写着59欧元,页面上按法律必须标39欧元,两个数都是按各自的规则算对的。
渠道还要求这两处保持一致
麻烦在于Google同时要求:提交的值必须与你在落地页和结账时展示的促销价一致;落地页上必须清楚展示非促销价和促销价这两个价格,而结账时只展示促销价;如果你宣传优惠码,还要确保所有用户都能用到它,并清楚展示应用优惠码后的价格。
把这几条和上一节的结论合起来:渠道要求数据源与页面一致,法律要求页面上那个较高的数必须等于三十天最低价,于是数据源里那个“不打折时的价格”也被间接拉着往下走。这条约束链没有写在任何一份文档里,它是两套规则相交出来的。类似的相交在商品结构化数据新增分类属性那次也出现过:页面标记与数据源各自都合规,对不上的是两者之间。
还有一条经常被忽视的展示要求
Google文档里明确写着,促销价不必是落地页上最醒目的那个价格,举的例子就是原价的字号可以更大。这一条很有意思,因为它跟可用性研究的建议正好岔开——那边说折后价要更大更醒目,才不会让用户看错自己要付多少钱。
两边并不矛盾,只是各管一段:渠道管的是数据能不能对上,研究管的是人看不看得懂,法律管的是那个较高的数从哪儿来。三套要求各自只覆盖一个维度,没有任何一套是完整的,而把它们缝起来的那个人是你。
结构化数据这一层,词表刚刚改了名字
再往下一层是页面上的标记。Google的商品信息结构化数据文档把价格分成三类:当前生效价、划线价、会员价。当前生效价既没有priceType也没有validForMemberTier;划线价把priceType设成StrikethroughPrice;会员价用validForMemberTier标记,两个属性不能同时用,同时出现的价格规范会被忽略。
关键在划线价那一行的括号里:ListPrice在过渡期内仍然被允许。也就是说,这个属性原来叫ListPrice,现在改叫StrikethroughPrice。
促销的起止时间同样是有字段的
数据源里有促销生效日期属性,用来标明促销价在哪个区间内有效,不提交的话促销价会立即生效;页面标记里也有对应的有效期写法。这两处填的日期,就是你对外声明的促销窗口。
把这一点和英国那条禁止虚假限时的规定放在一起,会得到一个不太舒服的推论:一次次把结束日期往后顺延的促销,会在你自己的数据里留下一串完整的修改记录。倒计时归零后又刷新一次,页面上看不出痕迹,数据源的历史版本里看得清清楚楚。这类字段的性质就是这样——它既是给渠道看的,也是将来别人拿来对照你说过什么的凭据。想确认自己页面上到底提交了哪些价格字段,用结构化数据审计工具扫一遍最快。
这次改名,是一次悄悄的撤退
ListPrice的中文对应词是目录价或者厂商建议零售价。这是一个关于商品在市场上的正常价位的断言,跟第233.3节管的是同一件事。而StrikethroughPrice的意思是“被画了一条横线的那个价格”。
把这两个名字并排看一眼:前一个描述这个数字从哪儿来,后一个描述这个数字在屏幕上长什么样。词表没有收紧定义,也没有加校验,它做的是放弃对来源的声称——不再说这是市场价,只说这是被划掉的那个数。文档里给它的说明是“促销期间,商品通常提供的那个较高的常规价”,措辞比ListPrice松得多。
把三个定义按时间排开,会看到一条退让的曲线
| 年份 | 出处 | 它管这个数字叫什么 | 它要求你证明什么 |
|---|---|---|---|
| 1967 | 联邦贸易委员会指南 | 前价、建议零售价 | 你曾善意地按这个价对外提供过 |
| 2019 | 欧盟现代化指令 | 前价 | 它等于你过去三十天的最低价 |
| 2024 | Google结构化数据词表 | 划线价 | 什么都不用证明,只要它被画了条线 |
这条曲线不是在说后来的规则更宽松——欧盟那条其实最硬。它说的是每一次重新定义,都在减少这个数字所声称的内容:从“市场上的正常价”,退到“我自己的历史最低价”,再退到“页面上的一个视觉样式”。
为什么词表会做这种撤退
我的理解是,词表面对的是全网数以亿计的商品,它没有能力验证任何一个ListPrice是否真的是市场价。一个无法被验证的语义,写在词表里就是一句空话,不如干脆换成一个可以被验证的形式描述——这个数被划了线,这件事引擎自己看得见。
这个取舍本身是理性的,但它把责任原封不动地推回给了你。词表不再声称这个数是什么,不等于这个数就不用是什么;它只是不再替你背书。你在页面上写下那个数字的那一刻,做出承诺的仍然是你,而现在连词表都不站在你这边了。做结构化数据能不能帮上AI搜索这类判断时,这条经验同样适用:标记只负责表达,不负责担保。标记本身写没写对是另一回事,那部分交给语法校验就行,而值对不对,永远只能由你自己保证。
那四个展示上的坑,搬到多币种站上还剩几个?
源头那篇文章的四条建议我基本都认,但其中一条一过海关就会失效,失效的原因藏在单位量纲里。
回到展示层。前面几节把参照价这件事说透了,接下来把源头研究给的四条建议逐条过一遍,看看哪几条在跨境语境下还成立、哪几条要改。
第一条:价格别淹在页面里,这条完全成立
研究里那些观察很实在——受试者在商品页上反复滚动找价格,最后在标题下面找到时已经开始迁怒整个站;有人干脆说“价格在哪儿?我现在很烦……我不喜欢这个网站”。Baymard给的数据是18%的桌面站和11%的移动站让用户找价格找得费劲。
这条建议不需要任何本地化改造,照做即可:字号接近标题级、用颜色或背景块区分、别和促销角标、评分星级、库存提示挤在一起争注意力。有一条容易被忽略的补充:价格本身文字量极少,小字号下比长文案更容易被眼睛跳过,所以它对字号的敏感度高于页面上任何其他元素。把购买区当成一个整体来设计会更省事,产品详情页的模块化结构里那套按信任阶梯排模块的思路可以直接借来用。
第二条:折扣信息别离价格太远,这条也成立
研究观察到,特价说明放在图片画廊附近时,有受试者搞不清它指的是全站活动还是这个商品;14%的桌面站把促销信息放在离价格很远的位置。有个受试者的做法很典型:她把商品加进购物车,就为了看看折扣到底有没有生效。
把促销文案、活动角标、优惠条件全部聚拢到购买区,这条我完全同意。跨境场景下还要多加一条:把折扣说明和运费、税费提示分开摆——它们看起来都是“价格旁边的小字”,但一个在说你少付多少,一个在说你还要多付多少,混在一起会让人算不清最终要花多少钱。这跟结账放弃率那篇里讲的意外费用是同一类问题的两端。
第三条:同一个优惠别写好几遍,这条要加一层
研究里有个受试者被绕住了:“写着省10%,但不清楚是不是已经算进价格里了,因为已经有20美元的优惠了,所以我不知道是不是还能再省10%。”另一个受试者更直接,说这看起来像虚假广告。在展示促销的站里,有19%存在这个毛病。
建议本身没问题:一个优惠原则上只写一次;确实需要写两次(比如页面很长,顶部和底部各一处),措辞要几乎完全一致,让人一眼看出是同一件事而不是两个可叠加的优惠。
可这个毛病的根源不在文案,在系统
同一个促销之所以会在页面上长出三种说法,通常是因为它在三个地方被各写了一遍:全站横幅由市场同学在内容管理后台写,商品页角标由促销引擎按规则生成,购物车提示由结账模板另写一套。三处的数据来源不同、更新时机不同、负责人也不同。
所以真正的解法不是让文案同学注意措辞,而是让这三处从同一个促销对象取值。一个促销在系统里应该只有一个身份,页面上出现几次是渲染问题,说法不一致则是数据问题。做不到彻底统一时,退一步的办法是给每个促销定一个规范名称字段,所有展示位只允许引用这个字段,不许各自造句。这和产品文案摆脱供应商模板要解决的是相反方向的问题:那边要的是别处没有的表达,这边要的是各处一致的表达。
第四条:百分比还是绝对金额,这条一出海就失效
研究引了沃顿商学院Jonah Berger的“百元法则”:哪个数字看起来更大就用哪个。20美元的东西降到15美元,写“省25%”比写“省5美元”有力;1000美元的东西降到900美元,写“省100美元”比写“省10%”有力。分界线大致在100美元。
这条在单一市场里很好用。可一旦你的站开了多个货币,这个100就出问题了——它是一个有量纲的数,而不同货币的量纲差着好几个数量级。100美元、100欧元、100英镑还算接近,100人民币不到15美元,100日元还不到1美元。同一个阈值套过去,等于在不同市场用了完全不同的心理分界。
正确的做法是把法则本身实现出来,而不是把阈值抄过来
百元法则的实质其实只有一句话:把百分比和绝对金额都算出来,哪个数字大就展示哪个。100这个数字只是这条规则在美元语境下的一个近似解——当售价高于100美元时,绝对金额的数值必然大于百分比的数值。
所以直接比数值就行,一行判断的事,还免去了维护一张按货币配置的阈值表。这个思路和处理多市场价格格式化时的原则一致:别把某个市场的经验值硬编码进逻辑,把产生这个经验值的规则实现出来。想验证换了写法之后到底有没有效果,记得先按样本量公式算清楚要跑多久,促销期间的流量波动很容易制造出一个漂亮的假胜利。
这四条在移动端上,优先级要重排
研究给的桌面端和移动端数据本身就不一样:找不到价格这个毛病,桌面站是18%,移动站是11%。移动端反而好一点,因为一屏能塞的元素少,价格更难被别的东西挤走。真正在移动端变严重的是另外两条。
| 四个坑 | 桌面端的典型表现 | 移动端的典型表现 | 移动端优先级 |
|---|---|---|---|
| 价格不显眼 | 被周边元素稀释 | 相对少见,一屏元素本来就少 | 中 |
| 折扣离价格远 | 散在画廊旁或页面下方 | 更严重,纵向滚动会把两者拉开好几屏 | 高 |
| 同一优惠写多遍 | 横幅与购买区并存 | 更严重,吸顶条与购买区同时出现,用户以为能叠加 | 高 |
| 没突出降幅 | 少一个说服点 | 同左,但空间紧张时容易被第一个砍掉 | 中 |
第二行和第三行值得展开一句。移动端的纵向滚动会把桌面端上并排的两个元素变成一前一后,中间还隔着几屏内容,而促销文案通常是最先被响应式布局挤到下面去的那一块。第三行则是移动端特有的叠加错觉来源:吸顶的活动条和购买区里的角标同屏出现,两处措辞稍有差别,用户就会开始盘算是不是能叠。
还有一个研究没测到、却最容易掉量的坑
促销生效那一刻,页面变了,数据源还没变;或者数据源先更新了,页面缓存还没刷。渠道抓到的价格和用户点进来看到的价格对不上,轻则商品被暂停展示,重则整个账户的商品被批量审核。这个坑不影响用户体验,它影响的是流量本身,而且往往在促销开始后的头几个小时发作——正好是流量最贵的那几个小时。
解法是把促销生效做成一次协调过的动作:先刷价格,再刷页面缓存,最后推送数据源更新,中间留出足够的间隔。宁可让渠道晚半小时看到促销价,也别让它先看到促销价再点进一个还是原价的页面。顺序反了,代价是可见性;顺序对了,代价只是半小时。商品下架、缺货、改价这几类动作的时序问题是同一族,处理原则可以参考缺货与下架商品的收尾判断。
还有一条研究没说、但跨境必须补的
两者都展示是研究给的最优解,我同意,但欧盟站要多算一步:百分比必须以三十天最低价为基准算,而多数系统里的百分比是拿日常价现算的。这就是前面那份判决的核心。如果你把两个数都显示出来,那么这两个数得来自同一个基准,否则会出现绝对金额和百分比对不上的滑稽场面,而这种对不上恰恰是最容易被截图取证的。
还有一条实操建议:百分比一律向下取整,绝对金额一律照实算。四舍五入把33.4%写成34%,在严格口径下就是一次夸大。这种事平时没人计较,进了争议程序就是一个现成的把柄。
价格历史该怎么存,才经得起“过去30天最低价是多少”这一问?
这一节讲工程:它不是一个字段,是一次查询;而多数站上,被查的那张表根本不存在。
前面所有结论都指向同一个前提:你手上得有一份可信的价格历史。这一节讲怎么建它,以及为什么多数站上它不存在。
先破一个最常见的误解
“三十天最低价”不是一个可以存在商品表里的字段。它是一个查询的结果,输入是一段时间内的全部价格记录,输出随时间不断变化——今天算出来是39欧元,明天同一个商品同一段代码算出来可能就是49欧元,因为窗口往前滚了一天,最早那次促销掉出了区间。
把它做成字段的团队通常会在两个地方翻车:一是忘了定期重算,字段值停在了某次促销的那天;二是重算时机不对,在促销价写入之后才算,把这次促销自己算了进去。正确的做法是把它当作一个由价格事件表派生的视图,需要的时候查,或者在促销排期时预先算好并冻结成本次活动的参数。
那张表该记什么
价格事件表的每一行是一次价格变更,字段至少要覆盖这几项:商品标识(到最小可售单元,不是到款)、市场或国家、货币、价格数值、是否含税、生效开始时刻与结束时刻、变更来源(人工、促销规则、批量导入、接口回写)、操作者。
其中最容易漏的是含税标志和生效时刻。含税与否漏了,德国站按含税价、美国站按不含税价,两个市场的历史根本不可比。生效时刻只记了写入时间而没记生效时间,那么所有定时促销的窗口边界全是错的——写入时刻和生效时刻在定时促销里天然不是同一个数,而条文关心的是后者。
为什么很多站真的没有这张表
因为主流建站系统默认不给。商品表里价格就是一个字段,改了就是改了,旧值直接被覆盖。有些系统有操作日志,但日志的设计目的是审计谁改了什么,不是给业务查询用的,往往没索引、没保留期保证、还可能被定期清理。这一点和站点地图里那个最后修改时间的诚实度是同一类问题:一个没人校验的时间戳,用久了就会变成装饰。
更普遍的情况是价格根本不在一处:基础价在商品表,促销价在活动表,会员价在客户分组,渠道价在数据源,落地页显示的那个数是这四层运算出来的结果,而这个结果本身没有任何地方记录过。这一点在分组定价与税务类别分层的系统里格外明显——每一层都对,合起来那个数没人存。
所以该记的是渲染出来的那个数
这是我认为最重要的一条设计决策。价格事件表要记的不是某一层的输入,而是消费者实际看到的那个最终价格。条文说的是“对消费者适用过的价格”,不是“商品表里的基础价”。
实现上最稳的做法是在价格计算的出口处埋一个点:每次某个商品在某个市场的最终展示价发生变化,就写一条记录。这样不管前面有多少层规则,记下来的都是那个唯一有法律意义的数。从输入侧记录,你永远要维护一套和渲染逻辑并行的重算逻辑,而两套逻辑迟早会分叉。
价格历史的六维治理,和售价对比一下
| 治理维度 | 当前售价 | 价格历史 |
|---|---|---|
| 谁负责 | 定价或运营,责任明确 | 通常没有人 |
| 改动是否要审批 | 多数站有流程 | 没有概念,因为没人认为它会被改 |
| 有没有变更日志 | 有 | 它本身就是日志,但常被当成可清理的数据 |
| 错了多久被发现 | 分钟级 | 可能永远不会,除非有人来告 |
| 谁会投诉 | 客服、财务、买家 | 竞争对手、消费者协会、比价网站 |
| 能不能回滚 | 能,旧值就在上一次记录里 | 删掉就没了,没有第二份副本 |
第四行和第六行是这张表的要害。一个错了不会有人告诉你、删了又找不回来的数据,在系统里的实际地位约等于不存在。而第五行提醒了另一件事:会来找你麻烦的那几方,恰好都不在你的用户反馈渠道里。
变体和多规格,是这张表最容易记错的地方
价格历史必须记到最小可售单元。同一款精华液的30毫升装和50毫升装是两条独立的历史,同一件外套的黑色M码和米色L码也是——尽管它们在页面上共用一个商品标题。这一点跟变体在收录上该合还是该拆是两回事:收录可以合并,价格历史必须拆开。这条界线在变体的标记与规范化治理里也画过一次,只不过那次分的是索引与展示,这次分的是展示与记录。
由此引出一个很少被讨论的陷阱:列表页上那句“39欧元起”,它的划线价该取哪个变体的历史?如果起价来自30毫升装,划线价就必须是30毫升装的三十天最低价,不能拿50毫升装那个更高的历史价来充数。安全的做法是列表页只显示起价、不显示划线价和百分比,把降幅表达全部留给商品页——在能确定是哪一个变体之前,任何降幅宣称都缺少一个明确的主语。
一个能报数的指标:折扣兑现率
合规议题最难推动的地方,是它没有数字,只有风险描述。所以我给这件事配了一个可以放进周报的指标:折扣兑现率=页面上宣称的降幅 ÷ 按三十天最低价算出的真实降幅。
取值等于1,说明宣称和事实一致;大于1,说明夸大了,比如页面写着立省40%,而按三十天最低价只降了20%,兑现率就是2。这个指标的好处有三个:它不需要读者懂任何一条法律条文;它可以按品类、按活动、按负责人拆开看;它能做时序监控,一场促销上线当天就能出数。
实际用起来还有一个副产品。兑现率长期接近1的产品线,说明它的日常价是真的在卖的;兑现率常年在2以上的产品线,通常意味着这条线的所谓日常价其实从来没有生效过,它的定价体系本身该重做了。换句话说,这个合规指标顺手体检了一遍定价的真实性。
保留期该定多长
三十天是条文口径,但保留三十天是不够的。理由有三个:一是第11条第2款那种阶梯降价需要回溯到序列开始之前;二是争议发生时对方引用的可能是几个月前的页面,你得能自证当时的口径;三是内部复盘和定价分析本来就需要更长的序列。
我的建议是至少留十三个月,这样任何一次年度大促都能和去年同期对上。存储成本几乎可以忽略——一个五千SKU、五个市场的站,一年的价格事件通常也就几十万行,比一天的埋点数据还小。
价格历史不是只有你在存
这是很多团队没意识到的一层。比价网站、价格监控工具、浏览器插件、竞争对手的抓取脚本,每天都在抓你的商品页并保存价格。你可以决定自己不存这份数据,但你决定不了别人存不存。
换句话说,价格历史在事实上是一份公开信息,而且很可能别人手里那份比你自己的更完整。把它当内部数据来处理,是这件事上最危险的心智模型——你在争议里能拿出的证据,未必比对方多。
先做诊断,别急着改代码
如果你现在要启动这件事,第一周不要碰任何渲染逻辑,先回答三个问题:这个站上有多少比例的商品在过去三十天里发生过价格变化;这些变化里有多少能从现有数据里还原出生效时刻;当前页面上的划线价和还原出来的三十天最低价,有多少个商品对不上。
第三个数字是整件事的体检指标。它通常比团队预期的高得多,而且高出来的部分几乎全是同一个方向——划线价偏高。拿着这三个数字去开会,比讲十条法律条文有用。这也是仪表盘全是绿灯生意却没动那篇里的老问题——一个议题没有指标,它在会上就永远排在最后一个。
促销日历一加密,一段一直正确的代码就开始违规
我自己的一次失手。代码没改、数据没错、规则没变,是排期节奏的变化让它从对的变成了错的。
这一节讲我自己经手的一次事故。它值得单独写,是因为它的形态跟常见的技术故障完全不同:没有任何一段代码出错,没有任何一条数据写错,没有任何一条规则被违反,而系统在某一天开始系统性地生产违规页面。
客户与背景
一个出海美妆护肤站,卖面部精华、防晒和一条彩妆线,主销德国、法国、英国,加上少量北欧订单。这个品类的特点是促销频率高:节日、换季、新品导入、联名,理由永远不缺,排期表的密度接近类目页那种常年在变的状态,只不过变的是价格不是商品。
他们找我的时候已经把三十天最低价这件事做完了,做得还挺好。价格事件表有,生效时刻记得准,促销页面上老老实实标着最近三十天最低价那一行字。第一年跑下来没出过任何问题。
那个看起来完全合理的决定
建表的时候团队讨论过一个问题:促销价要不要计入历史。当时的直觉理由很顺——促销价不是我们的常规价,把它算进最低价,等于让上一次促销把下一次促销的力度锁死。听起来像是在纠正一个不合理的副作用。
于是加了一个过滤器,函数名叫excludePromoPrices,作用是在计算三十天最低价时跳过来源标记为促销规则的那些记录。这个名字读起来毫无问题,代码评审时没有一个人停下来问它对不对,因为它看上去就是一个正常的业务过滤条件。
而它在条文层面是错的。第11条第1款和第6a条第2款说的都是“对消费者适用过的最低价”,德文用的是angewendet这个词,它不区分这个价格是常规价还是促销价。适用过就是适用过,条文里没有给任何一类价格开口子——除了第4款明确列出的个性化降价和易腐商品那两种。
它上线后有整整一年是无害的
这是这次事故最要命的地方。过滤器上线那年,这个站一年做六次促销,平均间隔六十天左右。任何两次促销之间都超过三十天,所以窗口里根本不会出现上一次促销的价格,过滤器每次运行都是空转——它从来没有真正排除过任何一条记录。
测试用例也是这样写的。测试数据构造的是一个正常的场景:日常价加一次促销,跑一遍,结果正确。没有人构造过“两次促销间隔二十六天”这样的数据,因为在当时的业务里这种情况不存在。
第二年,业务把它激活了
第二年促销效果好,营销团队把节奏加密了。加上联盟活动、达人专场、清库存、新品预热,一年做到了十四次,平均间隔缩到二十六天左右。
就在某一次促销排期通过的那一刻,那段代码从空转变成了每次都生效。同一段代码,一个字符没改;同一张表,一条记录没错;同一部条例,一个字没变。变的是营销日历的密度,而营销日历不归技术管,改日历也从来不会触发代码评审。
具体的偏差是这样的:主力精华液日常价59欧元,三月做过一次促销降到39欧元,四月又做一次也是39欧元。第二次促销时,正确的前价是39欧元、降幅为零;过滤器把三月那次排除掉之后,算出来的前价是59欧元,页面上写着立省34%。
为什么没人发现
三条原因,每一条都很普通。
第一,所有测试和验收都在看促销期间的页面对不对,没有一条在看促销结束之后历史表里留下了什么。验收的时间窗和错误的时间窗根本不重叠——错误是在第二次促销开始时才显形的,而那时上一轮验收早就关闭了。
第二,这个错误让折扣显得更大,所有业务信号都是正向的。加购率好看,转化率好看,联盟素材的点击率好看,连素人体验官那条线反馈回来的素材转化都在涨。凡是能证明这个决定做对了的数字,全都在往上走;能证伪它的人,不在这家公司里。
第三,也是我印象最深的一条:真正把问题捅出来的,既不是我们也不是客户,是一个价格监控网站的公开图表。德国一家律所代表同行发来的警告函里,附的就是那张图的截图——曲线上三月那段39欧元清清楚楚,而我们自己的计算逻辑当时正把它当作不存在。
那张图给我的教训比警告函本身更重
我们以为价格历史是内部数据,可以按自己的口径决定收录哪些、排除哪些。实际上它是一份公开数据,任何人每天抓一次页面就能拥有一份完整副本,而且那份副本不会替你执行任何过滤。
说白了,这个过滤器过滤掉的不是数据,只是我们自己看得见的那一份。对方手上那份从来没被过滤过。这件事之后我给自己立了条规矩:凡是外界能独立观测到的事实,内部就不能有一套跟它不一致的口径,哪怕那套口径在业务上说得通。
改了三处
第一,价格事件表改成只追加、不过滤,任何来源的价格变更都进表,是不是促销只作为一个标签存着,绝不作为排除条件参与最低价计算。需要区分促销与非促销的分析场景,在查询时自己加条件,别把这个判断固化进事实表。
第二,把三十天最低价的计算前移到促销排期环节。营销同学在排期系统里选好商品和日期,系统当场算出这次能标的前价,直接显示在排期界面上:这次能标的原价是39欧元,不是59欧元。看到这句话的人是决定要不要做这次促销的人,这比事后拦截有效得多。这跟把合规约束前移到弹窗设计阶段是同一种思路:在人做决定的那一屏给出约束,比在人做完决定之后来纠正省力得多。
第三,把促销日历的密度做成一个技术信号:排期系统里两次促销间隔小于三十天时自动标黄,并把上一次的最低价显示在旁边。既然这次事故的触发条件是业务节奏,那么监控就得盯着业务节奏,而不是盯着代码。
结果,以及一个意料之外的收获
改完之后,页面上宣称的名义折扣力度平均掉了一大截,因为很多次促销的前价从日常价降成了上一次的促销价。但实际转化几乎没掉。老客户早就摸清这个站每隔两三周就打一次折,页面上写40%还是15%,对他们没什么区别——他们等的是促销本身,不是那个百分比。
真正掉的是新客那一侧的点击率,尤其是联盟和比价渠道来的流量。修复方式不是把百分比想办法做大,而是把促销的形态换掉:从降价改成加量、赠品、套装和限定组合。这几类不构成降价公告,不受三十天最低价约束,力度天花板重新由供应链决定而不是由价格历史决定。三个季度之后,新客转化回到基线以上,而且客单价比原来做纯折扣时更高。
这次的经验和我在上一次那个分母事故里学到的正好互补:那次是两个各自合理的默认值撞出了系统性偏差,这次是一个一直正确的默认值被业务节奏推到了失效区。两次的共同点是,出问题的地方都没有报警,因为没有任何一个系统认为自己该为那个数字负责。
这件事从哪一步开始做,才不会变成每次大促前的救火?
四周路径、十八项上线自查、三条该让你停下来的反信号,外加一段该写进帮助中心的公共答案。
把前面的结论收成可执行的东西。这一节给四周路径、上线自查、反信号,以及一段应该写在帮助中心而不是商品页上的公共答案。
第一周:只出三张清单,一行代码不改
第一张是覆盖清单:过去九十天里,有多少个最小可售单元发生过价格变化,这些变化能不能还原出准确的生效时刻。第二张是偏差清单:当前所有在售商品里,页面划线价与还原出的三十天最低价不一致的有多少,按品类和市场拆开。第三张是表达清单:把站上所有会出现降幅表述的位置列出来——商品页、列表页角标、全站横幅、购物车、邮件、数据源、广告素材。
第三张清单通常是最让人意外的那一张,它的行数往往是团队预期的两三倍。先知道有多少处要接同一个数,再谈怎么接。清点的时候别漏掉邮件那一路,邮件营销那条链路上的促销文案通常由另一套模板生成,和站上的促销对象完全脱钩。
第二周:先修数据,别碰展示
把价格事件表建起来或者补起来,埋点埋在价格计算的出口处,记渲染出来的最终价。同时把历史数据尽可能还原——订单表里的实付价、快照、缓存日志、渠道数据源的历史版本,都是可以拿来回填的材料。
这一周的验收标准只有一条:随便挑十个商品,能不能准确回答它们在过去三十天里对消费者适用过的最低价是多少。答不上来,就别往下走。这一步没有捷径,跟商品编码这类基础字段一样,前面偷的懒后面都要还。
第三周:把计算前移到排期环节
在促销排期系统里加一个字段,选定商品和生效日期后自动算出本次可用的前价,并显示在营销同学做决策的那个界面上。这一步是整件事投入产出比最高的一处,因为它把合规从事后检查变成了事前信息。
同时加两条硬校验:本次促销价必须低于算出的前价,否则不许提交;两次促销间隔小于三十天时标黄提示。
第四周:统一表达层
把第一周第三张清单上的所有位置,逐个改成从同一个促销对象取值。改不动的先做兜底——不显示百分比,只显示两个价格;实在改不动的,暂时把降幅表述撤掉。撤掉一个降幅表述损失的是一点转化,留着一个算错的降幅表述损失的是别的东西。
上线前的十八项自查
前八项管数据,中间六项管页面,最后四项管流程。哪一项过不了,就别让促销上线。
- 每个在售最小可售单元都能查到过去三十天的完整价格序列。
- 序列记的是最终展示价,不是商品表里的基础价。
- 含税标志与市场标识齐全,跨市场的历史不会被混在一起比较。
- 生效时刻与写入时刻分别记录,定时促销的边界取前者。
- 三十天窗口的起点取新价对消费者生效的时刻,不是排期通过日。
- 窗口长度与例外规则按市场配置,不硬编码。
- 促销价、闪购价、误改后回滚的价,全部计入最小值计算。
- 个性化券码与会员价不计入,且判据是仅对被选定的个人生效。
- 页面上被划掉的那个数,等于算出来的前价。
- 百分比与绝对金额都以同一个前价为基准,两者对得上。
- 百分比一律向下取整,不做四舍五入。
- 列表页不显示无法归属到具体变体的降幅表述。
- 结构化数据里的划线价用正确的价格类型标注,不与会员价属性混用。
- 数据源里的价格与页面一致,促销生效顺序是先价格、再缓存、后数据源。
- 阶梯降价按连续不间断的序列配置,中途不插入独立活动。
- 站上所有降幅表述从同一个促销对象取值,没有一处是各自造句的。
- 促销结束时间不做无声顺延,需要延期就重新走一次排期。
- 价格事件表只追加不删改,保留期不少于十三个月。
三条该让你停下来的反信号
第一条:某条产品线的折扣兑现率长期高于2。这说明它的日常价基本没生效过,第一反应不该是调整文案,而是重新审视这条线的定价。
第二条:促销排期表上,两次活动的间隔在缩短,而页面上的名义折扣力度没有跟着缩小。这两个数按算术必然反向变动,如果没有,说明某个地方正在替你把上一次促销从历史里抹掉。
第三条:营销侧提出希望把某类价格排除出历史计算。这个诉求本身完全合理,但它指向的是同一个陷阱。正确的应对不是拒绝,而是把它翻译成促销形态的调整——想要更大的力度,就换一种不构成降价公告的给法。
三种投入档位,按团队规模挑一个
不是所有站都需要把上面十八项全做完。按站的规模和促销频率,这件事有三档合理的投入。
| 档位 | 适合谁 | 做到哪一步 | 最大的残余风险 |
|---|---|---|---|
| 最小可用 | 单市场、一年促销少于六次 | 建价格事件表,划线价人工核对 | 促销加密时无人察觉 |
| 标准 | 多市场、促销按月排期 | 加排期环节的自动计算与硬校验 | 表达层仍有几处各自造句 |
| 完整 | 促销密集、有联盟与比价渠道 | 表达层统一取值,兑现率进周报 | 主要在跨渠道时序一致性上 |
三档之间有一道明确的门槛:从最小可用跨到标准,第一次真正要改的不是页面,是促销排期的工作流——你得让营销同学在决定做不做这次活动的那一刻就看到可用的前价。这一步跨过去,后面全是收尾工作;跨不过去,做多少页面上的修补都会被下一次排期推翻。
该写进帮助中心的那段公共答案
商品页上那行小字只够写口径本身,写不下解释。而买家、比价网站、AI助手真正会去检索的是解释。所以建议在帮助中心单独写一页,回答四个问题:我们标的原价是怎么算出来的;为什么同一件商品这次的原价比上次低;会员价和促销价能不能叠加;不同国家站上的原价为什么不一样。
这一页的价值有两层。对买家,它把一个容易引起怀疑的数字变成了一个有出处的数字。对要被AI引用的内容来说,它是这个站上少数几个只有商家自己能回答的问题——别人可以写一万篇讲三十天最低价规则的科普,但只有你能说清楚你自己是怎么算的。这种唯一性,比任何一篇通用指南都更容易被引用,答案引擎优化里讲的可引用性,本质上就是这种别人替代不了的具体。这一页最好配上规范的问答标记,让它更容易被整段取用。
最后回到那个被划掉的数字
整篇文章绕了一圈,结论其实很短:你可以自由决定卖多少钱,但你不能自由决定自己以前卖过多少钱。前者是经营,后者是事实。
而做直连消费者品牌的人,因为砍掉了中间商,也就砍掉了所有外部的参照系,只剩下自己的过去可以引用。你的价格历史就是你唯一的证据,而这份证据的完整性,取决于一件很不起眼的事——你有没有认真地把它存下来。
常见问题解答
划线价一定要等于三十天最低价吗,标日常价不行吗?
在欧盟范围内,只要你在页面上公布了一次降价,就必须标明降价适用前不短于三十天期间内适用过的最低价,这是价格标示指令第6a条第1款和第2款的直接要求。标日常价而不标这个最低价,等于没有履行披露义务。
更关键的是欧盟法院在C-330/23里给出的解释:以百分比形式宣布的降价,以及以突出优惠性的促销表述宣布的降价,都必须以第6a条第2款意义上的前价为基准来确定。换句话说,即使你把三十天最低价另外标了出来,只要那个百分比是拿日常价算的,仍然不合规。
新品刚上架不满三十天,怎么打折?
指令第6a条第4款允许成员国对上市不足三十天的商品规定较短的期间,所以具体做法要看目标市场的本国规则,不能一刀切。
工程上最稳的处理是给价格历史加一个数据充分性判断:商品上架时长不足配置的窗口长度时,不允许在页面上出现任何降幅表述,只显示当前价格。新品本来就不该靠划线价卖,它的说服力应该来自别的地方。这条规则还顺手挡住了一类常见操作——先高开挂两周再降价,那个高开价在窗口内会被完整记录,抬不上去。
会员价和优惠券能绕开这条规则吗?
能,但判据比多数人以为的严。德国价格标示条例第11条第4款和指令的相关规定都把个性化降价排除在外,前提是这个优惠只对被选定的个人生效。生日券、流失召回码、按个体行为触发的挽留优惠,属于这一类。
不属于这一类的包括:挂在首页人人可领的券、结账时对所有人自动生效的折扣码、注册即得的新客券。它们在技术上是券,在性质上是一次面向公众的降价公告。另外,Google明确要求需要加入忠诚计划才能享受的会员价不要提交为促销价,而应使用专门的忠诚计划属性,这一层也要一并对上。
大促期间促销一场接一场,前价是不是会越标越低?
会,而且这是规则设计出来的效果,不是副作用。两次促销间隔小于三十天时,第二次的前价就是第一次的促销价,名义降幅自然缩小。促销排得越密,可标的降幅越小。
唯一的缓和路径是德国价格标示条例第11条第2款那条:一次分步进行、中间不间断且降幅持续加大的降价,整个期间可以一直用序列开始之前的那个最低价当前价。所以清仓和季末处理应该配成一个连续的阶梯序列,而不是几场彼此独立的活动——同样的降价节奏,配置方式不同,可标的降幅完全不同。中途涨回去一次,或者插进来一场不相干的活动,这个豁免就断了。
美国站和欧盟站能用同一套划线价逻辑吗?
可以用同一套,而且建议用同一套,但方向要选对:按欧盟口径统一,而不是按美国口径统一。
理由是两套规则的判据类型不同。美国那份1967年的《反欺骗性定价指南》要求前价是实际的、善意的、在合理相当的一段时间内公开提供过的价格,这是一个关于意图和商业惯例的判断,没有数字门槛,发布前你无法自证合规。而欧盟那个三十天最低价是可以算出来的。用三十天最低价当划线价,在欧盟是硬性要求,在美国则天然满足“实际提供过”这一条,因为它本来就是你实际适用过的价格。一套逻辑覆盖两个市场,还少维护一套分支。
完全没有历史数据,从零开始要多久才能正常打折?
如果你今天开始记录,理论上三十天后就有了完整的窗口数据。但实际上可以更快:订单表里的实付价、渠道数据源的历史版本、页面缓存日志、比价网站的公开曲线,都可以拿来回填。多数站能还原出六十到九十天的可用序列,足够立刻恢复正常的折扣表达。
回填的时候有一条要守住:只回填能确定生效时刻的记录,拿不准的宁可留空,也别用推测值把序列补成看起来完整的样子。一个有缺口但每条都可信的序列,比一个完整但掺了估算的序列有用得多——前者你知道哪里不能依赖,后者你不知道。
在数据补齐之前的过渡期,最稳妥的做法是暂时撤掉所有降幅表述,只显示当前价格。这会损失一点转化,但比在数据不可靠的情况下继续标百分比划算得多——前者是可以量化的短期损失,后者是无法量化的长期敞口。
干脆不显示划线价、只标现价,是不是最安全?
确实最安全,但要注意一个容易忽略的边界:不显示划线价,不等于没有做出降价公告。页面上如果还留着“限时特惠”“本季最划算”这类突出优惠性的表述,按C-330/23的口径它们同样构成降价公告,同样要以三十天最低价为基准。真要走这条路,得把这类文案一并清理掉。
另外,全面撤掉折扣表达也有代价。可用性研究里那些观察是真实的:价格与折扣信息不清晰会直接导致用户放弃这个商品。更实际的路径不是不打折,而是把折扣的形态换掉——加量、赠品、套装、限定组合、免运费,这些都不构成降价公告,力度天花板由供应链和履约成本决定,而不是由你三十天前的那次促销决定。
权威参考资料
本文标题:《商品页上被划掉的那个原价,只有你自己的价格历史能证明它存在过》
本文链接:https://zhangwenbao.com/strikethrough-price-prior-price-dtc-discount-display.html
版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0
← 上一篇
慢查询日志攒了783MB,而真正超过1秒的只有32条下一篇 →
没有了