先说结论
网站表单进入 Odoo CRM 时,并不是“浏览器提交什么,CRM 就原样建什么”。
website_crm 在 website_form_input_filter() 里会先做一轮默认值注入:
- 没有
medium_id时,优先取 UTM 默认值,否则创建/取用website这个 medium; - 没有
team_id时,取网站默认销售团队; - 没有
user_id时,取网站默认负责人; - 如果没有负责人但有 team,且规则分配没启用,会退回 team 负责人;
- 最后根据 team 的
use_leads决定记录是lead还是opportunity。
所以网站线索其实是先被路由,再被创建。
一、为什么网站表单不是“纯前台输入”
很多人把网站表单理解成一层很薄的 UI,觉得字段映射完成就结束了。
但 CRM 真正关心的是:
- 这条记录属于哪个销售入口;
- 该按 lead 流程还是 opportunity 流程走;
- 来源介质要不要先补齐,后续报表才不会断链。
所以 website_form_input_filter() 不是装饰器,而是业务路由器。
二、medium_id 为什么会被优先兜底成 website
源码先尝试:
- 表单里有没有显式
medium_id; default_get(['medium_id'])能否从 UTM 体系补出来;- 还没有,就
_fetch_or_create_utm_medium('website')。
这说明 Odoo 很明确:
前台线索如果连介质都没有,后面营销分析会很难看。
所以它宁可给你一个最保守的 website,也不愿让来源字段完全空着。
三、team 和 user 的默认注入,决定了后面整条主链路
网站对象上有 crm_default_team_id 和 crm_default_user_id。
这两个默认值不是可有可无。
因为它们会影响:
- 线索先落到哪个 pipeline;
- 后续阶段作用域怎么选;
- 是否一开始就有人负责;
- 自动分配是否还需要继续接手。
特别是当 user_id 为空、team_id 存在且规则分配未启用时,源码会退回到该 team 的负责人。也就是说:
哪怕你没配复杂的自动分配,网站线索也不会永远漂在无人状态。
四、为什么同样是网站进线,有的成 Lead,有的直接成 Opportunity
关键判断在 team.use_leads。
- team 开启 Leads:落成
lead; - 否则直接落成
opportunity。
这不是单纯字段差异,而是流程哲学差异:
- 有些团队要先筛选、资格判断,再转商机;
- 有些团队更偏直接入 pipeline,不单独维护线索池。
网站表单只是入口,真正决定流程的是 team 策略。
五、最容易误判的地方
1. 以为来源字段一定来自前台隐藏域
不一定,后端会补。
2. 以为没配默认负责人就一定是无人线索
不一定,可能回退到 team 负责人。
3. 以为网站表单都先落 lead 再转机会
不一定,取决于 team 是否启用 Leads。
4. 以为“建出来不对”是表单模板问题
很多时候其实是网站默认 team/user 或 CRM 规则配置问题。
六、排错顺序
网站线索路由不对时,按这个顺序看最快:
- 网站默认
crm_default_team_id; - 网站默认
crm_default_user_id; - team 的
use_leads/use_opportunities; - 规则分配是否启用;
- medium 是否来自 UTM 默认或兜底 website。
一句话记忆
网站表单进 Odoo CRM,不是先建记录再想办法归类,而是先补 medium、team、owner 和类型,再正式落库。
DISCUSSION
评论区