等级何以成为资产
——有群农场 Phase 38 等级权益体系开发纪实与思考
关键词:等级权益 | 私域电商 | 会员体系 | 一人一店 | 信任量化
阅读时间:约15分钟
引子:一个被浪费的等级
2026年6月23日,有群农场消费者小王打开「我的」页面,看到自己的会员等级——V3黄金会员。这个等级是怎么来的?她在平台累计消费超过2000元。这个等级能做什么?什么也不能做。
V3只是一个标签,一行文字,没有任何实际权益。
这不是小王一个人的困惑。在等级权益上线之前,有群农场1-5级会员体系已经运行了近两周,但等级的唯一作用是展示。V1和V5的消费者在购物体验上没有区别——同样的价格,同样的服务,同样的积分倍率。
“一个没有权益的等级,就像一枚没有购买力的货币。它存在,但毫无价值。”
这是等级体系最尴尬的处境——花了大量精力设计等级、计算等级、展示等级,却忘了回答最根本的问题:等级凭什么让消费者在乎?
一、等级的“双重身份”:是人的勋章,还是店的工具?
1.1 一个被修正的关键BUG
Phase 38开发中最关键的一个BUG,不是代码错误,而是设计假设的错误。
最初的 _calculate_level_discount 方法中,查询消费者等级时加了一个条件:
这意味着:消费者在团长店铺下单时,取的是她在这个团长名下的等级;在农夫店铺下单时,取的是她在这个农夫名下的等级。同一个人,在不同店铺,等级可能不同。
这看起来合理——团长和农夫各自经营私域,消费者的消费数据也是分开的,等级自然应该分开。但这个逻辑有一个致命缺陷:它违背了等级的本质。
等级是对“人”的评价,不是对“人与店铺关系”的评价。小王之所以是V3,是因为她在整个有群农场平台累计消费超过2000元,而不是因为她在某个特定店铺消费了多少。等级属于消费者个人,不属于任何店铺。
修正后的代码去掉了 owner_id 限制,取全平台最高等级:
这个修正确立了等级权益体系的第一原则:等级是人的属性,不是店铺的属性。
1.2 为什么平台电商必须统一,而私域电商不必?
淘宝的88VIP、京东的PLUS会员,都是平台统一制定规则,所有商家必须遵守。因为有群农场的模式与它们有本质区别。
| 维度 | 平台电商(淘宝/京东) | 私域电商(有群农场) |
|---|---|---|
| 消费者行为 | 搜索比价,逛多家店 | 通过团长/农夫链接进入,常去固定店铺 |
| 跨店铺体验 | 频繁,权益必须一致 | 极少,不需要跨店铺一致性 |
| 等级权益成本 | 平台承担或商家分摊 | 卖家自行承担 |
| 卖家自主权 | 低,必须参与 | 高,可选择参与或不参与 |
私域电商不需要跨店铺体验一致性。消费者小王每次打开有群农场,进入的都是团长小羔的店铺。她不知道其他店铺有没有等级权益,也不需要知道。她只需要在她常去的那个店,感受到“我的等级有用”。
这一认知避免了过度设计。有群农场的等级权益不需要复杂的跨店铺同步机制,卖家只需要一个开关:参与,或不参与。
“企业的目的是创造顾客。”——彼得·德鲁克
在信任电商时代,企业的目的是理解关系。等级是对“人”的评价,不是对“人与店铺关系”的评价。
二、一人一店:一个开关背后的设计哲学
2.1 混合型卖家的“一个开关”
有群农场有一个特殊角色——混合型卖家。用户8007既是农夫又是团长,但只有一个店铺。这是“一人一店”原则的死命令。
等级权益的开发中,混合型卖家带来了一个有趣的问题:农夫工作台和团长工作台各有一个等级权益开关,它们是同一个开关还是两个独立的开关?
如果是两个独立的开关,会出现什么情况?农夫工作台开启权益,团长工作台关闭权益。消费者在同一个店铺里,有时候享受折扣,有时候不享受。这会让人困惑——同一个店铺,同一个消费者,为什么权益时有时无?
答案只能是:一个店铺只有一个开关。两个工作台共享同一份数据(shops.level_config),农夫开启等于团长开启,团长关闭等于农夫关闭。
这个设计在代码层面天然成立——两个工作台读写的都是同一行数据库记录,不需要额外的同步逻辑。但在认知层面,它确立了一个重要原则:店铺是资产的最小单位,工作台只是视角的切换。
2.2 “可上浮不可下浮”的治理逻辑
确定了卖家可以自由选择参与或不参与之后,第二个问题随之而来:参与的卖家能否修改权益内容?
答案是可以,但有限制:可上浮,不可下浮。
平台设定最低权益标准——V3享9.5折。团长如果愿意,可以上调到9折甚至8.5折,给消费者更多优惠。但不能下调到9.8折,因为那会让消费者觉得“这个团长在克扣我的等级权益”。
这个设计借鉴了劳动法中的“最低工资标准”——平台定底线,企业可上浮。它同时保护了两方:消费者不会因为某个卖家而体验受损,卖家也不会因为强制统一而利润受损。
三、等级权益不是成本,是投资
3.1 一个简单的算账
Phase 38上线后,有群农场的V3消费者在参与店铺下单,可以享受9.5折。以19.9元的订单为例,折扣金额约1元。
1元钱,卖家会觉得这是成本还是投资?
如果是成本,卖家会想:“我少赚了1元。”如果是投资,卖家会想:“这个V3消费者下次还来,我赚的是复购的钱。”
等级体系的核心不是省钱,是留住人。
V3消费者在有群农场感受到“等级有用”,她下次还会来。V1消费者看到V3的权益,她会有动力升级。等级体系的目的不是让利,而是让顾客留下来。
3.2 为什么等级权益由卖家承担?
平台电商的等级权益(如88VIP折扣)通常由平台补贴或商家分摊。有群农场选择了不同的路径——等级权益成本完全由卖家承担。
这不是平台“吝啬”,而是对私域模式本质的尊重。有群农场的团长和农夫经营的是自己的私域资产——消费者是团长自己拉来的,信任是团长自己建立的,复购是团长自己维护的。等级权益是对这份信任的回报。
平台的角色是定规则、给工具,不是替卖家买单。卖家愿意给高等级消费者折扣,是因为他算得过这笔账;卖家不愿意参与,是因为他认为自己的利润空间不够。两种选择都是理性的。
四、开发纪实:三端联动与11个BUG
4.1 三端架构:后端+小程序+App管理后台
Phase 38是典型的三端联动开发:后端提供等级折扣计算与权益预览接口,小程序前端在消费者结算页和卖家工作台展示等级权益,App管理后台为平台管理员提供等级权益模板配置能力。数据库改动为零——完全复用 member_level_templates 表。
后端新增接口:
| 接口 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 等级折扣计算 | GET | /shops/level-discount | 消费者下单时计算折扣 |
| 等级权益预览 | GET | /shops/me/level-preview | 卖家工作台预览权益 |
小程序前端修改:
| 文件 | 修改内容 |
|---|---|
| src/pages/farmer/workbench/index.tsx | 等级权益开关 + 预览 |
| src/pages/group/workbench/index.tsx | 等级权益开关 + 预览 |
| src/pages/order/confirm/index.tsx | 结算页等级折扣展示 |
| src/pages/order/detail/index.tsx | 订单详情页等级折扣行 |
| src/components/Shop/index.tsx | 店铺页权益标签 |
App管理后台新建:
| 文件 | 操作 | 说明 |
|---|---|---|
| app/src/pages/Marketing/LevelConfig.tsx | 新建 | 等级权益配置页 |
| app/src/api/level.ts | 新建 | 等级权益 API 服务 |
| app/src/router/index.tsx | 修改 | 路由注册 |
| app/src/config/menu.tsx | 修改 | 营销菜单追加等级权益 |
4.2 权限设计的三层模型
Phase 38的权限设计遵循“平台定标准、卖家有选择、消费者享权益”的三层模型:
| 角色 | 查看权益 | 修改折扣 | 开关权益 |
|---|---|---|---|
| 平台管理员 | ✅ | ✅ App后台配置 | — |
| 农夫 | ✅ 工作台预览 | ❌ 不可修改 | ✅ 可开/关 |
| 团长 | ✅ 工作台预览 | ❌ 不可修改 | ✅ 可开/关 |
设计原则可以概括为五条:平台定标准(等级权益模板由平台统一配置),卖家有知情权(工作台展示权益预览),卖家有选择权(可开启/关闭等级权益),卖家无修改权(MVP不可修改折扣,保护消费者信任),一人一店一个开关(混合型卖家两个工作台同步开关状态)。
4.3 数据流全景
平台配置等级权益 → member_level_templates.levels[].benefits 更新 → 农夫/团长工作台 → GET /shops/me/level-preview → 查看权益预览 → 消费者下单 → GET /shops/level-discount → 计算折扣 → 结算页展示「🏆 等级折扣 -¥1.00」→ 订单详情页展示等级折扣行
4.4 数据库字段的“隐性依赖”
等级权益看起来简单——一个折扣比例,乘以订单金额,减去折扣金额。但实际上,它依赖四层数据的完整:
- 等级模板有权益数据:member_level_templates.levels 中要有 benefits.discount
- 消费者有等级:member_relations.level 不为空
- 卖家已开启:shops.level_config.is_participating = true
- 等级取最高:不限定 owner_id
任何一层缺失,都会导致 level_discount = 0。开发中最耗时的不是写代码,而是确保这四层数据都就绪。5.5小时的开发时间中,有近3小时花在了数据验证和边界条件处理上。
4.5 Schema更新≠数据库更新
一个隐蔽的BUG:handleToggleLevel 调用 PUT /shops/me 更新 level_config,接口返回成功,但刷新后开关状态恢复原样。
根因是:ShopService.get_my_shop 返回的是 Pydantic Schema 对象,不是 SQLAlchemy Model。修改 Schema 对象的属性不会持久化到数据库。修复方案是直接查 Shop Model 并 commit()。
这个教训适用于所有涉及数据库更新的操作:Schema是数据的投影,不是数据本身。改投影不如改光源。
4.6 纪律73的再次验证
Phase 37-C提出的纪律73(全链路字段追溯强制检查)在Phase 38再次得到验证。level_discount 字段从数据库到前端页面需要经过9层:
数据库 → Model → Schema请求 → Schema响应×2 → Service写入 → Service映射×2 → 前端类型 → 前端映射 → 前端渲染
本次开发中,_to_order_detail_response 映射最初被遗漏,导致订单详情页无等级折扣数据。纪律73的价值在于:它把一个“容易漏”的问题变成了“必须查”的清单。
五、等级何以成为资产:三个公式
5.1 信任的量化
等级 = f(累计消费金额)
权益 = g(等级, 卖家参与度)
复购 = h(权益感知)
等级是对消费者信任的量化。权益是对这份信任的回馈。复购是信任的再生产。
5.2 私域的飞轮
卖家让利 → 消费者感知等级价值 → 复购增加 → 消费累计 → 等级升级 → 权益更好 → 消费者更忠诚
这个飞轮的起点是卖家让利,但终点是卖家获益。等级权益不是零和博弈,是正和游戏。
5.3 从“摆设”到“激励”
有群农场的等级体系经历了三个阶段的演化:
| 阶段 | 等级的作用 | 消费者感知 |
|---|---|---|
| Phase 32 | 展示等级名称 | “哦,我是V3” |
| Phase 37 | 积分倍率差异化 | “V3积分更多” |
| Phase 38 | 折扣+包邮+积分倍率 | “V3真有用” |
等级从“一个标签”变成了“一个资产”。从展示,到差异化,到真实权益——每一次跃迁都在拉近消费者与平台的距离。
余论:土地的伦理与代码的伦理
法国哲学家布鲁诺·拉图尔在《我们从未现代过》中提出:“现代性的核心幻觉是人与非人的严格分离。”在有群农场的等级体系中,我也看到了类似的问题——等级与权益的分离。
等级是符号,权益是实体。当符号没有对应的实体时,符号就是空的。Phase 38做的事情,就是让符号有了对应的实体——等级不再是展示性的标签,而是有实际价值的资产。
这让我想起有群农场最初的品牌故事:“让信任找到好货。”等级权益是这个故事的延续——让信任得到回报。消费者对有群农场的信任,通过累计消费被量化成了等级;有群农场对消费者的回报,通过等级权益被兑现成了折扣。
“数字化不是把线下流程搬到线上,而是重新定义价值的分配方式。”
“申耕志”的使命是记录中国县域经济的数字化进程。等级权益的开发只是这个宏大叙事中的一个小片段,但它折射出一个核心命题:数字化不是把线下流程搬到线上,而是重新定义价值的分配方式。
