注意:不要在線上頁面直接切換不同專案的數據接收網址,會導致首日首次,id 關聯異常。建議在線下測試時數據傳到測試專案,沒問題的話,線上採集的數據直接傳往正式專案。

新增用戶

一般我們對新增用戶的定義是第一次使用產品的用戶,或者是一些關鍵行為(比如註冊、購買)的首次觸發。在神策分析中,可以結合 是否首日訪問( $is_first_day ) 屬性來得到每天訪問的新增用戶,以及結合 是否首次觸發事件( $is_first_time )屬性來得到首次觸發關鍵事件的用戶。

新增用戶指標設定

Web 端新增用戶定義:當日的獨立訪客中,歷史上首日訪問網站的訪客定義為新用戶。

App 端新增用戶定義:當日啟動 App 的用戶中,歷史上首日啟動 App 的用戶為新用戶數。

小程序端新增用戶定義:當日啟動小程序的用戶中,歷史上首日啟動小程序的用戶為新用戶數。

用戶首次訪問時間分佈:用戶第一次使用 Web/App/小程序 的時間分佈

首次觸發事件定義:第一次觸發 APP 啟動/Web 瀏覽/小程序啟動的新用戶

新增用戶標記採集

新用戶的標記主要是在用戶端完成,神策 SDK 預設會採集的區分新增用戶的欄位有

前端事件公共屬性:是否首日訪問($is_first_day)

欄位名稱型別說明JS SDK 自動採集iOS SDK 自動採集Android SDK 自動採集小程序 SDK 自動採集伺服器端 SDK 自動採集
$is_first_day布林值是否首日訪問YYYYN

實現邏輯:

1. Web 端:用戶第一次訪問埋入神策 SDK 頁面的當天(即第一天),JS SDK 會在網頁的 cookie 中設定一個首日訪問的標記,並設定第一天 24 點之前,該標記記為首日為 true,即第一天觸發的網頁端所有事件中,$is_first_day=true。第一天之後,該標記則為 首日為 false,即第一天之後觸發的網頁端所有事件中,​$is_first_day= false;

2. 小程序端:用戶第一天訪問埋入神策 SDK 的頁面時,小程序 SDK 會在 storage 快取中建立一個首日為 true 的標記,並且設定第一天 24 點之前,該標記均為 true。即第一天觸發的小程序端所有事件中,$is_first_day=true。第一天之後,該標記則為 首日為 false,即第一天之後觸發的小程序端所有事件中,​$is_first_day= false;

3. APP 端:用戶安裝 App 後,第一次打開埋入神策 SDK 的 App 的當天,Android/iOS SDK 會在手機本地快取內,建立一個首日為 true 的標記,並且第一天 24 點之前,該標記均為 true。即第一天觸發的 APP 端所有事件中,$is_first_day=true。第一天之後,該標記則為 首日為 false,即第一天之後觸發的 APP 端所有事件中,$is_first_day= false;

前端事件屬性:是否首次觸發事件($is_first_time)

欄位名稱型別說明JS SDK 自動採集iOS SDK 自動採集Android SDK 自動採集小程序 SDK 自動採集伺服器端 SDK 自動採集
$is_first_time布林值

是否首次觸發事件

YYYYN

實現邏輯:

本地針對 $pageview/$AppStart/$MPLaunch 事件儲存一個標記。標記預設是 no,首次為把 no 修改為 yes,之後都是 no。

用戶屬性:首次訪問時間($first_visit_time)

欄位名稱型別說明JS SDK 自動採集iOS SDK 自動採集Android SDK 自動採集小程序 SDK 自動採集伺服器端 SDK 自動採集
$first_visit_timeDatetime

首次訪問時間

YYYYN

實現邏輯:

1. Web 端、小程序端:集成神策 Js、MiniProgram SDK 後,設定 autotrack 開啟全埋點,SDK 會預設在用戶第一次瀏覽頁面/啟動小程序時,呼叫 profile_set_once 介面給用戶設定首次訪問時間屬性。

2. APP 端:集成神策 iOS、Android SDK 後呼叫 trackInstallation 介面,呼叫此介面之後會在用戶首次使用 app 的時候設定首次訪問時間屬性。如果沒有呼叫 trackInstallation 介面,不會主動設定首日訪問時間。 

