如何将 Segment.io 服务器和客户端事件连接到同一匿名用户?

2023-12-28

我正在致力于在现有 .NET 电子商务应用程序上实现 Segment 分析中心,以便与 Mixpanel 以及其他一些服务一起使用。我了解 Analytics.js 和 Segment .NET API 的 API 文档,但我很困惑如何将匿名事件连接到同一用户。

例如,假设我正在跟踪某个商品已添加到购物车。我正在服务器端进行此操作,因为有多个页面可以将商品添加到购物车,但只有一个控制器。用户无需登录即可执行此操作,并且我们已经为他们分配了一个客户 ID,因此我的代码如下所示:

Analytics.Client.Track(cartItem.CustomerId, "Added Product", new Properties() {
    { "sku", cartItem.Sku },
    { "quantity", quantity }
});

然后,假设用户查看产品类别页面。由于这是一个相对简单的操作,我目前在客户端执行此操作,因此我的代码如下所示:

analytics.track('Viewed Product Category', {
    category: '@Model.CategoryName',
    subCategory: '@Model.SubCategoryName'
});

我在 Analytics.js 规范中看到:

您无需为网站的匿名访问者调用“identify”。 我们会自动为他们分配一个anonymousId,所以只需调用page 并且轨道在没有识别的情况下仍然可以正常工作。

我的主要问题是,如何告诉 Segment 执行这两个操作的是同一个(当前是匿名)用户?作为第二个问题,即使 Track 调用包含用户 ID,我是否需要在服务器端调用之前调用“识别”?


我在 Segment 工作。搭售匿名的使用 Segment 跨客户端和服务器端调用的活动很棘手,原因如下:

  • Segment 的服务器端库是完全无状态的,并且对请求上下文来说是幼稚的,因此您需要获取相关信息并将其传递到对 Segment 的调用中。

  • 此外,在客户端上,您集成的捆绑的第三方工具将自行管理各自的匿名/会话标识符。

  • 一些服务器端集成有一个特殊的context字段作为其匿名标识符(如 GA),但大多数都没有,因此您需要编写一个包装器来抽象下面的示例情况(使用不同的值发送多个调用)anonymousIds 同时指定哪个应该发送到哪个服务)。

注:customerId如果即使在购买后仍保留其唯一标识符,该方法将有效,以便您可以always用它作为userId。但值得记住的是,如果您打算将其用作中间伪匿名标识符,则并非所有工具都能够为多个 ID 起别名,因此,如果您这样做,您可能无法在所有工具中保持一致的用户配置文件方法。

但是,在以下情况下可以有效地完成此操作:don't有事实上的userId(我想对于其他提出这个问题的人来说也是如此)实际上是一个你正在使用哪些工具的问题;对于它们中的每一个,您需要从请求中获取它们各自的匿名标识符(它们通常在 cookie 中可用)并将其附加到服务器端对 Segment 的调用中各自的字段。

如果您使用 KISSmetrics、Mixpanel 和 Google Analytics,情况可能如下:

str gaClientId, kmAnonId, mpAnonId;

HttpCookieCollection cookies = Request.Cookies;

//GA clientId is stored as part of the _ga cookie
if (cookies["_ga"] != null)
{
    string gaCookie = Request.Cookies["_ga"];
    string[] parts = gaCookie.Split('.')
    gaClientId = Strint.Format("{0}.{1}", parts[2], parts[3])
}

// KM anonId
if (cookies["km_ai"] != null)
{
    kmAnonId = Request.Cookies["km_ai"];
}

// for brevity, I'll omit retrieving mixpanel distinctId
// from their cookie. You will need to serialize the value of 
// "mp_<acesstoken>_mixpanel" to JSON and take the `distinct_id` value
// see here: http://marcmezzacca.com/integrating-mixpanel-with-asp-net-mvc-server-side-and-javascript-client-side/

Analytics.Model.Options kmCallOptions = new Options()
  .SetIntegration("all", false)
  .SetIntegration("Kissmetrics", true)
  .SetIntegration("Google Analytics", true)
  .SetContext (new Context () {
    { "ip", GetUserIP() },
    { "Google Analytics", new Dict() {
      { "clientId", gaClientId }
    } 
    },
    { "AnonymousId", kmAnonId }
  }
});

Analytics.Model.Options mpCallOptions = new Options()
  .SetIntegration("all", false)
  .SetIntegration("Mixpanel", true)
  .SetContext (new Context () {
    { "ip", GetUserIP() },
    },
    { "AnonymousId", mpAnonId }
  }
});

