为60万用户分配800M点击
在 框架 we use 分割 支持我们的应用使用情况分析。可以通过使用事件名称(例如“ 注册 “ 要么 ” 观看视频 ”。
此数据对于我们的A / B测试和分析至关重要。与细分市场与以下服务的出色集成相结合 明比特 ,我们可以使用公司信息来丰富个人资料,然后跟踪用户首次访问我们的任何服务。这些数据使我们能够确定哪些博客作者吸引了最高的LTV客户,哪些YouTube潜在受众群体产生了最少的粘性用户,等等。
我们利用各种不同的增长渠道滴灌电子邮件活动,Facebook,YouTube,Twitter,Google AdWords,它们都有各自独立的平台,其中一些并不同步到我们的数据仓库中。需要一个系统来均匀化此信息,以便我们可以在一个地方分析客户,渠道,活动和媒体。
归因实际上是从360度角度了解公司的市场契合度,以及其向正确的受众简要说明其服务的能力。
规划归因系统
从概念上讲,归因非常简单-只需在数据库中找到用户ID的第一个结果并提取UTM,对吗?但是,在获取显示用户来源的那一行数据之前,需要进行大量考虑:
- 即使建立了很好的索引,每天仍要在数百万行中搜索数千个用户,并维护这些行后面的分区和索引可能对数据库造成很大的负担。
- 用户首次访问该网站时,他们没有user_ids,而是由Segment分配的onymous_id。用户ID仅在用户创建帐户后才与该用户相关联,并且“ i 牙 y”呼叫同时使用anonymous_id和user_id。有时,我们会发现一年多以前用户的anonymous_id。拥有用户的全局ID(从系统分配)后,我们必须在分配ID之前回填所有匿名会话。
- 在注册之前,我们必须对每组用户操作进行会话,并汇总有关他们的第一个/最后一个会话的属性。会话化是将离散的用户事件聚合到页面加载过程中的过程,间隔不超过20分钟。这使我们能够做一些事情,例如分析访问的整体意图并进行批量归因。重新会话涉及巨大的嵌套窗口函数和别名表,因为同一用户经常要合并几个历史的匿名ID。
- 我们将希望维护一些快速查找表以使其有用。-用户会话计数,有用的会话,也许还有一些汇总,以了解我们在可视化工具(如可视化工具)中的工作方式 外观 .
- 另请注意,细分实际上具有本地 归因 您可以安装带有摘要的系统;但在安装之前无法回溯。,我们的数据可以追溯到2014年。
实施阶段
系统设计基于以下8个查询组/阶段:
- 在现有的会话化数据中查找最新的时间戳
- 从细分跟踪表中获取所有最新访问数据
- 将此数据与最近的每月分区合并,并使用一些代码来检查列是否仍然相同(可以添加新字段)。
- 会话化最近的分区(最近24小时可能有重叠,因此请确保覆盖了空白)
- 用任何新标识的匿名/用户对更新别名表。
- 返回所有历史会话并重新别名-即将匿名ID替换为任何新标识的user_id。
- 重新会话化所有历史会话,因为相邻的会话在历史上可能具有不同的匿名ID,但现在具有相同的user_id
- 添加额外的一列以指示用户是否注册了会话
- 将生成的会话表合并到单个all_sessions表中
- 为有用的会话创建查找表-这是第一个会话,并且仅针对每个用户的注册会话
- 创建一个有用的归因表,其中包含预先提取的UTM参数和会话计数
- 重新索引所有表,并检查分区顺序是否正确(尤其是在新的月份间隔内)。
表结构
表/图式:
- 混叠
- 对
- 会议
- 归因
- all_sessions
- 有用的会话
- session_stages
- all_tracks_2018_01
- all_tracks_2018_01_aliased
- all_tracks_2018_01_re_merged
- all_tracks_2018_01_signup
- …etc
- 分割
- app_tracks_2018_01
- app_tracks_2018_02
- app_tracks_2018_03
- …etc
最终的sessions.attribution表中的列(许多只是快速查找,易于聚合,并且该表已建立大量索引):
- alias_id
- session_count_before_signup
- signup_timestamp
- blog_url
- first_page_ever_visited
- 首次接触(即与任何frame.io属性的首次互动)
- 时间戳记
- 来源,广告系列,媒体,引荐来源
- 最后一次接触(即注册前的最后一次互动)
- 时间戳记
- 来源,广告系列,媒体,引荐来源
- 首次归属接触(如上所述,但带有付费推荐人)
- 时间戳记
- 来源,广告系列,媒体,引荐来源
- 最后归属的联系方式(如上所述,但带有付费引荐来源)
- 时间戳记
- 来源,广告系列,媒体,引荐来源
部署和监控
该系统花了大约1.5个月的时间才能正常运行,并且需要大约800行代码(Python,SQL,Shell和YAML)。
像AWS,Google Cloud和Azure这样的云计算生态系统使部署这样的微服务变得非常简单。该代码是Dockerized(在 高山的 )并部署在 ECS Fargate 簇。新的版本由处理 代码管道 ,它监视Github仓库的归属。基础数据库是 极光Postgres .
该系统每天早上大约需要运行4个小时,并且可能会遇到诸如底层表缓慢或不可用之类的困难。为了减轻这种情况,每个查询都有一个2小时的重试系统。
性能已登录 AWS Cloudwatch ,已同步到 数据狗 。如果重试后任何查询完全失败,则 寻呼机 ping已发送到我的手机。
结果
- 出色的统计信息-71%的用户在第一次访问时就注册了!
- 对Frame.io采取了8亿个操作(我们的细分跟踪表分区的行数-),我们现在有60万用户。
- 我们不再需要深入研究特定的平台(例如Facebook Business,Google Analytics(分析)),而是将所有分析都集中在一个地方并可以在Looker中将其可视化!
- 我们可以通过简单的SQL分组法轻松地计算每个广告系列或频道的平均LTV。
- 我们可以评估来源的粘性-例如我们的YouTube广告能为我们带来长期或快速流失的客户吗?
- 作为直觉检查,我们要求用户报告他们听说过Frame.io的位置(直接访问的比例为50%,YouTube的比例为14%,Facebook的比例为10%),这些数字与我们的“首次触摸”列完全匹配。
我们从这里去哪里?
- 此归因系统只是实际分析背后的管道。当我们不得不做出更多的哲学决定时,这将变得更加困难。我们如何确定如何归因于“多点触控”用户?例如。如果用户在一篇博客文章上具有第一接触,而几个月后在另一文章上具有最后接触,那么谁能得到功劳呢?
- 我们目前正在密切监视性能,该过程大约需要4个小时。但是,我们的流量每个月都在以惊人的速度增长-这种持续时间将持续多长时间?值得庆幸的是,该系统除了最后阶段外,还易于并行化。