等级何以成为资产

等级何以成为资产

——有群农场 Phase 38 等级权益体系开发纪实与思考

关键词:等级权益 | 私域电商 | 会员体系 | 一人一店 | 信任量化
阅读时间:约15分钟

引子:一个被浪费的等级

2026年6月23日,有群农场消费者小王打开「我的」页面,看到自己的会员等级——V3黄金会员。这个等级是怎么来的?她在平台累计消费超过2000元。这个等级能做什么?什么也不能做。

V3只是一个标签,一行文字,没有任何实际权益。

这不是小王一个人的困惑。在等级权益上线之前,有群农场1-5级会员体系已经运行了近两周,但等级的唯一作用是展示。V1和V5的消费者在购物体验上没有区别——同样的价格,同样的服务,同样的积分倍率。

“一个没有权益的等级,就像一枚没有购买力的货币。它存在,但毫无价值。”

这是等级体系最尴尬的处境——花了大量精力设计等级、计算等级、展示等级,却忘了回答最根本的问题:等级凭什么让消费者在乎?

等级困境:有等级无权益
▲ 图1:从「等级标签」到「等级资产」——一个没有权益的等级毫无价值

一、等级的“双重身份”:是人的勋章,还是店的工具?

1.1 一个被修正的关键BUG

Phase 38开发中最关键的一个BUG,不是代码错误,而是设计假设的错误

最初的 _calculate_level_discount 方法中,查询消费者等级时加了一个条件:

MemberRelation.owner_id == shop.user_id

这意味着:消费者在团长店铺下单时,取的是她在这个团长名下的等级;在农夫店铺下单时,取的是她在这个农夫名下的等级。同一个人,在不同店铺,等级可能不同。

这看起来合理——团长和农夫各自经营私域,消费者的消费数据也是分开的,等级自然应该分开。但这个逻辑有一个致命缺陷:它违背了等级的本质。

等级是对“人”的评价,不是对“人与店铺关系”的评价。小王之所以是V3,是因为她在整个有群农场平台累计消费超过2000元,而不是因为她在某个特定店铺消费了多少。等级属于消费者个人,不属于任何店铺。

修正后的代码去掉了 owner_id 限制,取全平台最高等级:

relation_query = select(MemberRelation).where( and_( MemberRelation.member_id == member.member_id, MemberRelation.tenant_id == tenant_id, ) ).order_by(MemberRelation.total_consumption.desc()).limit(1)

这个修正确立了等级权益体系的第一原则:等级是人的属性,不是店铺的属性。

1.2 为什么平台电商必须统一,而私域电商不必?

淘宝的88VIP、京东的PLUS会员,都是平台统一制定规则,所有商家必须遵守。因为有群农场的模式与它们有本质区别。

维度 平台电商(淘宝/京东) 私域电商(有群农场)
消费者行为 搜索比价,逛多家店 通过团长/农夫链接进入,常去固定店铺
跨店铺体验 频繁,权益必须一致 极少,不需要跨店铺一致性
等级权益成本 平台承担或商家分摊 卖家自行承担
卖家自主权 低,必须参与 高,可选择参与或不参与

私域电商不需要跨店铺体验一致性。消费者小王每次打开有群农场,进入的都是团长小羔的店铺。她不知道其他店铺有没有等级权益,也不需要知道。她只需要在她常去的那个店,感受到“我的等级有用”。

这一认知避免了过度设计。有群农场的等级权益不需要复杂的跨店铺同步机制,卖家只需要一个开关:参与,或不参与。

“企业的目的是创造顾客。”——彼得·德鲁克

在信任电商时代,企业的目的是理解关系。等级是对“人”的评价,不是对“人与店铺关系”的评价。

二、一人一店:一个开关背后的设计哲学

2.1 混合型卖家的“一个开关”

有群农场有一个特殊角色——混合型卖家。用户8007既是农夫又是团长,但只有一个店铺。这是“一人一店”原则的死命令。

