Как подключить события на сервере и клиенте Segment.io к одному и тому же анонимному пользователю?
Я работаю над созданием центра аналитики сегментов в существующем приложении электронной коммерции.NET для использования с Mixpanel, среди нескольких других сервисов. Я понимаю документы API в целом как для Analytics.js, так и для сегмента.NET API, но я не совсем понимаю, как подключать анонимные события к одному и тому же пользователю.
Например, скажем, я отслеживаю, что товар добавлен в корзину. Я делаю это на стороне сервера, так как есть несколько страниц, на которые можно добавить товары в корзину, но только один контроллер. Пользователь может сделать это без входа в систему, и мы уже присваиваем ему идентификатор клиента, поэтому мой код выглядит примерно так:
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:
Вам не нужно будет называть идентификацию для анонимных посетителей вашего сайта. Мы автоматически назначим им anonymousId, так что просто вызов страницы и отслеживание будут работать без идентификации.
Мой главный вопрос: как мне сказать Сегменту, что это был один и тот же (в настоящее время анонимный) пользователь, который выполнил оба эти действия? В качестве дополнительного вопроса, нужно ли мне вызывать функцию "Идентифицировать" перед вызовом на стороне сервера, даже если в "Отслеживаемом вызове" входит идентификатор пользователя?
1 ответ
Я работаю в сегменте. Связать анонимную активность между клиентскими и серверными вызовами с помощью сегмента сложно, по нескольким причинам:
Серверные библиотеки сегмента полностью не сохраняют состояния и наивны по отношению к контексту запроса, поэтому вам нужно собрать соответствующую информацию и передать ее при вызове сегмента.
Более того, на клиенте встроенные сторонние инструменты, с которыми вы интегрировали, сами будут управлять своими соответствующими анонимными идентификаторами / идентификаторами сеансов.
Некоторые серверные интеграции имеют специальные
context
поле для их анонимного идентификатора (например, GA), но большинство этого не делают, поэтому вам нужно написать обертку, которая абстрагируется от примера ниже (отправка нескольких вызовов с разнымиanonymousId
s, диктуя, какая служба должна быть отправлена).
Обратите внимание customerId
подход будет работать, если он останется их уникальным идентификатором даже после покупки, так что вы всегда можете использовать его в качестве userId
, Но стоит иметь в виду, если вы намереваетесь использовать его в качестве промежуточного псевдоанонимного идентификатора, что не все инструменты имеют возможность псевдонимов нескольких идентификаторов, поэтому вы не сможете сохранить сплоченные профили пользователей во всех ваших инструментах, если вы воспользуетесь этим. подход.
Но сделать это эффективно в том случае, если у вас нет де-факто userId
(что, я думаю, будет иметь место для других людей, которые приходят на этот вопрос), на самом деле вопрос о том, какие инструменты вы используете; для каждого из них вам нужно извлечь из запроса соответствующий анонимный идентификатор (они обычно доступны в файлах 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);
Одно быстрое замечание: Сегмент определенно намеревается преодолеть эту головную боль и облегчить выполнение этой задачи, но вместо того, чтобы усложнять API для размещения нескольких анонимных идентификаторов для каждого инструмента, мы намерены решить проблему таким образом, чтобы полностью устранить необходимость в этом. Тем временем, чтобы избежать сложности, мы действительно рекомендуем хранить все ваши анонимные отслеживания в одном месте, либо на стороне сервера (используя sessionId или подобное для anonymousId), либо (предпочтительно) на стороне клиента. Если вы хотите смешивать и сопоставлять, отслеживание на стороне сервера лучше всего резервировать для зарегистрированных пользователей с идентификатором пользователя.
Кроме того, не стесняйтесь обращаться в службу поддержки напрямую @ friends@segment.com!