活动团队常把社媒发帖理解成宣传动作,但 Odoo 企业版 event_social + social 的价值在于:它让活动节点上的帖子从一开始就进入可归因链路,而不是发出去就失踪。核心源码可以看 enterprise/event_social/models/event_mail.py、enterprise/event_social/models/event_type_mail.py、enterprise/social/models/social_post.py 与 enterprise/social/models/utm_source.py。
一、活动里的 social post 不是邮件替代物,而是独立通知类型
event_mail 和 event_type_mail 都扩展了 notification_type = 'social_post',并且明确限制:after_sub 不能用于 social post,因为社媒帖子没有单个收件人。这一点特别关键,它告诉你活动社媒不是“换个渠道发通知”,而是完全不同的传播对象。
也因此,活动侧调度更像“在某个事件时间点创建一条社媒投放任务”,而不是“给一批报名人发内容”。
二、模板引用决定内容如何被转成真正的 post
template_ref 可以引用 social.post.template。在 _execute_event_based() 里,系统会把这些模板转换成真正的 social.post。这说明 event_social 的核心不是保存文案,而是把“活动时间轴上的某个传播动作”绑定到一个可复用的社媒模板上。
这样的好处是,活动团队可以按时间节点复用模板;市场团队则继续在 social 模块里治理媒体账号、格式和内容。两边各管各的,但通过模板引用接在一起。
三、tracking link / medium / source 才是这套机制的商业核心
social.post 继承了 utm.source.mixin,并且有 utm_campaign_id、source_id。同时 utm_source.py 明确保护:如果某个 UTM Source 已经被 social posts 使用,就不能随便删。这是一个很强的信号——Odoo 认为来源标识不是装饰字段,而是后续归因的基础设施。
也就是说,一条活动社媒帖子真正值钱的,不只是发出去了,而是它携带的 tracking link 和 medium/source 能否在后续站内访问、报名、线索生成里留下归因痕迹。
四、lead attribution 的起点并不在 CRM,而在发帖时就埋好了
很多团队只有在线索进 CRM 后才想到归因,实际上 Odoo 的做法更前置:在 social post 层就给内容打上 campaign/source 语义。这样等用户点击追踪链接进入网站、注册活动或留下线索时,后续模块才有机会把 attribution 继续接下去。
这也是为什么 event_social 值得单独看。它把活动营销节点、社媒模板和 UTM 体系在“发帖前”就绑起来了,而不是事后猜这条线索大概来自哪篇帖子。
五、容易误解的地方
1. social post 不是活动邮件的替代品
两者面对的对象不同,调度约束也不同。
2. UTM 不是报表后缀
它在发帖时就决定了后续是否还有归因可能。
3. 模板能发,不代表账号就配置正确
event_mail.py 里对没有 linked accounts 的模板会直接报问题,这不是小题大做,而是在避免“计划里有动作、实际发不出去”。
六、实战建议
- 活动节点先定传播时间,再定模板,不要倒过来;
- 所有活动社媒模板都要统一 UTM 口径;
- 归因异常时,先查 social post 上的 source/campaign,再查 CRM 报表。
七、结论
Odoo 企业版活动社媒的真正价值,不是帮你定时发一条宣传文案,而是让活动传播动作从创建那一刻起,就带着 tracking link、medium/source 与后续 lead attribution 的可能性。没有这层归因设计,所谓“社媒联动活动”多数只是热闹一下。
主要源码锚点:
enterprise/event_social/models/event_mail.pyenterprise/event_social/models/event_type_mail.pyenterprise/social/models/social_post.pyenterprise/social/models/utm_source.py
DISCUSSION
评论区