连锁餐饮、医美、教育这类多门店业务客户管理普遍有两个痛点一是客户分散在各门店员工的企微里总部看不到全局二是新客户加进来后分配混乱好客户被新店员工先抢走老店长期吃不到新客。企微 API 能解决这个问题但要先搞清楚客户归属这件事的边界。先搞清楚企微客户的归属机制企微里的外部联系人客户有两个关键属性属性含义可改吗externalUserId客户的唯一 ID跨公司不重复不可绑定的企微成员当前客户由哪个员工跟进可转移企业微信原生支持一个客户只能绑定一个企微成员作为主跟进人。如果多个门店员工同时加了同一个客户客户那边会显示所有员工但企业后台只有一个主跟进人。这就是连锁门店客户管理的核心通过 API 管理客户 → 员工的绑定关系实现总部分配、门店执行。整体架构总部管控 门店自治总部门店管理后台CRM ↓分配规则引擎 企微 APIcontact 模块 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, headersHEADERS, json{ appid: APPID, externalUserId: external_user_id, fromMemberUin: from_uin, toMemberUin: to_uin, strategy: 2, # 1全部客户, 2按标签, 3按时间 tags: [vip], # strategy2 时生效 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, headersHEADERS, 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先做三件事每个门店一个活码活码 remark 里写门店名add_external_contact回调里按活码 remark 分配到门店员工每天凌晨用getExternalContactList拉全量按 memberUin 统计各门店客户数这三件事一天就能搭完能解决 70% 的客户归属混乱问题。客户转移接口和活码配置在开发文档的 contact 模块活码创建时的 remark 字段可以自定义门店标识。
阅读完成 · 觉得有帮助?