我在细分市场工作。使用 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!