影刀RPA CRM客户管理:销售线索自动分配与跟进
作者:林焱 | 适用人群:影刀RPA新手 | 难度:★★★☆☆
一、什么情况用这个
销售团队每天从各种渠道进来几十上百条线索——官网表单、广告投放、展会名片、合作伙伴推荐。靠销售主管手动分配?反应慢不说,还容易分配不均——有的销售线索太多跟不过来,有的销售没活干。
用影刀RPA:定时拉取各渠道线索 → 自动查重去重 → 按规则分配给销售 → 跟踪超过N天未跟进的自动提醒。让每条线索都有主人,每个主人手里的线索量均衡。
实际场景:销售线索自动分配、客户归属冲突处理、跟进超时自动提醒、客户流转记录追踪。
这篇文章能解决的问题:
- 多渠道路由汇总线索
- 智能分配(按地域/行业/负载均衡)
- 跟进超时自动升级提醒
- 客户保护期管理
店群矩阵自动化突破运营极限!
二、怎么做
2.1 影刀主流程
┌──────────────────────────────────────────────┐ │ ① 【读取Excel/数据库】 │ │ 读取新线索池 + 销售负载表 │ │ ↓ │ │ ② 【执行Python代码】 │ │ 查重去重 → 智能分配 │ │ ↓ │ │ ③ 【写入CRM系统】 │ │ 将分配结果写入CRM(网页操作或API) │ │ ↓ │ │ ④ 【发送企业微信消息】 │ │ 通知对应销售有新的线索 │ │ ↓ │ │ ⑤ 【读取CRM】 │ │ 检查所有线索的最后跟进时间 │ │ ↓ │ │ ⑥ 【条件判断 + 通知】 │ │ 超过24h未跟进 → 提醒销售 │ │ 超过72h未跟进 → 升级给主管 │ └──────────────────────────────────────────────┘2.2 核心代码
步骤②:智能分配
importjsonfromdatetimeimportdatetime,timedelta# 新线索列表(从Excel/数据库读取)new_leads=leads_data# 现有客户列表(用于查重)existing_customers=existing_customer_data# 销售负载表sales_reps=sales_data# [{name, region, industry, current_load, max_capacity}]defis_duplicate(lead,existing):"""检查线索是否重复"""lead_phone=lead.get("phone","").replace(" ","").replace("-","")lead_company=lead.get("company","").strip()forcustomerinexisting:# 同一手机号 = 重复cust_phone=customer.get("phone","").replace(" ","").replace("-","")iflead_phoneandcust_phoneandlead_phone==cust_phone:returnTrue,customer# 同一公司名 = 重复cust_company=customer.get("company","").strip()iflead_companyandcust_companyandlead_company.lower()==cust_company.lower():returnTrue,customerreturnFalse,Nonedefassign_lead(lead,reps):"""智能分配销售"""lead_region=lead.get("region","")lead_industry=lead.get("industry","")# 优先级1:匹配地域region_matches=[rforrinrepsifr.get("region")==lead_region]# 优先级2:匹配行业industry_matches=[rforrinrepsifr.get("industry")==lead_industry]# 在匹配的销售中选择负载最低的candidates=region_matchesorindustry_matchesorreps# 按负载排序candidates_sorted=sorted(candidates,key=lambdar:r.get("current_load",0))forrepincandidates_sorted:ifrep.get("current_load",0)<rep.get("max_capacity",100):returnrep# 所有人都满了,分配给负载最低的returncandidates_sorted[0]ifcandidates_sortedelsereps[0]# ===== 处理 =====assigned=[]duplicates=[]unassigned=[]forleadinnew_leads:# 查重dup,existing_cust=is_duplicate(lead,existing_customers)ifdup:duplicates.append({"lead":lead,"existing_customer":existing_cust,"reason":"客户已存在",})continue# 分配rep=assign_lead(lead,sales_reps)ifrep:lead["assigned_to"]=rep["name"]lead["assigned_time"]=datetime.now().strftime("%Y-%m-%d %H:%M:%S")lead["followup_deadline"]=(datetime.now()+timedelta(hours=24)).strftime("%Y-%m-%d %H:%M:%S")assigned.append(lead)# 更新销售负载rep["current_load"]+=1else:unassigned.append(lead)result={"total":len(new_leads),"assigned":len(assigned),"duplicates":len(duplicates),"unassigned":len(unassigned),"assign_details":assigned,}output=json.dumps(result,ensure_ascii=False)步骤⑤⑥:跟进超时检查
defcheck_followup_overtime(leads_in_crm):"""检查跟进超时"""now=datetime.now()overtime_24h=[]overtime_72h=[]forleadinleads_in_crm:last_followup_str=lead.get("last_followup_time","")ifnotlast_followup_str:# 从未跟进,用分配时间判断last_followup_str=lead.get("assigned_time","")ifnotlast_followup_str:continuetry:last_time=datetime.strptime(last_followup_str,"%Y-%m-%d %H:%M:%S")hours_passed=(now-last_time).total_seconds()/3600ifhours_passed>72:overtime_72h.append({**lead,"hours_passed":round(hours_passed,1),"level":"严重",})elifhours_passed>24:overtime_24h.append({**lead,"hours_passed":round(hours_passed,1),"level":"一般",})exceptValueError:passreturnovertime_24h,overtime_72h# 在影刀中处理告警# 24h超时 → 提醒销售本人# 72h超时 → 提醒销售主管(抄送)2.3 客户保护期
同一客户在一定时间内不能被分配给其他销售(避免抢单):
PROTECTION_PERIOD_DAYS=30# 保护期30天defcheck_protection(customer_id,existing_customers):"""检查客户是否在保护期内"""forcustinexisting_customers:ifcust.get("customer_id")==customer_id:last_activity=cust.get("last_activity_date","")iflast_activity:try:last_date=datetime.strptime(last_activity,"%Y-%m-%d")days_since=(datetime.now().date()-last_date.date()).daysifdays_since<PROTECTION_PERIOD_DAYS:returnTrue,cust["current_owner"]except:passreturnFalse,None三、有什么坑
坑1:CRM系统的限制
大部分CRM系统的API要么不好用,要么根本没有免费的API。影刀只能通过网页操作来录入数据——效率低且不稳定。
应对:先用Excel做轻量CRM(线索池 + 跟进记录 Excel),每天同步一次到正式CRM。Excel做日常操作快得多。
坑2:查重规则太严格或太松
temu店群自动化报活动案例
查重太严格 → 大量「可能是新客户」被当成重复 → 漏掉商机。
查重太松 → 同一客户被多个销售跟进 → 客户体验差。
建议:用手机号+公司名做双重查重,同时把「可能有重复但不确定的」标记出来让人工判断。
坑3:分配规则矛盾
按地域分配和按负载均衡分配可能矛盾——北京的线索最多,但北京的销售负载也最高。
推荐优先级:匹配度 > 负载均衡。先保证客户分到最合适的销售手里,再考虑负载。负载偏差可以通过调整max_capacity来平衡。
坑4:周末和节假日的跟进计时
周五下午来的线索,要求24小时内跟进不合理(周六日没人上班)。需要排除非工作时间:
defcalculate_business_hours(start_time,deadline_hours=24):"""计算工作时间内的小时数"""# 简化版:只排除周末current=start_time remaining=deadline_hourswhileremaining>0:current+=timedelta(hours=1)# 周六日跳过(weekday: 0=Mon, 5=Sat, 6=Sun)ifcurrent.weekday()<5:remaining-=1returncurrent坑5:销售离职后的客户流转
有销售离职了,ta名下的客户需要重新分配。台账中应该记录客户的流转历史,而不仅仅是当前归属。
# 流转记录transfer_log={"customer_id":"CUST-001","from_rep":"张三","to_rep":"李四","transfer_time":datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"reason":"张三离职",}总结:影刀做CRM线索分配,核心是「查重去重 + 智能分配 + 跟进超时提醒」。Excel做轻量CRM池,规则驱动分配,定时检查跟进记录。关键是查重规则要适中、分配要考虑匹配度和负载、跟进计时排除非工作时间。