先说结论
在 Odoo CRM 里,“下一步跟进”不是一段备注, 而是一组会影响列表、看板和日历体验的真实信号。
源码里至少有 3 套相关信息在一起工作:
activity_*字段:谁的下一步、截止什么时候my_activity_date_deadline:当前用户自己的最早待办日期meeting_display_*:这条商机最近/下一次会议是什么时候
所以你看到有些机会总被顶到前面, 往往不是因为金额更大, 而是因为系统在强调:
这条记录“下一步更近、责任更明确、会议动作更临近”。
这其实是 CRM 很实用的一层:
- 它不是只按商机价值排序
- 而是在帮你表达“现在谁最该被跟”。
一、activity 在 CRM 里不只是提醒,它是优先级信号
很多人对 activity 的理解停在:
- 给销售提个醒
- 到点弹一下
但从 CRM 源码和测试看,activity 的意义更深。
因为它会直接形成:
- 当前记录有没有下一步
- 下一步归谁
- 最早截止时间是什么
- 我自己的待办是不是已经逾期
也就是说,activity 在 CRM 里更像:
对 pipeline 里的“下一步动作密度”做结构化表达。
这和单纯写一段“下周联系客户”完全不是一个层级。
二、为什么 my_activity_date_deadline 很关键
activity_date_deadline 表示这条记录上的活动截止情况,
但 my_activity_date_deadline 更特别:
- 它只关心“分配给我自己的活动”
- 而不是全体人员的活动
这点很关键。
因为一条商机上可能挂着很多人:
- 销售
- 经理
- 售前
- 客服
如果列表优先级永远按所有人的活动混算, 个人工作台会非常吵。
所以 Odoo 单独保留了“我的最早 activity 截止日”这个信号。
这意味着系统在排序“我的机会列表”时, 不是简单问:
- 这条记录活跃不活跃
而是在问:
- 它现在是不是轮到我动作了,而且期限有多近。
三、为什么 Odoo 要专门重写 search_fetch() 支持这个排序
crm.lead.search_fetch() 的 override 非常能说明问题。
源码里明确写了:
- 默认搜索机制不足以优雅支持
my_activity_date_deadline排序 - 所以它专门分两步做搜索
大意是:
- 先基于“我的 activities”算出每条 lead 的最早 deadline
- 再把这些 lead 按 deadline 重排
- 如果还不够,再补其他普通结果
这说明 my_activity_date_deadline 不是 UI 小技巧,
而是官方认可的一类工作台级排序信号。
换句话说:
Odoo CRM 不只是存 activity,它还认真地拿 activity 驱动你看到的工作顺序。
四、为什么有些记录会因为逾期 activity 被顶得更靠前
测试 test_crm_activity_ordering 很直观:
- 我的 activity 截止日期越早
- 尤其越逾期
- 那条 lead 越可能排到前面
这其实很符合销售工作现实。
一个金额很大但下周才需要动作的机会, 和一个今天就该回访、已经拖过期的机会, 到底谁更应该先看?
从“防止漏跟进”的角度,后者往往更急。
所以 Odoo 的排序不是在回答“哪个公司最值钱”, 而是在回答:
- 现在什么最需要你立刻处理。
五、meeting_display 说明 CRM 不只关心待办,也关心会面节奏
crm.lead 里还有:
meeting_display_datemeeting_display_label
源码逻辑是:
- 如果将来还有会议,显示
Next Meeting - 如果未来没有,但过去有过会议,显示
Last Meeting - 如果完全没有会议,显示
No Meeting
这套设计很妙。
因为它没有把所有会议硬塞成一团时间线, 而是提炼成一个更适合 CRM 首页/列表的信号:
- 这条机会最近有没有见面动作
- 下一次关键会面离现在多远
这比只看 chatter 留痕更适合销售节奏管理。
六、从 activity 直接跳去排会议,为什么默认参会人会自己带出来
mail.activity.action_create_calendar_event() 在 CRM 上有一个很小但很实用的 override。
如果这个 activity 对应的是某条 crm.lead,
系统会复用 action_schedule_meeting() 的上下文,把这些默认值带过去:
default_opportunity_iddefault_partner_iddefault_partner_idsdefault_team_iddefault_name
翻成人话就是:
- 你不是从空白日历硬建会议
- 而是从当前商机上下文里继续排一个正确的会
所以 Odoo 在 CRM 里处理会议,不是把 calendar 当外部工具, 而是把它当跟进链路的一部分。
七、为什么“下一步”比“最后聊过什么”更适合作为 CRM 主信号
真实销售里,最致命的问题不是“历史不够完整”, 而是:
- 不知道下一步是谁
- 不知道下一步截止点
- 不知道是不是已经过期
这就是为什么 activity 在 CRM 里比普通 chatter 更值钱。
chatter 更适合表达:
- 发生过什么
activity 更适合表达:
- 接下来谁做什么
而 meeting_display 又把“会面节奏”补了进来。
三者合起来,CRM 才真正能从记录系统变成跟进系统。
八、实战里最容易踩的 4 个坑
1. 只看金额,不看 next activity
这样很容易让高价值但不紧急的记录,压过真正即将漏掉的动作。
2. 把 activity 当备注用
activity 的价值在责任人和 deadline,不在文字本身。
3. 不区分 activity_date_deadline 和 my_activity_date_deadline
一个是全局活动信号,一个是当前用户工作台信号。
4. 会议安排不从商机上下文发起
这样很容易丢默认客户、团队和机会关联。
九、一句话记忆法
Odoo CRM 里的 next activity 不是提醒插件,而是排序、优先级和会议节奏的核心信号。
理解这一句,你就会知道为什么有些机会总被系统顶到你眼前。
DISCUSSION
评论区