メインコンテンツへスキップ
Pro プラン10 minutes中級

カスタムイベントゴール

カスタムJavaScriptイベントでコンバージョンを追跡します。フォーム送信、動画再生、AJAXアクション、複雑なインタラクションに対応します。

goalseventsjavascriptcustomtracking
最終更新日:
Pro プラン

カスタムイベントゴールを使用すると、JavaScriptイベントを発火させることでどんなアクションでも追跡できます。フォーム、動画再生、複雑なインタラクションに最適です。

カスタムイベントを使用する場面

以下の追跡に最適です:

  • フォーム送信(AJAX)
  • 動画インタラクション(再生、完了)
  • シングルページアプリのナビゲーション
  • カートに追加
  • Webアプリでの機能使用
  • JavaScriptでトリガーされるあらゆるアクション

カスタムイベントの仕組み

  1. サイトにJavaScriptコードを追加
  2. アクション発生時にコードが実行される
  3. Zenovayがイベントを受信
  4. ゴールが記録される

基本的な実装

イベントの追跡

// シンプルなイベント
zenovay('goal', 'event_name');

// 値付きイベント
zenovay('goal', 'purchase', { value: 99.99 });

// 値と通貨付きイベント
zenovay('goal', 'purchase', {
  value: 99.99,
  currency: 'USD'
});

ゴール呼び出しは valuecurrency を記録します。渡すその他のキーはすべて基礎となるイベントペイロードで送信されますが、ゴール自体はその名前と値でのみ報告されます。

ゴールの作成

  1. ウェブサイトのダッシュボードを開き、Journeys タブを選択
  2. ゴール サブタブを開き、ゴール追加 をクリック
  3. カスタムイベント を選択
  4. イベント名を入力(例:purchase)し、コードで発火させる名前と一致させる
  5. オプションで値の追跡を有効にしてデフォルト値を設定
  6. 保存

カスタムイベントゴールは、Zenovayが初めて見るイベント名を受け取ったときに自動作成されるため、イベントを先に発火させるとゴールリストに表示されます。

イベント名の命名

ベストプラクティス

良い名前悪い名前
signup_completegoal1
purchaseclick
video_50_percentevent
add_to_cart123

命名規則

一貫したパターンを選択:

  • snake_caseform_submit
  • camelCaseformSubmit
  • kebab-caseform-submit

プレフィックスによるカテゴリ分け

プレフィックス付きでイベントを整理:

// ECイベント
zenovay('goal', 'ecom_add_to_cart');
zenovay('goal', 'ecom_checkout_start');
zenovay('goal', 'ecom_purchase');

// エンゲージメントイベント
zenovay('goal', 'engage_video_play');
zenovay('goal', 'engage_scroll_50');

よくある実装例

フォーム送信

document.querySelector('form').addEventListener('submit', function(e) {
  zenovay('goal', 'contact_form');
});

// AJAXフォームの場合
function onFormSuccess() {
  zenovay('goal', 'contact_form');
}

動画インタラクション

const video = document.querySelector('video');

video.addEventListener('play', function() {
  zenovay('goal', 'video_play');
});

video.addEventListener('ended', function() {
  zenovay('goal', 'video_complete');
});

// 50%視聴の追跡
video.addEventListener('timeupdate', function() {
  if (video.currentTime / video.duration > 0.5) {
    zenovay('goal', 'video_50_percent');
  }
});

ECアクション

// カートに追加
function addToCart(product) {
  // カートのロジック...

  zenovay('goal', 'add_to_cart', {
    value: product.price
  });
}

// 購入完了
function onPurchaseComplete(order) {
  zenovay('goal', 'purchase', {
    value: order.total,
    currency: 'USD'
  });
}

登録・サインアップ

async function handleSignup(formData) {
  try {
    const response = await api.signup(formData);

    if (response.success) {
      zenovay('goal', 'signup_complete', {
        value: 50 // 推定リード価値
      });
    }
  } catch (error) {
    // エラー処理
  }
}

値の設定

静的な値

ゴール設定で設定:

  • 値の追跡を有効化
  • デフォルト値を入力(例:50)
  • 各完了がその値に加算される

