utm-builder について
utm-builderは、UTMリンクの作成や監査に使うマーケティング帰属分析向けのリファレンススキルです。命名規則、GA4のチャネル分類、チャネル別テンプレート、BigQueryの検証クエリを扱います。
主な機能
- 01命名規則に沿ったUTM URL作成
- 02GA4チャネル分類ルールの確認
- 03チャネル別UTMテンプレートの参照
- 04BigQueryクエリによる帰属監査
- 05自動タグ付けの動作確認
活用シーン
- 01Google Ads用UTM URLの作成
- 02キャンペーン命名の統一
- 03GA4のUnassigned流入の調査
- 04BigQueryでの流入元・メディアデータ検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cognyai/ claude-code-marketing-skills --skill utm-builderインストール後、Claude Code で/utm-builderを入力して読み込まれたか確認します。
詳細
UTM パラメータ戦略とビルダーのリファレンス
UTM パラメータ戦略、命名規則、GA4 のデフォルトチャネルグループのルール、自動タグ設定の動作、よくある間違い、マーケティングアトリビューション用の BigQuery 検証クエリに関する完全ガイドです。
ドキュメント全文:https://cogny.com/docs/utm-strategy
使用方法
/utm-builder # Full UTM strategy overview
/utm-builder naming conventions # Show naming convention rules
/utm-builder channel grouping # GA4 default channel grouping rules
/utm-builder meta ads # Meta Ads UTM template
/utm-builder audit # BigQuery validation queries
/utm-builder build google cpc # Generate UTM URL for Google Ads
手順
あなたは UTM 戦略とマーケティングアトリビューションの専門家です。このリファレンスを使って、ユーザーが正しい UTM URL を作成できるよう支援し、既存の UTM 命名規則を監査し、GA4 のデフォルトチャネルグループのルールを理解し、BigQuery でアトリビューションデータを検証してください。
ユーザーから質問されたら、以下から該当するセクションを見つけて、正確で実行可能な回答を提供してください。UTM URL を作成するときは、必ず小文字とハイフン区切りの命名規則を適用してください。
ユーザーが特定のトピックを引数として指定した場合は、その分野に焦点を当ててください。指定がない場合は、UTM 戦略の基本事項を概説してください。
Cogny MCP ツールに接続している場合は、ライブの GA4 データと Google Ads データを取得して、実際の UTM 設定を監査できます。
5 つの UTM パラメータ
| パラメータ | 必須 | 目的 | 例 |
|---|---|---|---|
utm_source | はい | トラフィックを送るプラットフォームまたはパブリッシャー | google、facebook、linkedin、newsletter |
utm_medium | はい | マーケティングチャネルの種類 | cpc、paid-social、email、organic-social |
utm_campaign | はい | 特定のキャンペーン名 | spring-sale-2025、brand-awareness-q1 |
utm_term | いいえ | 有料検索キーワード | running+shoes、crm+software |
utm_content | いいえ | クリエイティブのバリエーションまたはリンクの掲載位置 | hero-banner、sidebar-cta、blue-variant |
パラメータの詳細
utm_source — クリックは実際にどこで発生しましたか?
utm_source=google # Google Ads or Google organic
utm_source=facebook # Meta Ads (Facebook/Instagram)
utm_source=linkedin # LinkedIn Ads or organic
utm_source=klaviyo # Email via Klaviyo
utm_source=tiktok # TikTok Ads
utm_source=partner-blog # A specific referral partner
utm_medium — チャネルの種類です。GA4 のデフォルトチャネルグループでは、最も重要なパラメータです。utm_medium が誤っていると、トラフィックは誤ったチャネルに分類されます。
utm_medium=cpc # Cost-per-click (paid search)
utm_medium=paid-social # Paid social ads
utm_medium=email # Email marketing
utm_medium=organic-social # Organic social posts
utm_medium=display # Display/banner ads
utm_medium=affiliate # Affiliate traffic
utm_medium=referral # Partner/referral traffic
utm_medium=video # Video ads
utm_campaign — 一貫した構成のキャンペーン名:
utm_campaign=spring-sale-2025
utm_campaign=brand-awareness-q1-2025
utm_campaign=retargeting-cart-abandoners
utm_term — キーワードまたはターゲティング語句:
utm_term=running-shoes
utm_term=best-crm-software
utm_content — クリエイティブのバリエーションまたは掲載位置:
utm_content=hero-image-v1
utm_content=sidebar-cta
utm_content=video-30s
GA4 のデフォルトチャネルグループのルール
GA4 は、source、medium、campaign の値に基づいて、各セッションをデフォルトチャネルグループに分類します。これらのルールによって、GA4 の標準レポートでトラフィックがどのように表示されるかが決まります。
| チャネル | Medium が一致する必要のある値 |
|---|---|
| Direct | source = (direct) AND medium is (not set) or (none) |
| Organic Search | medium = organic |
| Paid Search | medium matches ^(cpc|ppc|paidsearch)$ |
| Display | medium matches ^(display|cpm|banner)$ |
| Paid Social | medium matches ^(paid-social|paidsocial|paid_social)$ |
| Organic Social | medium matches ^(social|social-network|social-media|sm|organic-social)$ |
medium = email | |
| Affiliates | medium = affiliate |
| Referral | medium = referral |
| Audio | medium = audio |
| SMS | medium matches ^(sms|sms_message)$ |
| Video | medium matches ^(video|youtube)$ |
| Cross-network | campaign name contains cross-network |
| Unassigned | 上記のいずれのルールにも一致しない |
重要: utm_medium が上記のパターンに一致しない場合、トラフィックは Unassigned に分類されます。
BigQuery における GA4 の Source/Medium マッピング
UTM 値は、GA4 の BigQuery エクスポート内の複数の場所に表示されます。
| UTM パラメータ | BigQuery の場所 | スコープ |
|---|---|---|
utm_source | traffic_source.source | ユーザー(初回接触) |
utm_medium | traffic_source.medium | ユーザー(初回接触) |
utm_campaign | traffic_source.name | ユーザー(初回接触) |
utm_source | session_start のイベントパラメータ source | セッション |
utm_medium | session_start のイベントパラメータ medium | セッション |
utm_campaign | session_start のイベントパラメータ campaign | セッション |
セッションレベルの source/medium クエリ:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') as session_source,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') as session_medium,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'campaign') as session_campaign,
COUNT(*) as sessions
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name = 'session_start'
GROUP BY 1, 2, 3
ORDER BY sessions DESC
命名規則
ルール
- すべて小文字にします。 GA4 では大文字と小文字が区別されます。
Facebookとfacebookは別々のソースです。 - 単語の区切りにはハイフンを使います。 スペース(
%20に変換されます)や特殊文字は使わないでください。 - 特殊文字は使いません。
a-z、0-9、-のみを使用します。 - 具体的かつ簡潔にします。
psではなくpaid-socialを使います。 - キャンペーンには時間を示す識別子を含めます。
spring-saleではなくspring-sale-2025を使います。
推奨される分類体系
| パラメータ | 規則 | 例 |
|---|---|---|
utm_source | プラットフォーム名を小文字で指定 | google、facebook、linkedin、klaviyo |
utm_medium | GA4 のルールに沿ったチャネル種別 | cpc、paid-social、email、display |
utm_campaign | name-date または name-quarter | spring-sale-2025、retarget-cart-q1 |
utm_term | キーワードまたはターゲティング | running-shoes、brand-keyword |
utm_content | クリエイティブのバリエーションまたは掲載位置 | video-30s-v2、hero-banner、cta-red |
チャネル別 UTM テンプレート
Google Ads(検索)
?utm_source=google&utm_medium=cpc&utm_campaign={campaign_name}&utm_term={keyword}&utm_content={ad_variant}
Google Ads(ディスプレイ)
?utm_source=google&utm_medium=display&utm_campaign={campaign_name}&utm_content={creative_variant}
Meta Ads(Facebook/Instagram)
utm_source=facebook&utm_medium=paid-social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}
Meta の動的パラメータ:{{campaign.name}}、{{campaign.id}}、{{adset.name}}、{{adset.id}}、{{ad.name}}、{{ad.id}}、{{placement}}、{{site_source_name}}。
LinkedIn Ads
utm_source=linkedin&utm_medium=paid-social&utm_campaign={{CAMPAIGN_NAME}}&utm_content={{CREATIVE_NAME}}
LinkedIn のマクロ:{{CAMPAIGN_ID}}、{{CAMPAIGN_NAME}}、{{CAMPAIGN_GROUP_ID}}、{{CAMPAIGN_GROUP_NAME}}、{{CREATIVE_ID}}、{{CREATIVE_NAME}}。
メール
?utm_source={esp_name}&utm_medium=email&utm_campaign={email_campaign_name}&utm_content={link_placement}
オーガニックソーシャル
?utm_source={platform}&utm_medium=organic-social&utm_campaign={post_theme}&utm_content={post_variant}
インフルエンサー
?utm_source=creator-{name}&utm_medium=paid-social&utm_campaign=influencer-{campaign}-{date}&utm_content={platform}-{format}
アフィリエイト
?utm_source=partner-{name}&utm_medium=affiliate&utm_campaign=affiliate-program-{year}&utm_content={placement}
自動タグ設定と手動タグ設定
Google Ads(gclid)
- 自動タグ設定では、すべてのクリック URL に
gclidが追加されます - GA4 はキャンペーン、広告グループ、キーワードのデータを使って、セッションを Google Ads に自動的に関連付けます
- ソース/メディアは自動的に
google / cpcに設定されます - gclid と UTM の両方がある場合、GA4 は gclid を優先します — GA4 のアトリビューションでは UTM は無視されます
Google Ads で UTM も必要となるケース:
- UTM パラメータを解析する CRM システム(HubSpot、Salesforce)
- サードパーティの分析ツール(Mixpanel、Amplitude)
- gclid を読み取れないクロスプラットフォームのダッシュボード
page_locationを使った BigQuery のカスタムアトリビューションモデル
Meta Ads(fbclid)
- GA4 はアトリビューションに
fbclidをネイティブでは解析しません - UTM がない場合、Meta のトラフィックは
facebook.com / referralまたはl.facebook.com / referralとして表示されます - GA4 で Meta Ads のアトリビューションを正しく行うには、UTM パラメータを使う必要があります
LinkedIn Ads
- LinkedIn Insight Tag はコンバージョンをトラッキングしますが、クリック単位の GA4 アトリビューション情報は提供しません
- GA4 で LinkedIn Ads のアトリビューションを正しく行うには、UTM パラメータを使う必要があります
両方を使う場合
- Google Ads と CRM の連携:gclid は GA4 に、UTM は CRM にデータを渡します
- UTM が必要なクロスプラットフォームのダッシュボード
- BigQuery のカスタムアトリビューションモデル
警告: Google Ads では、UTM で gclid を上書きする必要がある場合を除き、GA4 の設定で「Allow manual tagging to override auto-tagging」がオフになっていることを確認してください。
よくある UTM の間違い
1. 命名の不統一
GA4 は、異なる文字列をそれぞれ別のソースとして扱います。
utm_source=Facebook # WRONG: capital F
utm_source=facebook # CORRECT
utm_source=fb # WRONG: abbreviation
2. 内部リンクへの UTM の追加
自サイト内のリンクに UTM を追加すると、セッションのソースがリセットされ、セッション数が水増しされます。以下のようなことは絶対にしないでください。
<a href="/pricing?utm_source=homepage&utm_medium=banner">Pricing</a>
3. utm_medium の欠落
utm_medium がない場合、トラフィックは「Unassigned」に分類されます。
# BAD: No medium
?utm_source=facebook&utm_campaign=spring-sale
# GOOD: Medium present
?utm_source=facebook&utm_medium=paid-social&utm_campaign=spring-sale
4. 特殊文字の URL エンコード
# BAD
utm_campaign=Spring Sale 2025 # Becomes Spring%20Sale%202025
# GOOD
utm_campaign=spring-sale-2025
5. オーガニック検索/SEO ページへの UTM の追加
検索エンジンがクロールするページに UTM パラメータを追加しないでください。ページの評価が分散し、重複コンテンツが作成されます。
6. キャンペーン名への日付の記載漏れ
# BAD: Cannot distinguish quarters
utm_campaign=brand-search
# GOOD: Time-scoped
utm_campaign=brand-search-q1-2025
BigQuery の検証クエリ
ソース/メディアのユニークな組み合わせをすべて取得
SELECT
traffic_source.source,
traffic_source.medium,
COUNT(DISTINCT user_pseudo_id) as users,
MIN(PARSE_DATE('%Y%m%d', event_date)) as first_seen,
MAX(PARSE_DATE('%Y%m%d', event_date)) as last_seen
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY 1, 2
ORDER BY users DESC
ソース名の不統一を検出
WITH source_variants AS (
SELECT
LOWER(traffic_source.source) as normalized_source,
traffic_source.source as original_source,
COUNT(DISTINCT user_pseudo_id) as users
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND traffic_source.source IS NOT NULL
GROUP BY 1, 2
)
SELECT
normalized_source,
ARRAY_AGG(STRUCT(original_source, users) ORDER BY users DESC) as variants,
COUNT(*) as variant_count
FROM source_variants
GROUP BY 1
HAVING COUNT(*) > 1
ORDER BY variant_count DESC
チャネルグループの分類を予測
SELECT
traffic_source.source,
traffic_source.medium,
CASE
WHEN traffic_source.source = '(direct)' AND (traffic_source.medium IS NULL OR traffic_source.medium IN ('(not set)', '(none)')) THEN 'Direct'
WHEN traffic_source.medium = 'organic' THEN 'Organic Search'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(cpc|ppc|paidsearch)$') THEN 'Paid Search'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(display|cpm|banner)$') THEN 'Display'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(paid-social|paidsocial|paid_social)$') THEN 'Paid Social'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(social|social-network|social-media|sm|social_network|social_media|organic-social)$') THEN 'Organic Social'
WHEN traffic_source.medium = 'email' THEN 'Email'
WHEN traffic_source.medium = 'affiliate' THEN 'Affiliates'
WHEN traffic_source.medium = 'referral' THEN 'Referral'
WHEN traffic_source.medium = 'audio' THEN 'Audio'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(sms|sms_message)$') THEN 'SMS'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(video|youtube)$') THEN 'Video'
WHEN REGEXP_CONTAINS(IFNULL(traffic_source.name, ''), r'cross-network') THEN 'Cross-network'
ELSE 'Unassigned'
END as predicted_channel_group,
COUNT(DISTINCT user_pseudo_id) as users
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY 1, 2, 3
ORDER BY users DESC
内部 UTM の混入を検出
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') as landing_page,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_referrer') as referrer,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') as session_source,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') as session_medium,
COUNT(*) as sessions
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name = 'session_start'
-- Replace example.com with your domain
AND REGEXP_CONTAINS(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_referrer'),
r'example\.com'
)
AND REGEXP_CONTAINS(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
r'utm_'
)
GROUP BY 1, 2, 3, 4
ORDER BY sessions DESC
utm_medium が欠落しているセッションを検出
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') as source,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'campaign') as campaign,
COUNT(*) as sessions
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name = 'session_start'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') IS NOT NULL
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') != '(direct)'
AND (
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') IS NULL
OR (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') IN ('(not set)', '(none)', '')
)
GROUP BY 1, 2
ORDER BY sessions DESC
スプレッドシート作成用の数式
列(A=URL、B=ソース、C=メディア、D=キャンペーン、E=キーワード、F=コンテンツ)の値から UTM URL を生成する Google Sheets の数式:
=A2&"?utm_source="&B2&"&utm_medium="&C2&"&utm_campaign="&D2&IF(E2<>"","&utm_term="&E2,"")&IF(F2<>"","&utm_content="&F2,"")
Resources
- Google UTM Builder: https://ga-dev-tools.google/ga4/campaign-url-builder/
- GA4 Default Channel Grouping: https://support.google.com/analytics/answer/9756891
- GA4 BigQuery Export Schema: https://support.google.com/analytics/answer/7029846
- Google Ads Auto-Tagging: https://support.google.com/google-ads/answer/3095550
- Meta URL Parameters: https://www.facebook.com/business/help/1016122818401732
- Full Cogny Docs: https://cogny.com/docs/utm-strategy