首次首日標記修正

如果用戶的 App 快取被清理或者用戶移除重裝後,如果匿名 ID 不變的話都會造成 App 端目前的⾸日⾸次判斷邏輯失效,雖然是⽼用戶,但是⾸日首次屬性卻為 true。為了避免此種情況造成的新增用戶不準的問題,神策伺服器端增加了⾸⽇首次的修正功能。

首日訪問在伺服器端的修正

從神策分析 1.8 版開始,所有的單機版用戶和叢集版用戶已經預設開啟了“是否首日訪問”標記在伺服器端的修正,即以一個專用的數據庫記錄用戶首日訪問的時間。當上報的事件包含 $is_first_day (是否首日訪問)屬性並且取值為 true 時,伺服器端匯入這條事件時會先在數據庫中以觸發的 Distinct Id 對應的神策內部 Id 進行查詢,若沒有查到,那麼在數據庫中記錄該 Distinct Id 首日訪問的時間;如果可以查到那麼判斷本次事件觸發時間與之前記錄的是否是同一天,若不是同一天(無論是之前的時間還是之後的時間)那麼修改 $is_first_day 為 false。

這在一定程度上解決了 App 移除重裝被算作新用戶的問題,例如 App 重裝後裝置裡存的 "首日標記"被刪除,那麼用戶端向伺服器端上報時 $is_first_day 的值為 true,伺服器端可以根據數據庫中的記錄判斷該值是否應該被修正為 false 。

在判斷新增用戶時,神策是選擇【App 啟動是否⾸日為真】判斷的。如果客戶在接入神策之前有一批歷史用戶,正常接入神策後,由於神策沒有保存這些歷史用戶的首日訪問時間,會將這批老用戶標記為新增用戶。如果想將這批歷史⽤戶正確標記為老用戶,需要在他們的數據上報之前就將他們的首日訪問時間匯入到該數據庫。匯入步驟如下:

1. 產生一個文件,每行為一個用戶的 Distinct Id 和首日訪問時間(以 unix 時間戳表示):

6D92078A-8246-4BA4-AE5B-76104861E7DC 1513577063
5D3169E2-16BC-316C-12AB-1E2EC1A79E2B 1512057600

注意:

  • 該文件上傳之後,只對上傳日期之後入庫的數據有效。早於首日訪問時間文件上傳時間的入庫的數據無法修改;
  • 伺服器端會根據上傳的首日訪問時間,對即時匯入的事件屬性 $is_first_day(是否首日訪問)取值為 true 修正,修正規則是僅對 $is_first_day 為 true 的屬性值進行修復,且只要匯入的事件的 time 和伺服器端記錄的首次訪問時間不是同一天就會修正為 false(包含 time 早於伺服器端的時間也會修正 )。不會修復 $is_first_day 為 false 的屬性值。
  • 伺服器端會根據上傳的首日訪問時間,修正即時匯入的用戶屬性 $first_visit_time(首次訪問時間),修正 $first_visit_time 為伺服器端上傳的首日訪問時間 。
  • 伺服器端上傳的首日訪問時間,不會 對 $is_first_time 的屬性進行修正。目前不支援提前在伺服器端上傳首次訪問時間,對 ​$is_first_time = true 的屬性進行修正。只有在匯入過 ​$is_first_time = true 事件數據之後,伺服器端才能記錄該事件的首次訪問時間。 

2. 如果文件中的 Distinct Id 是裝置 ID(參考標識用戶),繼續下一步。若 Distinct Id 是登入 ID,則需要透過 SDK 或匯入工具對每個 ID 匯入一條 profile_set,設定 is_login_id 為 true,properties 可以為空。例如 Java SDK 可以呼叫:

sensorsAnalytics.profileSet("123456789", true, Collections.emptyMap());
JAVA

3. 登入神策服務器,使用 sa_cluster 用戶執行:

java -cp '/home/sa_cluster/sa/extractor/lib/extractor-1.0-SNAPSHOT.jar:/home/sa_cluster/sa/commonjars/*' com.sensorsdata.analytics.extractor.utils.ImportFirstTimeUtils --project 匯入的專案名 --file 數據文件路徑 --is_login_id distinct_id 是否是登入 ID,若是則為 yes,否則為 no
CODE
java -cp '/home/sa_cluster/sp/extractor/lib/extractor-1.0-SNAPSHOT.jar:/home/sa_cluster/sp/commonjars/*' com.sensorsdata.analytics.extractor.utils.ImportFirstTimeUtils --project 匯入的專案名 --file 數據文件路徑 --is_login_id distinct_id 是否是登入 ID,若是則為 yes,否則為 no
CODE