動的な値

コードから渡す:

// 注文金額
zenovay('goal', 'purchase', {
  value: orderTotal
});

// 計算された値
const leadValue = isPremium ? 100 : 25;
zenovay('goal', 'lead', { value: leadValue });

ページから値を取得

DOMから読み込む:

const price = parseFloat(
  document.querySelector('.price').textContent.replace('$', '')
);
zenovay('goal', 'purchase', { value: price });

ゴール値フィールド

ゴール完了は以下のフィールドを記録します:

プロパティ
valuenumber99.99
currencystring"USD"

value は単純な数値として渡します(通貨記号や文字列は不可)。currency はISO通貨コードで、デフォルトは USD です。

フレームワーク対応

React

import { useCallback } from 'react';

function SignupForm() {
  const handleSubmit = useCallback((data) => {
    // 送信ロジック...

    window.zenovay('goal', 'signup');
  }, []);

  return <form onSubmit={handleSubmit}>...</form>;
}

Vue

<script>
export default {
  methods: {
    handleSubmit() {
      // 送信ロジック...

      window.zenovay('goal', 'signup');
    }
  }
}
</script>

Next.js

// コンポーネント内でのクライアント側トラッキング
'use client';

export default function CheckoutButton() {
  function handleSuccess() {
    if (typeof window !== 'undefined') {
      window.zenovay('goal', 'purchase');
    }
  }

  return <button onClick={handleSuccess}>完了</button>;
}

シングルページアプリ(SPAs)

ルート変更のトラッキング

仮想ページビュー用:

// React Router
history.listen(() => {
  zenovay('page');
});

// Vue Router
router.afterEach(() => {
  zenovay('page');
});

ナビゲーション後のゴール

// ナビゲートして追跡
router.push('/success').then(() => {
  zenovay('goal', 'signup_complete');
});

条件付きトラッキング

条件に基づいて追跡

// 条件が満たされた場合のみ追跡
if (user.isNewUser && !user.hasConvertedBefore) {
  zenovay('goal', 'first_conversion');
}

// A/Bテストバリアント
if (experimentVariant === 'B') {
  zenovay('goal', 'variant_b_conversion');
}

イベントのデバウンス

重複発火を防止:

let hasTracked = false;

function trackOnce(eventName) {
  if (!hasTracked) {
    zenovay('goal', eventName);
    hasTracked = true;
  }
}

エラーハンドリング

安全なトラッキング

Zenovayが読み込まれていない場合に対応します。トラッキングスニペットは小さなコマンドキューを定義するため、スクリプト読み込み完了前の呼び出しもその後処理されます:

function safeTrackGoal(eventName, properties) {
  if (typeof zenovay === 'function') {
    zenovay('goal', eventName, properties);
  } else {
    console.warn('Zenovay not loaded');
  }
}

イベントのテスト

デバッグモード

コンソールログを有効化:

zenovay('debug');

// テストイベントを発火
zenovay('goal', 'test_event');
// コンソールで出力を確認

ダッシュボードで確認

  1. テストイベントを発火
  2. ウェブサイトのダッシュボードを開き Live View タブを選択してリアルタイムアクティビティを監視するか、Journeys → ゴール を開いてゴール完了数を確認
  3. ゴールが表示され、数が増えることを確認
  4. ゴール値を確認

ネットワークタブ

  1. DevTools → ネットワークを開く
  2. イベントを発火
  3. api.zenovay.com へのリクエストを探す
  4. ペイロードを確認

トラブルシューティング

イベントが記録されない場合

スクリプトの読み込みを確認:

console.log(typeof zenovay); // 'function' と表示されるはず

イベント名が一致しているか確認:

  • ゴール:signup
  • コード:zenovay('goal', 'signup')
  • コード:zenovay('goal', 'Signup')

エラーを確認:

  • ブラウザコンソールでエラーを確認
  • ネットワークタブで失敗したリクエストを確認

値が記録されない場合

値が数値であることを確認:

// 誤り
zenovay('goal', 'purchase', { value: "$99.99" });

// 正しい
zenovay('goal', 'purchase', { value: 99.99 });

次のステップ

この記事は役に立ちましたか?