GA4(Google Analytics 4)で特定のユーザーのトラフィックを除外するために、ログイン画面から取得したユーザーIDをフィルタに利用しようとしたところ、(redacted)という値に変換され、うまくフィルタリングできなかったというケースがあります。
これはGA4のプライバシー保護機能によるもので、特定の個人を識別できるデータが自動的にマスクされてしまう仕様になっています。この記事では、公式ヘルプの内容を基に、その原因と代替策について解説します。
具体的に何をしようとしたか
あるサービスで会員登録から発注までの機能を持つウェブサイトを運用していました。一般のお客様以外にも内部業者の方も利用していたのですが、一般のお客様と業者と切り分けて分析を行いたいということになりました。
切り分ける手段としてユーザーIDを取得しフィルタリングに使うことにしました。
通常であればUserIDを取得するGA4の機能を使うべきですが、導入しているカートのシステム上実装が難しかったため、代替手段としてログイン画面で入力されたユーザーIDをJavascriptを使って取得しGA4に送信することにしました。
実際、ユーザーIDをGA4に送信することには成功しましたが、前述のとおり、送信したデータが(redacted)という値に変換された状態でGA4に集計されたためフィルタとしては利用できませんでした。
GA4でユーザーIDが「(redacted)」に変換される理由
Googleの公式ヘルプ(https://support.google.com/analytics/answer/13544947?hl=ja)によると、GA4では「個人を特定できる情報(PII: Personally Identifiable Information)」が送信されることを禁止しています。
具体的には、以下のようなデータはGA4によって自動的にマスク(redact)され、使用できません。
- メールアドレス(例:user@example.com)
- 電話番号(例:090-1234-5678)
- 氏名(例:山田 太郎)
- ユーザーIDが個人情報と紐づいている場合
この仕様により、もしユーザーIDが個人情報と紐づけられる形で送信されると、GA4はその値を(redacted)に置き換えてしまいます。
GA4でユーザーIDをフィルタに使用できるケース
GA4でユーザーIDを利用できるのは、**「個人情報と無関係なランダムな識別子」**として設定した場合です。
例えば、以下のような方法で設定すれば「(redacted)」に変換されることなく使用できます。
利用可能なユーザーIDの例
- user_123456789(ランダムな英数字の識別子)
- abcdef123456(暗号化されたハッシュ値)
利用不可なユーザーIDの例(自動で「(redacted)」に変換される)
- taro.yamada@example.com(メールアドレス)
- yamada_taro(氏名がわかるもの)
- 09012345678(電話番号)
もし、GA4で「(redacted)」に変換されてしまう場合は、そのユーザーIDがGA4のルールに違反している可能性があります。
(redacted)に分類されないようにユーザーIDをGA4に送信する方法
ユーザーIDにメールアドレスが使われている場合、例えば以下のコードを変数に使用してGTMからGA4にデータを送れば(redacted)に分類されないようにユーザーIDをGA4に送信することができます。
// 元のusernameの値を取得する関数
function getUsernameValue() {
var inputElement = document.getElementById('username');
return inputElement.value;
}
// usernameから「@」を削除し、削除前の「@」の位置を末尾にマーカーとして付加して返す関数
function convertUsername() {
var username = getUsernameValue();
var atIndex = username.indexOf('@');
if (atIndex !== -1) {
// 「@」を除去した文字列を生成
var converted = username.slice(0, atIndex) + username.slice(atIndex + 1);
// 変換後の文字列に「||」区切りで @ の位置情報を付加
return converted + "||" + atIndex;
} else {
// 「@」が含まれない場合は、元の文字列に -1 を付加して返す
return username + "||-1";
}
}
// 変換された文字列から、付加された情報をもとに「@」を復元して元のusernameに戻す関数
function revertUsername(convertedUsername) {
// 付加された「||」で分割して、変換後の文字列と @ の位置情報に分ける
var parts = convertedUsername.split("||");
if (parts.length === 2) {
var str = parts[0];
var atIndex = parseInt(parts[1], 10);
if (atIndex !== -1) {
// 取得した位置に「@」を再挿入して復元
return str.slice(0, atIndex) + '@' + str.slice(atIndex);
} else {
// 「@」が元々なかった場合は、変換前の文字列と同じとみなす
return str;
}
}
// 万が一マーカーが含まれていなければ、入力値をそのまま返す
return convertedUsername;
}
以下コードの説明です。
- convertUsername 関数
getUsernameValue()
により取得した username 内に「@」があるかどうかをindexOf('@')
で判定します。- 見つかった場合、
slice()
を使って「@」以外の文字列を抽出し、変換後の文字列として使用します。 - その上で、「||」と「@」の位置(atIndex)を付加することで、後から復元可能な情報を埋め込んでいます。
- 「@」が存在しない場合は、単に元の文字列に
||-1
を付加して返します。
- revertUsername 関数
- 変換された文字列を「||」で分割し、変換後の文字列部分と @ の元の位置情報を取得します。
- もし位置情報が -1 でなければ、保存しておいた位置に「@」を再挿入することで元の文字列に復元します。
- 位置情報が -1 の場合は、元の文字列には「@」がなかったと判断し、変換後の文字列(マーカー除去後)をそのまま返します。
convertUsername 関数の返り値を変数に使用することでusername が「@」を含む場合と含まない場合の両方のユーザーIDを(redacted)に分類されないようにGA4へ送信することが可能なはずです。
revertUsername 関数はconvertUsername 関数をローカル環境で複合する際に使用します。
GTM のカスタムHTMLタグやカスタムJavaScript変数として利用する際にも、このコードはそのまま利用できます。
まとめ
GA4では、個人を特定できる情報(PII)が自動的に「(redacted)」に変換されるため、ユーザーIDをそのままフィルタに使うことはできません。
しかし、以下の方法を使えば、特定のユーザーのトラフィックを除外できます。
- ユーザーIDをランダムな識別子にする(個人情報を含まない形にする)
- IPアドレスをプロキシ経由で制御する
- カスタムディメンションを活用する(ログイン状態を送信)
GA4のプライバシー保護の仕様を理解しながら、適切な方法でデータを分析しましょう!
GA4のデータフィルタリングでお困りの方は、ぜひこの記事を参考にしてみてください!