首次觸發事件在伺服器端的修正

目前神策預製採集的“是否首次觸發事件” 只針對 $pageview/$AppStart/$MPLaunch 事件才會採集,並不是所有事件都會有這個屬性。如果需要對自定義事件增加 $is_first_time 屬性,可參考下面的新增用戶及首日首次標記#自定義事件設定首次觸發事件屬性示例

在一些分析場景中,我們希望可以透過一個事件屬性判斷該事件(自定義事件,前端和後端事件皆可)是否是某個用戶首次觸發,例如 App 啟動中的這個屬性可以判斷用戶是否首次啟動 App,加入購物車事件中的這個屬性可以判斷用戶是否首次將商品加入購物車。這就需要我們針對“啟動”,“購物”事件來增加 $is_first_time 屬性來判斷是否是觸發關鍵事件的新用戶。

匯入時增加欄位

在匯入事件時,若認為這次事件 可能 是該用戶(distinct_id)首次觸發,設定 $is_first_time 的值為 true 即可。其原理是神策後端匯入模塊在數據匯入過程中會在遇到 $is_first_time 的值為 true 時判斷和 修正 該值,具體來說,若遇到 $is_first_time 的值為 true 的事件數據,神策後端會在數據庫查詢該用戶在該事件是否有首次訪問記錄,若已記錄的觸發時間與本次不同,那麼將修改 $is_first_time 的值為 false,否則將記錄該用戶首次觸發事件時間並保持 $is_first_time 值為 true。

自定義事件設定首次觸發事件屬性示例

以 Java SDK 為例:

// 首次觸發"BuyGold"事件標記"$is_first_time"為 true,最終匯入值為 true
properties.put("$is_first_time", true);
sa.track("user1", false, "BuyGold", properties);
 
// do something else ...
 
// 再次觸發"BuyGold"事件標記"$is_first_time"為 true,最終匯入值為 false
properties.put("$is_first_time", true);
sa.track("user1", false, "BuyGold", properties);
CODE

雖然兩次都設定了 $is_first_time 為 true,但實際匯入後僅第一次匯入的值為 true。

注意事項

  1. 僅當 $is_first_time 值為 true 時會觸發上述邏輯;
  2. 若之前匯入數據沒有設定過 $is_first_time 值為 true,那麼第一次出現時才會記錄首次觸發時間,並且以後以這次時間判斷;
  3. 該邏輯裡判斷是否首次觸發是以事件觸發時間(精確到毫秒)是否與數據庫裡的值相等作為條件,若兩次觸發事件時間相同且都設定了 $is_first_time 值為 true 將不會進行修正;一般情況下不會發生這種情況,例如 App 連續發送兩次事件,若第二次已經明確知道不是首次時,不應該設定 $is_first_time 值為 true;
  4. 該邏輯受數據匯入順序影響,例如先匯入 6 日數據並標記了首次,再匯入 3 日的數據並標記了首次,最終 6 日的數據首次被標記為 true,而 3 日的將被標記為 false;
  5. 本功能在 1.8 及以後的版本中支援,且建構時間(可在後端的關於頁面查看)在 2017-11-26 之後,否則需要先進行升級。

常見問題

同一用戶同一天的事件中首日($is_first_day)有真有假

可能是時區差異造成的,例如用戶在 A 地的的用戶端時間比中國時間晚 12 個小時,客戶伺服器的時間是中國時間。當用戶在 A 地用戶端時間為 2019-08-02 23:00 時觸發事件,對應的 $is_first_day 屬性為 true,記錄該事件的時間是 2019-08-02 11:00; 而當用戶在 A 地用戶端時間為 2019-08-03 02:00 時觸發事件,對應的 $is_first_day 屬性為 false,記錄該事件的時間是 2019-08-02 14:00。在神策分析查詢數據時,就會出現 20219-08-02 這一天同一用戶觸發的事件中 $is_first_day 有真有假的情況。