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

Javascript 如何将Segment.io服务器和客户端事件连接到同一匿名用户?,javascript,c#,asp.net-mvc,analytics,segment-io,Javascript,C#,Asp.net Mvc,Analytics,Segment Io,我正致力于在现有的.NET电子商务应用程序上实现细分分析中心,以便与Mixpanel以及其他一些服务一起使用。我了解Analytics.js和Segment.NET API的API文档,但我不知道如何将匿名事件连接到同一用户 例如,假设我正在跟踪某个项目已添加到购物车。我在服务器端执行此操作,因为有多个页面可以将项目添加到购物车,但只有一个控制器。用户无需登录即可完成此操作,我们已经为他们分配了客户ID,因此我的代码如下所示: Analytics.Client.Track(cartItem.Cu

我正致力于在现有的.NET电子商务应用程序上实现细分分析中心,以便与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.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。 我们会自动为他们分配一个匿名ID,所以只需调用页面即可 而且,在没有识别的情况下,跟踪仍然可以正常工作

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

我在Segment工作。将客户端和服务器端调用中的匿名活动与Segment绑定起来很棘手,原因如下:

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

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

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

注意:
customerId
方法将起作用,前提是即使在购买后,该方法仍将保持其唯一标识符,因此您可以始终将其用作
用户ID
。但是,如果您打算将其用作中间伪匿名标识符,那么值得记住的是,并非所有工具都能够对多个ID进行别名,因此如果采用这种方法,您可能无法在所有工具中保持连贯的用户配置文件

但是,如果你没有一个事实上的
用户ID
(我想其他人也会遇到这个问题),那么有效地实现这一点实际上是你在使用哪些工具的问题;对于它们中的每一个,您都需要从请求中获取它们各自的匿名标识符(它们通常在cookie中可用),并将其附加到服务器端调用段中各自的字段中

如果您使用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);
str-gaClientId、kmAnonId、mpAnonId;
HttpCookieCollection cookies=Request.cookies;
//GA clientId存储为u GA cookie的一部分
如果(cookies[“\u ga”!=null)
{
字符串gaCookie=Request.Cookies[“_-ga”];
string[]parts=gaCookie.Split('.'))
gaClientId=Strint.Format(“{0}.{1}”,部分[2],部分[3])
}
//阿诺尼德公里
如果(cookies[“km_ai”!=null)
{
kmAnonId=Request.Cookies[“km_ai”];
}
//为简洁起见,我将省略检索mixpanel differentied
//从他们的饼干里。您将需要序列化的值
//将“mp_uumixpanel”转换为JSON,并获取'distinct_id'值
//请看这里:http://marcmezzacca.com/integrating-mixpanel-with-asp-net-mvc-server-side-and-javascript-client-side/
Analytics.Model.Options kmCallOptions=新选项()
.SetIntegration(“全部”,false)
.SetIntegration(“Kissmetrics”,真)
.SetIntegration(“谷歌分析”,真实)
.SetContext(新上下文(){
{“ip”,GetUserIP()},
{“谷歌分析”,新词典(){
{“clientId”,gaClientId}
} 
},
{“匿名ID”,kmAnonId}
}
});
Analytics.Model.Options mpCallOptions=新选项()
.SetIntegration(“全部”,false)
.SetIntegration(“Mixpanel”,真)
.SetContext(新上下文(){
{“ip”,GetUserIP()},
},
{“匿名ID”,mpAnonId}
}
});
//发送至KM和GA
Analytics.Client.Track(空,“添加的产品”,新属性(){
{“sku”,cartItem.sku},
{“数量”,数量}
},kmCallOptions);
//发送到Mixpanel
Analytics.Client.Track(空,“添加的产品”,新属性(){
{“sku”,cartItem.sku},
{“数量”,数量}
},mpc(期权);
一个简短的提示:Segment明确地打算解决这个头痛问题,并使实现这一点的过程更容易,但我们不想使API复杂化,以便为每个工具容纳多个匿名标识符,我们打算以完全不需要的方式解决这个问题。在此期间,为了避免复杂性,我们确实建议将所有匿名跟踪保留在一个位置,服务器端(使用sessionId或类似的匿名id)或(最好)客户端。如果您想要混合和匹配,服务器端跟踪最好保留给具有userId的登录用户


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

在进一步阅读文档之后,我认为我的第一个问题的答案可能是将CustomerId传递到前端,并在客户端进行别名调用,将匿名会话用户与用于服务器端段调用的CustomerId关联起来。这非常有帮助。谢谢你,克里斯!如果我有任何其他问题,我一定会联系你。这真的很有帮助!有没有关于这方面的战略更新