// Send to KM and GA
Analytics.Client.Track(null, "Added Product", new Properties() {
    { "sku", cartItem.Sku },
    { "quantity", quantity }
}, kmCallOptions);

// Send to Mixpanel
Analytics.Client.Track(null, "Added Product", new Properties() {
    { "sku", cartItem.Sku },
    { "quantity", quantity }
}, mpCallOptions);

一个简单的说明:Segment 肯定是为了解决这个令人头疼的问题,让实现这一目标变得更容易,但我们并不是让 API 复杂化以适应每个工具的多个匿名标识符,而是打算以一种完全消除这种需要的方式来解决问题。在此期间,为了避免复杂性,我们强烈建议将所有匿名跟踪保留在一个位置,无论是服务器端(使用 sessionId 或类似的匿名 ID)还是(最好)客户端。如果您想混合搭配,服务器端跟踪最好保留给具有 userId 的登录用户。

另外,请随时直接联系支持人员@[电子邮件受保护] /cdn-cgi/l/email-protection!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Segment.io 服务器和客户端事件连接到同一匿名用户? 的相关文章

  • 为 Meteor 数据创建编号列表

    有没有办法获取 Meteor 集合中项目的编号列表的 编号 我知道我可以在 html 中做到这一点 但我觉得如果我可以在 spacebars 中放置一些东西 那么样式会更容易 如果我可以使用更好的术语 请告诉我 像这样的东西 前 20 部电
  • Javascript 中的线性回归 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在网络浏览器中用 Javascript 进行最小二乘拟合 目前 用户使用 HTML 文本输入输入数
  • 捕获另一个进程未处理的异常

    我想知道我是否可以捕获我开始使用 Process Start 的另一个进程抛出的未处理的异常 我知道我可以用这个捕获标准错误link http social msdn microsoft com Forums en US csharpgen
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • 如何设置在浏览器的新选项卡(_blank)中打开的pdf文件的标题

    这是我的尝试 是否在新选项卡上打开 但它总是显示test pdf如题 function titlepath path name alert path alert name document title name window open pa
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • D3v6 嵌套图 - 嵌套 join()?

    我想可视化每个节点的 孩子 洞察力 我猜 D3v6 join 函数可以嵌套 不幸的是我找不到任何例子 下面的代码片段包含一个具有 3 个节点和子节点作为属性的outerGraph 到目前为止 这些孩子还没有被使用 相反 innerGraph
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • EWS - 给予预约,获取预约的所有者副本

    在 EWS 中进行预约后 是否可以获得所有者的副本 例如 如果我登录为user1 我有user1创建的约会的副本user2 我有冒充权 我要编辑user2预约的副本 我怎样才能获得user2 s copy 您可以使用 PidLidClean
  • 为什么 JSON 结果可以是布尔值而不是对象或数组?

    From JSON 网站 http json org JSON 建立在两种结构之上 名称 值对的集合 在各种语言中 这被实现为对象 记录 结构 字典 哈希表 键控列表或关联数组 值的有序列表 在大多数语言中 这被实现为数组 向量 列表或序列
  • 带有 HttpContext 的 ASP.NET MVC 单元测试控制器

    我正在尝试为我的一个控制器编写一个单元测试 以验证视图是否正确返回 但该控制器有一个访问 HttpContext Current Session 的基本控制器 每次我创建控制器的新实例时 都会调用 basecontroller 构造函数 并
  • 一个接一个地淡入div

    大家好 我很擅长 HTML 和 CSS 但才刚刚开始接触 jQuery 的皮毛 我希望让 3 个 div 在页面加载时逐渐淡入 到目前为止我有这个 我听说使用 css 将显示设置为 none 对于任何使用非 JavaScript 浏览器的人
  • Three.js WebGL 从着色器绘制圆形自定义填充和边框颜色

    我将 Three js 与 WebGLRenderer 一起使用 我试图找出或查看如何使用 CircleGeometry 绘制圆圈的示例 并能够从顶点或片段着色器控制其填充和边框颜色 如果不使用图像作为纹理 这是否可能 抱歉 如果这真的很简
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 更改javascript nodejs中所有页面的href url

    我已经实现了具有多种语言下拉菜单的引导导航栏 当我选择语言时 它将翻译页面 如何更改其他页面的 url 和按钮文本 当我选择french 将所有网址更改为 fr about and fr contact 如何使用 JavaScript 进行
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include

随机推荐