配信タグ ab.js とは、対象サイトに設置する AB Flows のクライアントサイド配信スクリプトです。実施中のテスト設定を取得し、訪問者をパターンに振り分け、DOM 変更やリダイレクトを適用し、表示とコンバージョンを計測します。サイズは約6KBで、依存ライブラリはありません。
設置方法
<script src="https://<AB Flowsのドメイン>/ab.js" data-project="<プロジェクトID>" async></script>
| 属性 | 内容 |
|---|---|
src | AB Flows の ab.js の URL。設定APIと計測APIの接続先は、この URL のオリジンから自動的に決まります |
data-project | プロジェクト ID。プロジェクト詳細画面に表示されるタグに含まれています |
async | ページの読み込みをブロックしないための指定です |
head 内のできるだけ上に設置すると、パターン適用までの時間が短くなり、ちらつきが減ります。同じページに複数回設置しても、2回目以降は実行されません。
実行の流れ
- スクリプトタグの
data-projectからプロジェクト ID を読み取ります。 - 訪問者 ID を
localStorageから読み込みます。なければ生成して保存します。 - 前回取得したテスト設定のキャッシュを確認し、現在の URL に一致するテストがある場合(または初回)だけ、アンチフリッカーとして
bodyを非表示にします。 - 設定 API
GET /api/config/<プロジェクトID>から実施中のテスト一覧を取得します。 - 現在の URL に一致するテストごとに、パターンを決定して適用します。
- 表示(インプレッション)を計測 API
POST /api/collectに送信し、ゴールの監視を開始します。 - 適用が終わったら
bodyの非表示を解除します。
振り分けロジック
振り分けは決定論的で、同じ訪問者は再訪時も必ず同じパターンを見ます。
- 訪問者 ID とテスト ID を組み合わせた文字列のハッシュ値(FNV-1a)を 0 以上 1 未満の数値に変換します。
- 配信割合(traffic): ハッシュ値 × 100 がテストの配信割合以上なら、その訪問者はテスト対象外です。対象外の訪問者にはオリジナルがそのまま表示され、計測もされません。
- パターンの比重(weight): 別のハッシュ値を各パターンの比重の合計に対する位置とみなし、該当するパターンを選びます。
- 一度割り当てたパターンは
localStorageに保存し、以降はハッシュ計算をせずに同じパターンを返します。テスト開始後にパターンの比重を変えても、割り当て済みの訪問者は変わりません。
パターンの適用
| 変更の種類 | 動作 |
|---|---|
| テキスト変更 | 対象要素の textContent を置き換えます |
| HTML変更 | 対象要素の innerHTML を置き換えます |
| 非表示 | display: none !important を設定します |
| 削除 | 対象要素を DOM から取り除きます |
| スタイル変更 | インラインスタイルを追加します |
| 属性変更 | 属性名=値 の形式で属性を設定します |
| カスタムCSS | style 要素として挿入します |
| カスタムJS | 適用後に実行します。エラーはコンソールに出力され、他の処理には影響しません |
対象要素が見つからない場合は、MutationObserver で DOM の変化を監視し、最大3秒間リトライします。SPA や遅延描画されるページでも適用できます。
アンチフリッカー
オリジナルの表示が一瞬見えてしまう「ちらつき」を抑えるため、配信タグは body の不透明度を 0 にしてから設定を取得し、パターン適用後に戻します。
- 非表示の上限は 1.2 秒です。設定取得が遅延しても、1.2 秒後には必ず表示されます。
- 前回取得した設定を
localStorageにキャッシュし、現在の URL に一致するテストがないと分かっているページでは非表示にしません。テスト対象外のページの表示速度には影響しません。 - 設定の取得に失敗した場合も、すぐに表示に戻します。
計測
| イベント | 送信タイミング | 重複の扱い |
|---|---|---|
| impression(表示) | パターン割り当て時 | 同じテストについて、同じセッション内では1回だけ送信します |
| conversion(コンバージョン) | ゴール達成時 | 同じ訪問者の同じテストについて、1回だけ送信します |
送信には navigator.sendBeacon を使い、対応していない環境では fetch の keepalive オプションを使います。送信先は配信タグと同じオリジンの /api/collect です。
プレビューモード
対象ページの URL に ?_ab_preview=<パターンID> を付けてアクセスすると、そのパターンだけを適用し、振り分けと計測を行いません。下書き中のテストも確認できます。画面左下に「AB Flows プレビュー中(計測されません)」のバッジが表示されます。
localStorage / sessionStorage のキー
| キー | 保存先 | 内容 |
|---|---|---|
_ab_vid | localStorage | 訪問者 ID |
_ab_assign | localStorage | テスト ID ごとの割り当て済みパターン ID |
_ab_conv_<テストID> | localStorage | コンバージョン送信済みフラグ |
_ab_cfg_<プロジェクトID> | localStorage | 前回取得したテスト設定(アンチフリッカー判定用) |
_ab_ga4_imp_<テストID> | localStorage | GA4 への experience_impression 送信済みフラグ |
_ab_imp_<テストID> | sessionStorage | セッション内の表示送信済みフラグ |
localStorage が使えない環境(プライベートブラウジングなど)では、ページごとに訪問者 ID が変わるため計測の精度が下がりますが、表示は正常に行われます。
設定 API のレスポンス
GET /api/config/<プロジェクトID> は、そのプロジェクトで実施中(running)のテストだけを返します。
{
"experiments": [
{
"id": "テストID",
"type": "ab",
"url_pattern": "https://example.com/lp",
"url_match_type": "contains",
"traffic": 100,
"goal_type": "click",
"goal_value": "#cta",
"ga4_enabled": false,
"variants": [
{ "id": "パターンID", "weight": 50, "redirect_url": "", "changes": [], "css": "", "js": "" }
]
}
]
}
| フィールド | 内容 |
|---|---|
type | ab(A/Bテスト)または redirect(リダイレクトテスト) |
url_match_type | exact、contains、regex |
traffic | テスト対象に含める訪問者の割合(0〜100) |
goal_type | pageview、click、custom、ga4 |
variants[].weight | パターンの振り分け比重 |
variants[].changes | ビジュアルエディタで保存した DOM 変更の配列 |
レスポンスは短時間キャッシュされます(ブラウザ 15 秒、CDN 30 秒、再検証中の配信 60 秒)。テストの開始・停止は概ね 1 分以内に反映されます。