· HARUBOUYA · analytics · 13 min read
サイズレコメンドのタグをGTMから入れる
外部のサイズ提案ツールを入れるとき、GTMから3種類のタグを配信します。何を送るか、複数商品を買われたときの書き方、そしてUA時代のeec.purchaseだけでは足りない項目を整理します。

服や靴のECで「サイズが分からないから買わない」は大きな離脱理由です。そこで外部のサイズ提案ツールを入れる場面が出てきます。
導入自体はタグを貼るだけです。ただし購入完了ページのタグだけは手間がかかります。1回の注文で複数の商品が買われるため、そのまま値を入れても成立しません。ここを中心に書きます。
どのようなタグを入れるか
貼るのは3種類です。すべてGTMの「カスタムHTML」タグとして登録します。
| # | タグ | 設置場所 | 発火タイミング | 役割 |
|---|---|---|---|---|
| ① | 共通タグ | 全ページの <head> | 全ページ表示時 | 「このユーザーは誰か」を伝えます |
| ② | 商品詳細タグ | 商品ページの <body> | 商品詳細ページ表示時 | 「どの商品を見たか」を伝えます |
| ③ | 購入完了タグ | 購入完了ページの <body> | 購入完了時 | 「何を・いくらで・どのサイズで買ったか」を伝えます |
①がユーザーの識別、②がレコメンドの材料、③が効果測定です。③がないと、入れた意味を数字で示せません。
① 共通タグで送る値
| 項目 | 中身 | 必須 |
|---|---|---|
| クライアントID | ツール側が発行する固定値 | 必須 |
| ユーザーID | ログイン中の会員ID。未ログインなら空 | 必須 |
| 会員ランク | ゴールド・シルバーなど | 任意 |
② 商品詳細タグで送る値
| 項目 | 中身 | 必須 |
|---|---|---|
| 商品ID | 表示している商品の品番 | 必須 |
③ 購入完了タグで送る値
| 項目 | 中身 | 必須 |
|---|---|---|
| クライアントID | 固定値 | 必須 |
| 注文ID | 注文番号 | 必須 |
| 購入点数 | 商品ごとの個数 | 必須 |
| 商品ID | 購入した商品の品番 | 必須 |
| 売価 | 1商品あたりの金額(整数) | 必須 |
| サイズ | 購入したサイズ(S/M/Lなど) | 必須 |
| 会員ID | ログイン中の会員ID | 必須 |
複数商品を買われたときの書き方
ここが本題です。1回の注文で4点買われた場合、購入点数・商品ID・売価・サイズの4項目は、区切り文字でつないで1つの値にします。
区切り文字は # を使う仕様が多いです。ただし # はURLの中で特別な意味を持つため、URLエンコードして %23 に変換して書きます。
例
次の注文があったとします。
| 商品ID | 購入数 | 価格 | サイズ |
|---|---|---|---|
| A1 | 1 | 1,000円 | S |
| B1 | 1 | 2,000円 | S |
| B1 | 2 | 2,000円 | M |
| C1 | 1 | 3,000円 | L |
タグに入れる値はこうなります。
注文ID = "9999999"
購入点数 = "1%231%232%231"
商品ID = "A1%23B1%23B1%23C1"
売価 = "1000%232000%232000%233000"
サイズ = "S%23S%23M%23L"絶対にやってはいけない書き方
4項目で順番がずれると、どの商品がいくらでどのサイズだったかが対応しなくなります。
商品ID = "A1%23B1%23B1%23C1" ← A1, B1, B1, C1 の順
売価 = "3000%232000%232000%231000" ← C1 の値段から始まっている値としては正しく入るため、エラーにならないまま間違ったデータがたまります。これが最悪の形です。
実装の考え方
購入商品の配列を、1つのループで順に取り出し、4つの入れ物へ同時に入れていきます。
var sep = '%23';
var nums = [], ids = [], prices = [], sizes = [];
for (var i = 0; i < products.length; i++) {
nums.push(encodeURIComponent(products[i].quantity));
ids.push(encodeURIComponent(products[i].id));
prices.push(encodeURIComponent(Math.floor(Number(products[i].price))));
sizes.push(encodeURIComponent(products[i].variant || ''));
}4項目を別々のループで作らないでください。1つのループで同時に入れていけば、順番は構造上ずれません。
入れるときの注意点
| 注意点 | 内容 |
|---|---|
| 売価は整数にします | 税込・税抜を先に決めます。小数が入る場合は切り捨てます |
| 未ログインは空文字にします | undefined や null がそのまま文字列で入ると、ツール側で不正値になります |
| ゲスト購入のトリガーを忘れません | 会員購入とゲスト購入でページや発火条件が分かれている場合、両方をトリガーに入れます |
| サイズが空の商品があります | サイズの概念がない商品(雑貨など)では空になります。空文字で桁数を揃えます |
| タグの読み込み順 | 値を組み立てるスクリプトが、ツール側のスクリプトより先に動く必要があります |
| フォルダに分けて登録します | タグが増えるため、GTMの「フォルダ」機能でまとめておきます |
確認手順
- GTMの管理画面で右上の「プレビュー」を押します
- 表示された入力欄にサイトのURLを入れて「Connect」を押します
- 別ウィンドウでサイトが開くので、実際に2種類以上の商品をカートに入れて購入します
- プレビュー画面の左側で「Purchase」に相当するイベントを選びます
- 「Tags Fired」に購入完了タグが入っていることを確認します
- タグをクリックし、送信された値を開いて、4項目の並び順が一致しているかを目視します
1商品だけのテストで終わらせません。並び順の問題は、2商品以上でないと再現しません。
UA時代の eec.purchase では取得できない内容
GTM上で購入データを取るとき、UA(ユニバーサルアナリティクス)時代の拡張eコマースで作った eec.purchase のデータ層をそのまま流用しようとすることが多いです。
ここに含まれるのは、おおむね次の範囲です。
| 含まれるもの | 備考 |
|---|---|
| 注文ID | actionField の中 |
| 商品ID・商品名 | 商品ごと |
| 価格・個数 | 商品ごと |
| バリエーション | variant。中身は実装次第 |
| カテゴリ・ブランド | 商品ごと |
一方、含まれないか、当てにできないものが次の通りです。
| 項目 | なぜ足りないか | どうするか |
|---|---|---|
| 会員ID | 購入イベントの中には入っていません | ログイン情報を持つ別の変数を用意します |
| 会員ランク | 同上。そもそもUAの拡張eコマースの範囲外 | サイト側でデータ層に出してもらいます |
| サイズ | variant に入る保証がありません。色とサイズが連結されていたり、空だったりします | 実機で中身を確認します。入っていなければサイト側に追加を依頼します |
| 税・送料の内訳 | actionField に合計しかないことが多いです | 送る値の定義(税込か税抜か)を先に決めます |
| ゲスト購入の区別 | 会員IDが空、としか分かりません | 購入完了ページのURLやトリガーで判別します |
特にサイズに注意します。variant という項目名があるだけで、そこにサイズが入っているとは限りません。「色/サイズ」が1つの文字列で入っている実装、空のままの実装、どちらもよくあります。
確認の順番は次の通りです。
- GTMのプレビューで実際に購入し、
variantの中身を目で見ます - 想定と違えば、サイト側の開発担当にデータ層への追加を依頼します
- 追加されるまでは、その項目を空で送るか、公開自体を待つかを決めます
中身を見ないまま設計を進めません。項目名だけを信じて実装すると、公開後に空データがたまります。
失敗例
| 失敗 | 何が起きるか | 代わりにやること |
|---|---|---|
| 4項目を別々のループで組み立てます | 条件分岐が入った瞬間に順番がずれます | 1つのループで同時に入れます |
| 区切り文字をエンコードしません | URLの一部として解釈され、値が切れます | %23 に変換して書きます |
| 1商品だけで動作確認を終えます | 複数商品の不具合に気づきません | 2商品以上、同一商品の別サイズを含めてテストします |
variant にサイズが入る前提で作ります | 公開後に空データがたまります | 実機で中身を確認してから設計します |
| 未確定の項目を仮の値で埋めて公開します | 誤ったデータで効果測定してしまいます | 確定するまで空で送ります。もしくは公開を待ちます |
| 税込・税抜を決めずに送ります | 後からレポートの数字が合いません | 送る値の定義を1枚の表にして合意しておきます |
まとめ
- 貼るタグは3種類です。購入完了タグがないと効果を数字で示せません
- 複数商品は区切り文字で連結し、
%23にエンコードします - 4項目の並び順を揃えます。ずれてもエラーにならないため気づけません
- 組み立ては1つのループで行います。別々に作ると必ずずれます
- UA時代の
eec.purchaseには、会員ID・会員ランクが入っていません。サイズも当てにできません - 確認は必ず2商品以上で行います。1商品では並び順の問題が再現しません
先にやることは実装ではなく、送る項目の定義を1枚の表にまとめ、サイト側と合意することです。値の意味がずれたままでは、正しく動いても数字が合いません。
参考になったら、いいねを押してください。





