Shopping Tracker
Shopping Trackerは株式会社ニューロープが提供する、ECサイトや#CBKシステムファミリーと連携しているメディア上で利用可能なトラッキングツールです。
はじめに
Shopping Trackerはトラッキング対象となるWebサイト上でhttps://cubki.jp/shopping_tracker.js
を読み込むことでご利用可能です。
読み込んだスクリプトは弊社サーバーと通信してユーザーの行動を記録します。データ送信に利用するAPIについての詳細はAPI referenceを参照ください。
Assistant ID
Assistant IDは#CBKシステムファミリーの一つである#CBK assistantのご利用にあたってアカウントごとに発行されるIDです。
トラッキングを開始するにはこのAssistant IDが必要になります。 Assistant IDは#CBK assistant運営元(株式会社ニューロープ)にて発行する必要がございますので、事前にお問い合わせください。
ネームスペース
Shopping Trackerを利用するには、スクリプト内で任意のネームスペースを指定する必要があります。ネームスペースとは、収集するイベントデータの区別に利用する識別子で、利用用途ごとに異なる値を指定することを推奨しています。
#CBK assistantでは複数のリコメンドサービスを提供しています。これらを同一のECに複数導入した場合などに、それぞれを区別してトラッキングすることを主な目的としています。
例えば、類似アイテムプラグインのトラッキング用途では'media-plugin'
が、画像検索機能をご利用の場合は'img-search'
がデフォルトで指定されます。
このネームスペースは、#CBK assistantのレポーティング画面でレポーティング対象を指定するために利用されます。
なお、リコメンドサービスを導入せず、データ分析などを目的としてトラッキングする場合、このネームスペースは利用者側で別途利用することはありません。
この場合でも、将来リコメンドを導入することも想定されるため、 'user-tracking'
など目的を明示した文字列を設定することが推奨されます。
ネームスペースは複数指定可能です。複数ネームスペースを指定してイベント送信を行った場合、各ネームスペースごとにイベントを送信します。 「ネームスペースは複数指定したいが、一部のイベントは特定のネームスペースに対してのみ送信したい」といった場合は後述のスコープを参照してください。
スクリプト
以下のコードを全てのページのHTML内に追加し、該当スクリプトをロードしてください。
<script src='https://cubki.jp/shopping_tracker.js' defer async></script>
スクリプトがロードされるとJavaScript環境にwindow.CBK.tracker
オブジェクトが定義され、これを利用してトラッキングを行います。
初期化
トラッキングを開始する前に、CBK.tracker
の設定を行う必要があります。
初回イベント送信前に、以下の初期化メソッドを必ず実行してください。 初期化を行わずイベント送信を行うとエラーが発生します。
CBK.tracker.init(<assistantId>, <namespace>[, <options>])
assistantId
: 文字列- ご利用になるアカウントのAssistant ID。
namespace
: 文字列または文字列の配列 (最大64文字)- 詳細についてはネームスペースをご参照ください。
options
: 以下のプロパティを持つオブジェクトuserId
(非必須): 文字列- ユーザを特定するIDが存在する場合にご指定ください。
初期化処理はページ遷移する度に必要になります。実際の使用例に関してはExamplesを参照してください。
また、初期化処理はwindow.CBK.tracker
の定義後に呼び出される必要があり、そのためのイベントフックを定義しています。
詳細については後述の初期化フックをご参照ください。
イベントフック
初期化フック
初期化フックはスクリプトの初期化を行うための適切なタイミングで呼ばれるイベントフックで、特定の変数名(window.CBK.init
)でJavaScript関数を定義しておくことでご利用いただけます。
また、このイベントフック内で初期化処理を実行後、更にイベント送信を行うことも可能です。 ページロード時にイベント送信を行う必要があるケースでご利用ください。
window.CBK = Object.assign({}, window.CBK, {
init: function(CBK) {
// この関数スコープ内では `CBK.tracker`は定義済み
// `window.CBK.init`が実行された後は `window.CBK.tracker`が定義済みの状態になる
// 初期化
CBK.tracker.init(...);
// 初期化後、イベント送信
CBK.tracker.send([CBK.tracker.event(...)]);
}
});
初期化フックを確実に実行するために、window.CBK.init
関数の定義はスクリプトロード前に行ってください。
イベント
イベント種別
impression
- 商品へのリンクが商品画像のサムネイル等の付加情報と共にユーザーに提示されたタイミングで送信するイベント
view_stock
- 商品へのリンクがクリックされた際、またはその商品の詳細ページが表示されたタイミングで送信するイベント
add_to_cart
- 商品がカートに追加されたタイミングで送信するイベント
order
- 注文が確定したタイミングで送信するイベント
イベントオブジェクトの作成
スクリプトロード後、以下のようにイベント(Event
)オブジェクトを作成することができます。
CBK.tracker.event({
type: <type>, productId: <productId>, productGroupId: <productGroupId>, price: <price>, orderId: <orderId>, orderGroupId: <orderGroupId>,
campaigns: <campaigns>, source: <source>, prevLocation: <prevLocation>, imageUrls: <imageUrls>, variation: <variation>,
})
type
: 文字列- イベント種別を指定してください。
productId
: 文字列- 商品のSKUごとに割り当てられるID
view_stock
送信時、productId
を一意に決めることが難しい場合は代わりにproductGroupId
を指定してください。
productGroupId
: 文字列- 色違いやサイズ違いといった商品バリエーションをグループ化するための識別子を指定してください。
price
: 数値- 商品の実売価格
orderId
: 文字列- 一回の商品購入トランザクションに含まれる、各商品に個別に割り当てられる注文ID
orderGroupId
: 文字列- 各商品購入トランザクションに個別に割り当てられるID
campaigns
: 文字列の配列- セールやクーポン利用など、ユーザーに対して行ったキャンペーン施策を識別するための値を指定してください。
source
: 文字列- 検索流入、広告流入、メルマガなどユーザーの流入元を識別するための値を指定してください。
prevLocation
: 文字列- リファラ
- ブラウザの
document.referrer
の値がデフォルトで適用されるため、基本的に指定する必要はありません。
imageUrls
: 文字列の配列- イベントが発生した画面でユーザーが閲覧した、商品画像のURLを指定してください。
- 1つの商品詳細ページに複数のバリエーション(色や柄など)の商品が掲載されている場合、ユーザーがどのバリエーションのどの画像を見て、検討し、カート追加したのか(あるいはしなかったのか)を取得・分析する用途で利用します。
variation
: 文字列- モバイル向けレイアウト、PC向けレイアウトなど、ユーザーが閲覧しているレイアウトを識別するための値を指定してください。
type | productId | productGroupId | price | orderId | orderGroupId | userId | campaigns | source | prevLocation | imageUrls | variation |
---|---|---|---|---|---|---|---|---|---|---|---|
impression |
非必須 | 非必須 | 非必須 | 使用不可 | 使用不可 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 |
view_stock |
productGroupIdが空の場合は必須 | productIdが空の場合は必須 | 非必須 | 使用不可 | 使用不可 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 |
add_to_cart |
必須 | 非必須 | 非必須 | 使用不可 | 使用不可 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 |
order |
必須 | 非必須 | 必須 | 必須 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 | 非必須 |
イベント送信(マニュアル)
CBK.tracker.send(<events>[, <callback>])
events
: イベントオブジェクトの配列- イベントオブジェクトの作成方法についてはイベントオブジェクトの作成をご参照ください。
callback
: 関数- イベント送信後に呼び出されるコールバック関数
- エラー情報を引数に取ります。(例:
function(error) { ... }
)- エラーの発生がない場合は
null
が、そうでない場合はエラーオブジェクトが引数として渡されます。
- エラーの発生がない場合は
また、関数の呼び出し時にcallback
関数を渡されなかった場合はPromiseオブジェクトが返却されるため、コールバック関数の代わりにこちらを使ってイベント送信後の処理を続行することも可能です。
イベント送信(自動)
リンクのクリック時やフォーム送信時にイベントを送信する場合はCBK.tracker.track
メソッドを利用することができます。
CBK.tracker.track(<target>, <event>)
target
: DOMオブジェクト- クリックやフォーム送信などのイベントの監視を行う対象のDOM要素
<a>
要素と<form>
要素をサポートしています。
event
: イベントオブジェクト- 対象のイベント発火時に送信するイベントオブジェクト
スコープ
ネームスペースを複数指定して初期化を行っているが、特定のネームスペースに限定してイベントを送信したい場合は、以下のように scope
メソッドを使用してください。
CBK.tracker.scope(<namespace>).send([event1, event2])
namespace
: 文字列- イベント送信を行うネームスペース
Examples
impression
イベント
<script>
window.CBK = Object.assign({}, window.CBK, { init: function(CBK) {
// Trackerの初期化
var assistantId = 7;
var namespaces = ['user-tracking', 'demand-forecast'];
CBK.tracker.init(assistantId, namespaces, { userId: window.userId });
// `items`変数が存在する状況を想定
if (!items) { return; }
var events = [];
items.forEach(function (item) {
for (var i = 0; i < item.length; i++) {
events.push(CBK.tracker.event({
type: 'impression',
productId: item.productId
}));
}
});
CBK.tracker.send(events);
} });
</script>
<script src='https://cubki.jp/shopping_tracker.js' defer async></script>
view_stock
イベント
<script>
window.CBK = Object.assign({}, window.CBK, { init: function(CBK) {
// Trackerの初期化
var assistantId = 7;
var namespaces = ['user-tracking', 'demand-forecast'];
CBK.tracker.init(assistantId, namespaces, { userId: window.userId });
// イベント送信
var target = document.getElementById('some-id');
var productId = target.getAttribute('some-product-id');
var price = parseInt(target.getAttribute('price'));
if (price <= 0) { price = null; }
var source = 'mail_magazine';
var campaigns = ['mail_magazine_coupon', 'vip_user_discount'];
var imageUrls = Array.prototype.slice.call(document.querySelectorAll('some-image-class'));
var variation = 'mobile';
var eventAttrs = {
type: 'view_stock', productId: productId, price: price,
source: source, campaigns: campaigns, imageUrls: imageUrls,
variation: variation,
};
CBK.tracker.scope('user-tracking').send([CBK.tracker.event(eventAttrs)]);
} });
</script>
<script src='https://cubki.jp/shopping_tracker.js' defer async></script>
add_to_cart
イベント
// `view_stock`送信後 (初期化完了後)、同一ページ内で「カートに入れる」のようなボタンが押された場合を想定
<script>
!function() {
var target = document.getElementById('some-id');
var productId = target.getAttribute('some-product-id');
var price = parseInt(target.getAttribute('price'));
if (price <= 0) { price = null; }
var source = 'mail_magazine';
var campaigns = ['mail_magazine_coupon'];
var imageUrls = Array.prototype.slice.call(document.querySelectorAll('some-image-class'));
var variation = 'pc';
var eventAttrs = {
type: 'add_to_cart', productId: productId, price: price,
source: source, campaigns: campaigns, imageUrls: imageUrls,
variation: variation,
};
CBK.tracker.send([CBK.tracker.event(eventAttrs)]);
}()
</script>
order
イベント
<script>
window.CBK = Object.assign({}, window.CBK, { init: function(CBK) {
var assistantId = 7;
var namespaces = ['media-plugin', 'demand-forecast'];
CBK.tracker.init(assistantId, namespaces, { userId: window.userId });
if (!orderInfo) { return; }
var events = [];
orderInfo.items.forEach(function(item) {
for (var i = 0; i < item.length; i++) {
events.push(CBK.tracker.event({
type: 'order',
orderId: orderInfo.orderId + '-' + (items.length + 1),
orderGroupId: orderInfo.orderId,
productId: item.productId,
productGroupId: item.productId.slice(0, 6),
price: parseInt(item.price)
}));
}
});
CBK.tracker.send(events);
}});
</script>
<script src='https://cubki.jp/shopping_tracker.js' defer async></script>