☰
连锁门店怎么统一管理客户?企业微信API让总部分配、门店不乱
2026/10/27 10:50:14 网站建设 项目流程

连锁餐饮、医美、教育这类多门店业务,客户管理普遍有两个痛点:一是客户分散在各门店员工的企微里,总部看不到全局;二是新客户加进来后分配混乱,好客户被新店员工先抢走,老店长期吃不到新客。

企微 API 能解决这个问题,但要先搞清楚"客户归属"这件事的边界。

先搞清楚企微客户的归属机制

企微里的外部联系人(客户)有两个关键属性:

属性

含义

可改吗

externalUserId

客户的唯一 ID,跨公司不重复

不可

绑定的企微成员

当前客户由哪个员工跟进

可转移(企业微信原生支持)

一个客户只能绑定一个企微成员作为主跟进人。如果多个门店员工同时加了同一个客户,客户那边会显示所有员工,但企业后台只有一个"主跟进人"。

这就是连锁门店客户管理的核心:通过 API 管理"客户 → 员工"的绑定关系,实现总部分配、门店执行。

整体架构:总部管控 + 门店自治

总部门店管理后台(CRM) ↓(分配规则引擎) 企微 API:contact 模块 + label 模块 ↓(同步绑定关系) 各门店员工的企微客户端 ↓(日常跟进) 客户

总部决定"哪个客户归哪个门店",门店决定"店里谁来跟进这个客户"。两层权限,互不干扰。

第一步:门店到员工的映射表

先在 CRM 里维护门店和员工的对应关系:

STORE_TO_MEMBERS = { "store_001": [100001, 100002, 100003], # 北京王府井店的员工 uin "store_002": [100004, 100005], # 上海南京西路店 "store_003": [100006, 100007, 100008, 100009], # 广州天河店 } def get_store(member_uin): for store, members in STORE_TO_MEMBERS.items(): if member_uin in members: return store return None

门店和员工的映射关系要和企微通讯录保持一致。企微里可以用部门来管理门店员工(一个门店一个部门),同步更方便。

第二步:新客户分配规则

新客户通过活码加进来,活码创建时可以绑定门店。回调触发时按规则分配:

def assign_new_customer(data): external_user_id = data["externalUserId"] member_uin = data["memberUin"] # 谁先收到的好友请求 # 查活码配置,看是哪个门店的活码 contact_way = get_contact_way(data.get("sourceId")) target_store = contact_way.get("remark") # 活码的 remark 字段存门店 # 规则 1:活码绑定了门店,优先分给该门店 if target_store: members = STORE_TO_MEMBERS.get(target_store, []) target_uin = round_robin(members, external_user_id) if target_uin != member_uin: transfer_customer(external_user_id, member_uin, target_uin) return # 规则 2:按距离客户地址最近的门店分配 store = find_nearest_store(data.get("address")) members = STORE_TO_MEMBERS.get(store, []) target_uin = round_robin(members, external_user_id) transfer_customer(external_user_id, member_uin, target_uin)

round_robin保证门店内员工均匀分客,不让新员工和老员工差距太大。

第三步:客户转移(门店间调店)

客户归错门店了,或者客户搬家到了另一个城市,需要调店。调店的核心是修改"客户绑定的企微成员":

def transfer_customer(external_user_id, from_uin, to_uin): """把客户从 from_uin 转交给 to_uin""" requests.post( f"{BASE}/wx-api/api/contact/transferExternalContact", headers=HEADERS, json={ "appid": APPID, "externalUserId": external_user_id, "fromMemberUin": from_uin, "toMemberUin": to_uin, "strategy": 2, # 1=全部客户, 2=按标签, 3=按时间 "tags": ["vip"], # strategy=2 时生效 "notifyCustomer": True, # 通知客户"跟进人变更" "reason": "客户搬家,调整到就近门店" } )

notifyCustomer: True很重要——客户那边会收到一条提示"您的顾问已调整为 XXX",不会莫名其妙被换人。

第四步:数据隔离,总部能看全局,门店只能看自己

客户数据存 CRM 时,必须带store_id字段:

CREATE TABLE customers ( external_user_id TEXT PRIMARY KEY, member_uin INTEGER, store_id TEXT, -- 门店归属 source TEXT, -- 来源渠道 tags TEXT, created_at DATETIME, last_follow_at DATETIME );

总部查询不带store_id过滤,能看到所有门店客户;门店员工登录 CRM 时自动加WHERE store_id = ?条件。总部给门店的活码、客户标签模板也是统一维护的,门店不能乱改。

第五步:定时校验归属一致性

客户转移后,企微后台和 CRM 可能有短暂不一致。每天凌晨跑一次校验:

def validate_ownership(): # 拉所有外部联系人 all_contacts = requests.post( f"{BASE}/wx-api/api/contact/getExternalContactList", headers=HEADERS, json={"appid": APPID, "offset": 0, "limit": 1000} ).json()["data"]["externalContacts"] for contact in all_contacts: uin = contact["memberUin"] external = contact["externalUserId"] expected_store = get_store(uin) # CRM 里记的门店和企微里的门店对不上 crm_store = db.execute( "SELECT store_id FROM customers WHERE external_user_id=?", (external,) ).fetchone() if crm_store != expected_store: log_mismatch(external, crm_store, expected_store) # 修正 CRM 记录 db.execute( "UPDATE customers SET store_id=? WHERE external_user_id=?", (expected_store, external) )

连锁门店的三个避坑点

不要让同一个活码绑定多个门店。一个活码一个门店,客户扫哪个活码就归哪个门店。多门店共用活码会导致分配混乱。

客户转移要走 API,别让门店自己手动删加。手动删加客户会丢失历史聊天记录,而且客户那边显示"添加新顾问",体验差。

门店员工离职要批量转移。员工离职时,企微会推离职事件,此时把该员工名下所有客户转移到门店其他员工:

def handle_member_resigned(resign_uin): store = get_store(resign_uin) remaining = [m for m in STORE_TO_MEMBERS[store] if m != resign_uin] customers = db.execute( "SELECT external_user_id FROM customers WHERE member_uin=?", (resign_uin,) ).fetchall() for customer in customers: to_uin = round_robin(remaining, customer["external_user_id"]) transfer_customer(customer["external_user_id"], resign_uin, to_uin)

最小可行方案

如果公司还没上 CRM,先做三件事:

  1. 每个门店一个活码,活码 remark 里写门店名

  2. add_external_contact回调里按活码 remark 分配到门店员工

  3. 每天凌晨用getExternalContactList拉全量,按 memberUin 统计各门店客户数

这三件事一天就能搭完,能解决 70% 的客户归属混乱问题。

客户转移接口和活码配置在开发文档的 contact 模块,活码创建时的 remark 字段可以自定义门店标识。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询