「どこから来たクリックか」を数える識別子が経路ごとにバラバラだった話
この記事について
複数のWebメディアを横断で運営していると、「このクリックはどこから来たか」を表す識別子が、経路(Amazonアソシエイト・アフィリエイトリダイレクタ・直リンクのUTM)ごとにバラバラの語彙で振られていく。今回、実際に「別サイト用の識別子が別のサイトで発火し続けていた」という誤帰属を見つけたのをきっかけに、全経路で使える単一の識別子規約を作った設計記録。
実装ステータス: 実装済み(新規リンクは規約準拠が必須。既存配備分は該当箇所を触るタイミングで順次置換)
3つの経路、3つの語彙
複数サイトから収益化の外部リンク(アフィリエイトリダイレクタ・Amazonアソシエイト・提携サイトへの直リンク)を出していると、「どこから来たクリックか」を追う仕組みが経路ごとに独立して育っていく。それぞれの記録先も設計思想も別々だからだ。
| 経路 | パラメータ | 記録先 | 備考 |
|---|---|---|---|
| アフィリエイトリダイレクタ | from= / cta= | 独自GA4 + アクセスログ | 2026年5月末からGA4側のsecretを喪失し記録停止中(302転送自体は生存) |
| Amazonアソシエイト | ascsubtag= | Amazonのsub-tag別レポート | バナー画像ファイル名をそのまま識別子に埋め込む運用だった |
| 提携サイトへの直リンク | UTM4点(utm_source等) | 提携サイト側のGA4 | クリック後に実際に着地するサイトの計測なので一番信用度が高い |
3つとも「どこから来たか」を表そうとしている点は同じなのに、パラメータ名も語彙も別物として育ってきた。これが後から効いてくる。
何が壊れていたか — 実測で見つかった誤帰属
規約を作る直接のきっかけは、既存の識別子を棚卸ししたときに見つかった1件の誤帰属だった。
あるサイトの記事下に配備されていたウィジェットに埋め込まれた識別子が、別サイト専用として設計されていたはずの識別子のままだった。実際にサイトのHTMLを取得して確認したところ、対象9記事すべてでこの識別子が検出された。つまり、そのサイトから発生したクリックは、集計上はずっと別サイト発として記録され続けていたことになる。
さらに厄介なのは、識別子の発行元だったサイト自体は、その後の技術基盤の移行(WordPressから静的サイトジェネレータへの切り替え)でこのウィジェット自体を廃止していたことだ。つまり「本来の持ち主はもう使っていない識別子を、別のサイトが使い続けている」という状態だった。棚卸しをしなければ気づけない種類のズレで、GA4側の記録が止まっていたため実害は限定的だったが、記録が生きていたら収益の帰属を継続的に誤り続けていたことになる。
なぜバラバラになるのか — 軸の混在
棚卸しを進めると、この誤帰属は偶然ではなく構造的な問題だと分かった。既存の識別子には、以下の3種類の情報が無秩序に混ざっていた。
- 記事のslug(例: 特定商品名を含む記事の識別子)
- 媒体名+枠の種類を表す語(例:
siteX-widgetのような媒体名+ウィジェット種別) - 採用されたバナー画像のファイル名そのもの
この3つが同じフィールドに同居していたため、「媒体別に集計したい」「記事別に集計したい」のどちらの軸でも機械的に切り分けられなかった。加えて、記事slugにはハイフンが含まれることが多いため、識別子内の区切り文字にもハイフンを使っていた既存の識別子は、どこが「区切り」でどこが「slugの一部」かをプログラムで判定できなかった。これが集計不能の根本原因だった。
正準規約: 4フィールド固定・区切りはアンダースコア
対処として、次の書式を全経路共通の識別子として定めた。
{channel}_{media}_{article}_{slot}
- フィールドの区切りはアンダースコアのみとし、フィールド内の区切りにはハイフンを使う。記事slugがハイフンを含むため、区切り文字を分離しないと機械分解できない
channel(収益チャネルの種類)・media(発火元サイト)・article(発火元記事。サイト全域に出るウィジェットはall固定)・slot(記事内の位置。top/mid/endなど)の4フィールドを必ず埋める
経路ごとに、この4フィールドをどのパラメータに載せるかを一枚のマッピング表に落とした。
| 経路 | 載せ方 | 記入例 |
|---|---|---|
| Amazonアソシエイト | 4フィールドをascsubtagに1本で連結 | ascsubtag=amz_media-a_all_end-{banner} |
| アフィリエイトリダイレクタ | from={media}_{article} / cta={slot} の2パラメータに分割 | from=media-b_article-slug&cta=step1 |
| 提携サイト直リンク(UTM) | utm_source={media} / utm_content={article}_{slot} | utm_source=media-c&utm_medium=bridge&utm_content=all_mid |
アフィリエイトリダイレクタだけ2パラメータに分割しているのは、既存のGA4ディメンション設計(from_article・cta_positionのような列)をそのまま活かすためだ。値の語彙だけ新規約に更新すれば、GA4側の実装は無変更で移行できる。
移行方針は「凍結」であって「一斉置換」ではない
古い識別子を一括で書き換える判断はしなかった。理由は2つある。
- リダイレクタ側のGA4記録がすでに停止しているため、旧語彙が残っていても実害がほぼゼロだった(CFワーカーのアクセスログにしか残らない)
- 誤帰属を起こしていたウィジェット自体が、収益貢献ゼロ(登録実績0のまま)の枠だと別途判明しており、修正するより撤去する方が正しい対処だった
そのため運用ルールは「新規に貼るリンクは規約準拠を必須にする。既存の配備済みリンクは、その記事や枠を別の理由で触るタイミングで置き換える」という凍結方式にした。棚卸しの時点で対象範囲を洗い出し、生死判定(HTML上に実配備されているか)を一覧化しておくことで、「触ったついでに直す」を迷わず実行できるようにしてある。
運用チェックリスト
新しい外部リンクを貼るときに迷わないよう、判断手順を固定した。
channel/media/article/slotの4軸を語彙表に沿って決める- 経路に応じたマッピング表のパラメータに載せる
- フィールド区切りはアンダースコア、フィールド内はハイフンであることを確認する
- サイト全域枠は
article=all固定、カテゴリ限定枠はcat-<カテゴリslug>とする
チェックリストを固定フォーマットにしたことで、新しい収益チャネル(リード型アフィリエイトやnote販売など)を追加するときも、既存の4フィールドにそのまま当てはめるだけで済むようになった。識別子の設計は一度きりの作業ではなく、サイトが増えるたびに再発する種類の負債であることが、今回の棚卸しで改めて分かった。
動作環境: 静的サイト複数(Astro)+ WordPress複数の混在運用
更新履歴: 2026-08-03 — 初稿
訂正履歴: なし