我们如何在Frame.io中分配注册

为60万用户分配800M点击

在 框架 we use 分割 支持我们的应用使用情况分析。可以通过使用事件名称(例如“注册“ 要么 ”观看视频”。

此数据对于我们的A / B测试和分析至关重要。与细分市场与以下服务的出色集成相结合 明比特,我们可以使用公司信息来丰富个人资料,然后跟踪用户首次访问我们的任何服务。这些数据使我们能够确定哪些博客作者吸引了最高的LTV客户,哪些YouTube潜在受众群体产生了最少的粘性用户,等等。

我们利用各种不同的增长渠道滴灌电子邮件活动,Facebook,YouTube,Twitter,Google AdWords,它们都有各自独立的平台,其中一些并不同步到我们的数据仓库中。需要一个系统来均匀化此信息,以便我们可以在一个地方分析客户,渠道,活动和媒体。

归因实际上是从360度角度了解公司的市场契合度,以及其向正确的受众简要说明其服务的能力。

规划归因系统

从概念上讲,归因非常简单-只需在数据库中找到用户ID的第一个结果并提取UTM,对吗?但是,在获取显示用户来源的那一行数据之前,需要进行大量考虑:

  • 即使建立了很好的索引,每天仍要在数百万行中搜索数千个用户,并维护这些行后面的分区和索引可能对数据库造成很大的负担。
  • 用户首次访问该网站时,他们没有user_ids,而是由Segment分配的onymous_id。用户ID仅在用户创建帐户后才与该用户相关联,并且“ iy”呼叫同时使用anonymous_id和user_id。有时,我们会发现一年多以前用户的anonymous_id。拥有用户的全局ID(从系统分配)后,我们必须在分配ID之前回填所有匿名会话。
  • 在注册之前,我们必须对每组用户操作进行会话,并汇总有关他们的第一个/最后一个会话的属性。会话化是将离散的用户事件聚合到页面加载过程中的过程,间隔不超过20分钟。这使我们能够做一些事情,例如分析访问的整体意图并进行批量归因。重新会话涉及巨大的嵌套窗口函数和别名表,因为同一用户经常要合并几个历史的匿名ID。
  • 我们将希望维护一些快速查找表以使其有用。-用户会话计数,有用的会话,也许还有一些汇总,以了解我们在可视化工具(如可视化工具)中的工作方式 外观.
  • 另请注意,细分实际上具有本地 归因 您可以安装带有摘要的系统;但在安装之前无法回溯。,我们的数据可以追溯到2014年。

实施阶段

系统设计基于以下8个查询组/阶段:

  1. 在现有的会话化数据中查找最新的时间戳
    1. 从细分跟踪表中获取所有最新访问数据
    2. 将此数据与最近的每月分区合并,并使用一些代码来检查列是否仍然相同(可以添加新字段)。
  2. 会话化最近的分区(最近24小时可能有重叠,因此请确保覆盖了空白)
    1. 用任何新标识的匿名/用户对更新别名表。
    2. 返回所有历史会话并重新别名-即将匿名ID替换为任何新标识的user_id。
    3. 重新会话化所有历史会话,因为相邻的会话在历史上可能具有不同的匿名ID,但现在具有相同的user_id
  3. 添加额外的一列以指示用户是否注册了会话
    1. 将生成的会话表合并到单个all_sessions表中
    2. 为有用的会话创建查找表-这是第一个会话,并且仅针对每个用户的注册会话
  4. 创建一个有用的归因表,其中包含预先提取的UTM参数和会话计数
  5. 重新索引所有表,并检查分区顺序是否正确(尤其是在新的月份间隔内)。

表结构

表/图式:

  • 混叠
  • 会议
    • 归因
    • 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个小时。但是,我们的流量每个月都在以惊人的速度增长-这种持续时间将持续多长时间?值得庆幸的是,该系统除了最后阶段外,还易于并行化。

 With thanks to Kyle Gesuelli and Ammon Brown for proof reading, edits and suggestions. I originally posted 上 the 框架 blog at: //medium.com/frame-io-engineering/marketing-attribution-at-frame-io-8c2dbde14b37

发表评论