9

我正致力于在现有的 .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 和track 仍然可以正常工作而无需识别。

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

4

1 回答 1

12

我在细分市场工作。使用 Segment 在客户端和服务器端调用之间绑定匿名活动很棘手,原因如下:

  • Segment 的服务器端库是完全无状态的,并且对请求上下文是幼稚的,因此您可以获取相关信息并在对 Segment 的调用中传递它。

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

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

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

但是,在您没有事实上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 或类似的anonymousId)还是(最好是)客户端。如果您想混合搭配,最好为使用 userId 的登录用户保留服务器端跟踪。

此外,不要犹豫直接联系支持@friends@segment.com!

于 2015-05-21T19:55:25.060 回答