等级权益的开发中,混合型卖家带来了一个有趣的问题:农夫工作台和团长工作台各有一个等级权益开关,它们是同一个开关还是两个独立的开关?

如果是两个独立的开关,会出现什么情况?农夫工作台开启权益,团长工作台关闭权益。消费者在同一个店铺里,有时候享受折扣,有时候不享受。这会让人困惑——同一个店铺,同一个消费者,为什么权益时有时无?

答案只能是:一个店铺只有一个开关。两个工作台共享同一份数据(shops.level_config),农夫开启等于团长开启,团长关闭等于农夫关闭。

这个设计在代码层面天然成立——两个工作台读写的都是同一行数据库记录,不需要额外的同步逻辑。但在认知层面,它确立了一个重要原则:店铺是资产的最小单位,工作台只是视角的切换。

2.2 “可上浮不可下浮”的治理逻辑

确定了卖家可以自由选择参与或不参与之后,第二个问题随之而来:参与的卖家能否修改权益内容?

答案是可以,但有限制:可上浮,不可下浮。

平台设定最低权益标准——V3享9.5折。团长如果愿意,可以上调到9折甚至8.5折,给消费者更多优惠。但不能下调到9.8折,因为那会让消费者觉得“这个团长在克扣我的等级权益”。

这个设计借鉴了劳动法中的“最低工资标准”——平台定底线,企业可上浮。它同时保护了两方:消费者不会因为某个卖家而体验受损,卖家也不会因为强制统一而利润受损。

平台电商 vs 私域电商
▲ 图2:平台电商统一权益 vs 私域电商自主参与——两种模式的底层逻辑差异

三、等级权益不是成本,是投资

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的价值在于:它把一个“容易漏”的问题变成了“必须查”的清单。

等级体系三阶段演化
▲ 图3:从「摆设」到「激励」——等级体系的三阶段演化

五、等级何以成为资产:三个公式

5.1 信任的量化

等级 = f(累计消费金额)
权益 = g(等级, 卖家参与度)
复购 = h(权益感知)

等级是对消费者信任的量化。权益是对这份信任的回馈。复购是信任的再生产。

5.2 私域的飞轮

卖家让利 → 消费者感知等级价值 → 复购增加 → 消费累计 → 等级升级 → 权益更好 → 消费者更忠诚

这个飞轮的起点是卖家让利,但终点是卖家获益。等级权益不是零和博弈,是正和游戏。

5.3 从“摆设”到“激励”

有群农场的等级体系经历了三个阶段的演化:

阶段 等级的作用 消费者感知
Phase 32 展示等级名称 “哦,我是V3”
Phase 37 积分倍率差异化 “V3积分更多”
Phase 38 折扣+包邮+积分倍率 “V3真有用”

等级从“一个标签”变成了“一个资产”。从展示,到差异化,到真实权益——每一次跃迁都在拉近消费者与平台的距离。

私域飞轮
▲ 图4:私域飞轮——等级权益的正和游戏
等级何以成为资产——五个公式
▲ 图5:等级何以成为资产——五个核心公式

余论:土地的伦理与代码的伦理

法国哲学家布鲁诺·拉图尔在《我们从未现代过》中提出:“现代性的核心幻觉是人与非人的严格分离。”在有群农场的等级体系中,我也看到了类似的问题——等级与权益的分离。

等级是符号,权益是实体。当符号没有对应的实体时,符号就是空的。Phase 38做的事情,就是让符号有了对应的实体——等级不再是展示性的标签,而是有实际价值的资产。

这让我想起有群农场最初的品牌故事:“让信任找到好货。”等级权益是这个故事的延续——让信任得到回报。消费者对有群农场的信任,通过累计消费被量化成了等级;有群农场对消费者的回报,通过等级权益被兑现成了折扣。

“数字化不是把线下流程搬到线上,而是重新定义价值的分配方式。”

“申耕志”的使命是记录中国县域经济的数字化进程。等级权益的开发只是这个宏大叙事中的一个小片段,但它折射出一个核心命题:数字化不是把线下流程搬到线上,而是重新定义价值的分配方式。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部