我在 Segment 工作。搭售匿名的使用 Segment 跨客户端和服务器端调用的活动很棘手,原因如下:
Segment 的服务器端库是完全无状态的,并且对请求上下文来说是幼稚的,因此您需要获取相关信息并将其传递到对 Segment 的调用中。
此外,在客户端上,您集成的捆绑的第三方工具将自行管理各自的匿名/会话标识符。
一些服务器端集成有一个特殊的context
字段作为其匿名标识符(如 GA),但大多数都没有,因此您需要编写一个包装器来抽象下面的示例情况(使用不同的值发送多个调用)anonymousId
s 同时指定哪个应该发送到哪个服务)。
注: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!