データアナリストやWebサービス運営者にとって、メインサイトとダッシュボード・管理画面間のユーザー行動を正確に計測することは重要な課題です。この記事では、GA4でサブドメイン間のセッション継続を保つ実装方法と、従来のクロスドメイン追跡の課題を解決する実践的な手順を解説します。
課題:外部ドメインでのセッション分断
外部サービス(Cloud Run、Heroku等)に配置したダッシュボードやWebアプリへのリンクを設置すると、GA4で以下の問題が発生します:
主な問題
- セッション分断:
example.comからapp-xyz.cloudrun.appへの遷移でGA4セッションが途切れる - ユーザー追跡の不完全性: サイト閲覧→ダッシュボード利用の一連の行動が分析できない
- コンバージョン計測の精度低下: ファネル分析で30-50%のデータ欠損が発生
クロスドメイン追跡の限界
従来の解決策であるクロスドメイン追跡(_glパラメータ)は以下の制約があります:
// クロスドメイン追跡の設定例
gtag('config', 'G-XXXXXXXXXX', {
'link_domains': ['dashboard.example.com', 'app.example.com']
});
制約:
- 広告ブロッカーによるパラメータ除去
- URLパラメータの期限切れ(24時間)
- プライバシー設定による制限
解決策:サブドメイン方式による自動継続
サブドメインを使用することで、GA4のCookie共有機能を活用してセッションを自動継続できます。
技術的原理
GA4は_gaCookieをルートドメイン(.example.com)に設定するため、以下のサブドメイン間で自動的にセッションが継続されます:
example.com → dashboard.example.com ✅ セッション継続
dashboard.example.com → api.example.com ✅ セッション継続
blog.example.com → app.example.com ✅ セッション継続
実装手順
1. DNS設定
CNAMEレコードの追加
DNSプロバイダー(XServer、Cloudflare等)でサブドメインを設定:
# DNS設定例
dashboard.example.com. CNAME your-app-xyz.cloudrun.app.
Cloudflare使用時の設定
# Cloudflare CLI使用例
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" \
-H "Authorization: Bearer {api_token}" \
-H "Content-Type: application/json" \
--data '{
"type": "CNAME",
"name": "dashboard",
"content": "your-app-xyz.cloudrun.app"
}'
2. Cloud Runカスタムドメイン設定
Google Cloud Runでカスタムドメインをマッピング:
# Cloud Run ドメインマッピング
gcloud run services update your-service \
--platform managed \
--region asia-northeast1 \
--add-custom-audiences dashboard.example.com
# 外部ロードバランサー経由(推奨)
gcloud compute ssl-certificates create dashboard-ssl \
--domains dashboard.example.com
gcloud compute url-maps create dashboard-lb \
--default-service your-backend-service
3. GA4設定の更新
メインサイト側の設定
<!-- サイトのHTMLヘッド -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX', {
// サブドメイン間では自動継続されるため特別な設定不要
'cookie_domain': '.example.com'
});
</script>
ダッシュボード側の設定
<!-- ダッシュボードアプリのHTMLヘッド -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX', {
'cookie_domain': '.example.com'
});
// ダッシュボード固有のイベント追跡
function trackDashboardEvent(action, category) {
gtag('event', action, {
'event_category': category,
'custom_parameter_1': 'dashboard'
});
}
// 使用例
trackDashboardEvent('dashboard_view', 'engagement');
trackDashboardEvent('filter_applied', 'interaction');
</script>
4. サイト側リンクの更新
// Before: 外部ドメインへのリンク
const dashboardUrl = 'https://app-xyz.cloudrun.app/dashboard';
// After: サブドメインへのリンク
const dashboardUrl = 'https://dashboard.example.com/';
// リンク要素の更新
document.getElementById('dashboard-link').href = dashboardUrl;
5. GA4レポートでの確認
GA4管理画面で以下を確認:
リアルタイムレポート
- 「ページ タイトルとスクリーンクラス」でサブドメインのページビューを確認
- 「ホスト名」ディメンションで
example.comとdashboard.example.comが同一セッションで記録されることを確認
カスタムレポート設定
ディメンション: ホスト名、ページパス
指標: セッション数、ページビュー数、平均セッション継続時間
フィルタ: ホスト名 = "example.com" OR "dashboard.example.com"
方式比較とコスト
| 方式 | セッション継続精度 | 実装複雑度 | 月額コスト | 推奨度 |
|---|---|---|---|---|
| サブドメイン | 95%+ | 低 | $0-18 | ⭐⭐⭐ |
| クロスドメイン追跡 | 50-70% | 中 | $0 | ⭐ |
| リバースプロキシ | 100% | 高 | 変動 | ⭐⭐ |
コスト詳細
無料選択肢:
- Cloudflare DNSプロキシ経由(SSL証明書自動)
- GCP Cloud Run直接ドメインマッピング(Previewステータス)
有料選択肢:
- GCP External Load Balancer: $18/月
- AWS CloudFront + Route53: $5-20/月
完了確認とテスト
1. 基本動作確認
# DNS解決確認
nslookup dashboard.example.com
# SSL証明書確認
curl -I https://dashboard.example.com
2. GA4セッション継続テスト
- メインサイトにアクセス
- GA4リアルタイムレポートで自身のセッションを確認
- ダッシュボードへのリンクをクリック
- 同一セッションIDでダッシュボードのページビューが記録されることを確認
3. イベント追跡テスト
// ブラウザ開発者ツールで実行
gtag('event', 'test_event', {
'event_category': 'test',
'value': 1
});
トラブルシューティング
よくある問題
セッションが継続されない場合:
- Cookieドメイン設定を確認:
'cookie_domain': '.example.com' - ブラウザのサードパーティCookie設定を確認
- HTTPSが両方のドメインで有効か確認
ダッシュボードでイベントが記録されない場合:
- ネットワークタブでGA4リクエストの送信を確認
gtag関数がグローバルスコープで定義されているか確認