> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kameleoon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 収益ゴール

> タグマネージャー、グローバルスクリプト、または SDK を使用して、通貨、フォーマット、重複排除に関するガイダンスとともに、Kameleoon で正確な収益ゴールのトラッキングを設定します。

Kameleoon での収益ゴールの設定は単純ですが、すべてが正しく機能することを確実にするには、慎重なステップが必要です。すべての Web サイトには独自の構造、購入フロー、トラッキング設定、エッジケースがあり、万能な解決策はありません。適切な設定がないと、重要なデータポイントを見逃したり、トランザクションを二重カウントしたり、パフォーマンスを誤って解釈したりするリスクがあります。

これらの落とし穴を避け、収益トラッキングが正確で意味のあるものになるように、この記事では実用的なガイドラインのセットをまとめました。推奨事項は、Kameleoon ユーザーが遭遇する最も一般的な課題をカバーするように設計されており、設定に適応できる柔軟なソリューションを提供します。

## 実装方法

Kameleoon は、エクスペリメントタイプと技術的なセットアップに応じて、収益ゴールを効果的に追跡するための複数の統合方法をサポートしています。以下は Web Experimentation (WE) と Feature Experimentation (FE) の両方の推奨アプローチで、Kameleoon Data API を介したオフラインコンバージョンのサポートを含みます。

### Web Experimentation

* **タグマネージャーの使用:** [`kameleoonQueue`](../../../developer-docs/apis/activation-api-js/api-reference/command-queue#syntax) を実装する必要があります。これにより、コンバージョンイベントが分析プラットフォームと同期してトリガーされることが保証され、ツール間でデータの一貫性が維持され、サイトのパフォーマンスが向上します。Google Tag Manager での詳細な実装ガイドについては、[こちらの包括的なガイド](../../integrations/as-a-destination/analytics/google-analytics-4/google-tag-manager)と以下の設定手順を参照して収益ゴールを設定してください。
* **[グローバルカスタムスクリプトの使用:](../../project-management/manage-your-projects#global-script)** `kameleoonQueue` がセットアップと互換性がない場合、Kameleoon アプリのグローバルカスタムスクリプト内で Activation API を使用して手動で収益ゴールを実装できます。

### Feature Experimentation

[Kameleoon の SDK](../../../developer-docs/feature-experimentation/get-started/overview) のいずれかを使用している場合、[`trackConversion()`](../../../developer-docs/sdks/web-sdks/nodejs-sdk#trackconversion) メソッドを使用して収益ゴールを追跡できます。SDK 環境に基づいて収益ゴールを適切に設定するには、以下のステップを参照してください。

### Data API

*(WE と FE の両方に適用可能)*

電話や店舗で完了した購入などのオフラインコンバージョンには、[Kameleoon Data API](../../../developer-docs/apis/data-api-rest/tutorials/processing-offline-goal-conversions-in-experiments#sending-offline-goal-conversion) を使用してオフラインゴールコンバージョンを処理できます。この方法は、コンバージョンイベントがユーザーのオンラインジャーニーの外で発生するが、Kameleoon エクスペリメント内で追跡および帰属する必要がある場合に最適です。

## 設定

### スコープ

収益ゴールを設定する前に、トランザクション確認が常に単一の一貫したページで発生するかどうかを確認してください。一部のセットアップでは、特にモバイルアプリ、埋め込みチェックアウト、またはサードパーティの支払いプロバイダーを含む場合、確認は Web ビューまたは別のドメインに表示される場合があります。確認が表示される可能性のある**すべての**関連ページまたはビューに Kameleoon が適切にインストールされていることを確認してください。このセットアップにより、コンバージョンが確実に追跡され、収益データが見落とされないようになります。ユーザーが複数の URL(たとえば、クエリパラメーターのバリエーションや異なる支払いフローによる)でトランザクションを完了できる場合、Kameleoon の設定で**すべての関連 URL** を追跡用に追加します。これにより、コンバージョンが見落とされません。

### トランザクションゴール (確認ページへのアクセス)

確認ページにアクセスするためのゴールを、収益金額なしで設定するのは良い実践です。このゴールは、収益ゴールで欠落したコンバージョンの追跡に役立ちます。欠落したコンバージョンは、ページ上(DOM、`dataLayer`、または別の同様のオブジェクト内)での収益金額の読み込み遅延が原因であることが多いです。WE でトランザクションゴールを設定するには、2 つのゴールタイプから選択できます:

* **Access to a page:** ゴールの設定で URL を設定する必要があります。URL の構造に応じて、URL のバリエーション(異なるパスやクエリパラメーターなど)を考慮するために **URL contains** または **Matches the regular expression** のいずれかを使用できます。URL に変動する可能性のあるパラメーターが含まれる可能性が高いため、**Corresponds exactly to** の使用は避けてください。

<Note>
  **Access to a page** ゴールタイプを使用するとき、訪問者が(たとえばホームページに)リダイレクトされることなく確認ページをリロードできる場合、ゴールが再びトリガーされる可能性があります。これがセットアップである場合、過剰カウントを避けるために、Results ページで **all conversions** ではなく **converted visits** メトリクスに頼るのが最善です。
</Note>

* **Custom goal:** このゴールタイプは、確認ページがリロードされた場合にゴールが再度コンバートしないようにするのに便利です。グローバルカスタムスクリプトでカスタムゴールを実装し、`sessionStorage` チェックを使用して重複コンバージョンを防止できます(以下のコード例を参照)。同じコードを使用して収益ゴールをトリガーでき、ネイティブの **Access to a page** ゴールの必要性を排除することでパフォーマンスを向上させるため、このアプローチが推奨されます。

```javascript theme={null}
if (
   document.location.href.includes("/confirmation/") &&
   !window.sessionStorage.getItem("kameleoonGoalConverted")
 ) {
   // Set an item in sessionStorage to prevent a second conversion if the page is reloaded
   window.sessionStorage.setItem("kameleoonGoalConverted", "true");
   // Convert the transaction goal, replace the ID below
   Kameleoon.API.Goals.processConversion(355733);
 } else if (!document.location.href.includes("confirmation")) {
   // Remove the item from sessionStorage to allow conversion for a new transaction
   window.sessionStorage.removeItem("kameleoonGoalConverted");
 }
```

### 収益フォーマット

収益金額が処理前に適切にフォーマットおよび検証されていることを確認します。以下を含みます:

* 小数の一貫性のためにカンマ (`,`) をピリオド (`.`) に置き換えます。
* スペースを削除します(1,000 を超える金額にある可能性があります)。
* 通貨記号(`$` など)を取り除きます。
* 正確な計算のために、クリーニングされた文字列を数値データ型に変換します。

例:

```javascript theme={null}
let revenue = parseFloat(revenue.replace(",", ".").replace(/[^0-9.]/g, "").replace(/\s+/g, ""));
```

### 通貨

Web サイトは複数の通貨をサポートする場合があります。誤解を招く結果や誤った分析を避けるために、コンバージョン値をすべて同じ通貨で比較するようにしてください。トラッキングとレポーティングで使用される通貨がすべてのコンバージョン間で一貫していることを確認してください。

通貨ごとにゴールをトリガーすることや、Kameleoon の通貨変換 Web サービスを使用することができます。エンドポイントは以下に提供されています。渡されるすべての引数が有効であることを確認してください。

```
<https://customers.kameleoon.com/kameleoon/currencies/convert?inputCurr=${inputCurr}&outputCurr=${outputCurr}&amount=${revenue}>;
```

<Warning>
  異なる通貨の金額を使用して同じゴールを変換しないでください。通貨ごとに別々のゴールを作成するか、上記の Web サービスエンドポイントを使用してグローバルゴールを設定して統一する必要があります。このサービスは、すべての金額を選択した単一の通貨に変換します。
</Warning>

通貨変換 Web サービスの詳細な実装については、この記事の最後にある完全なコード例を参照してください。

### 注文 ID

注文 ID(注文番号)を保存するために[カスタムデータ](../custom-data/create-custom-data)を追加し、収益ゴールの[メタデータ](./create-a-goal#メタデータ)として使用する必要があります。このカスタムデータは、各コンバージョンを注文 ID にリンクし、分析ツールとトランザクションを正確にマッチさせ、潜在的なデータの不一致を調査するのに役立ちます。

カスタムデータを設定するには、以下のスクリーンショットを参照してください。サイトの注文 ID が数値か文字列かに応じてフォーマットを調整します。

<img src="https://storage.googleapis.com/kameleoon-storage-documentation/user-manual/images/assets/goals/revenue-goal/new-custom-data.png" alt="New custom data configuration for Order ID" width="65%" style={{display: 'block', margin: '0 auto'}} />

**OrderID** カスタムデータを収益ゴールに関連付けるには:

1. ゴール作成フローで、ゴールの情報を入力し、ゴールタイプとして **カスタムゴール** を選択します。
2. **次へ** > **詳細設定** をクリックします。
3. **メタデータを収集し、ゴールをカスタムデータに関連付ける** をオンにします。
4. ドロップダウンから **OrderID** を選択します。

<Frame>
  ![](https://storage.googleapis.com/kameleoon-storage-documentation/user-manual/images/assets/goals/revenue-goal/associate-custom-data.png)
</Frame>

カスタムデータの値を設定する以下の完全なコードサンプルを参照してください。

## 完全な例

*この例は WE 用ですが、FE での実装のリファレンスとして使用できます。*

スコープ、トランザクションロジック、収益フォーマット、通貨処理、注文 ID トラッキングなど、各主要要素を確認したので、すべてをまとめる準備ができました。

以下は、Kameleoon でグローバルカスタムスクリプトを使用して収益ゴールを実装する完全な例です。

```javascript theme={null}
 // Amount conversion using Kameleoon's currency conversion web service
 const convertCurrency = async (revenue, inputCurr, outputCurr) => {
     if (revenue == 0) return 0;
     const response = await fetch(
         `https://customers.kameleoon.com/kameleoon/currencies/convert?inputCurr=${inputCurr}&outputCurr=${outputCurr}&amount=${revenue}`,
         {
             method: 'GET',
             headers: {
                 'Content-Type': 'text/plain',
             },
         }
     );
     return response.json();
 };
 

 // Logic to:
 // - Convert the transaction goal 
 // - Convert a goal for each currency
 // - Convert the global revenue goal
 // - Set the orderID custom data
 // repalce all goal IDs in the code
 if (document.location.href.includes("/confirmation/") && !window.sessionStorage.getItem("kameleoonGoalConverted")) {
     Kameleoon.API.Goals.processConversion(355733); // Transaction goal
     sessionStorage.setItem("kameleoonGoalConverted", "true");
 

     let revenueLayer;
     Kameleoon.API.Core.runWhenConditionTrue(() => {
         revenueLayer = window.dataLayer?.find(layer => layer.ecommerce?.purchase?.actionField?.revenue);
         return revenueLayer;
     }, () => {
         let revenue = parseFloat(revenueLayer.ecommerce.purchase.actionField.revenue);
         const inputCurr = revenueLayer.ecommerce.purchase.actionField.inputCurrency;
         const orderID = revenueLayer.ecommerce.purchase.actionField.orderID;
 

         if (!isNaN(revenue)) {
             revenue = revenue.toString().replace(",", ".").replace(/[^0-9.]/g, "").replace(/\s+/g, "");
             // Currency-specific revenue goals
             switch (inputCurr) {
                 case 'GBP':
                     Kameleoon.API.Goals.processConversion(355641, revenue);
                     break;
                 case 'USD':
                     Kameleoon.API.Goals.processConversion(355643, revenue);
                     break;
                 case 'EUR':
                     Kameleoon.API.Goals.processConversion(355642, revenue);
                     break;
                 default:
                     Kameleoon.API.Goals.processConversion(355649); // Other currencies (no revenue passed)
             }
             // Global revenue goal in output currency (you can use ISO 4217 codes for each country)
             const outputCurr = "USD";
             convertCurrency(revenue, inputCurr, outputCurr).then((convertedRevenue) => {
                 // The custom data must be set before the goal is converted
                 Kameleoon.API.Data.setCustomData("orderID", orderID);
                 Kameleoon.API.Goals.processConversion(353518, convertedRevenue);
             }).catch((error) => {
// Create a Custom Data to store potential errors for debugging
                 Kameleoon.API.Data.setCustomData("[KAM] - currency webservice error", `error: ${error.toString()}; revenue: ${revenue}; inputCurr ${inputCurr}; outputCurr ${outputCurr}`);
                 console.error("Error in currency conversion:", error);
             });
         }
     });
 } else if (!document.location.href.includes("/confirmation/")) {
     sessionStorage.removeItem("kameleoonGoalConverted");
 } 
```

以下は、参照用の確認ページの `dataLayer` 構造のスクリーンショットです。

<Frame>
  ![](https://storage.googleapis.com/kameleoon-storage-documentation/user-manual/images/assets/goals/revenue-goal/image-43-1-1536x631.png)
</Frame>

Kameleoon で信頼性の高い収益ゴールを設定するには、サイトの構造、`dataLayer` のセットアップ、通貨フォーマットとの慎重な調整が必要です。タグマネージャーまたはグローバルカスタムスクリプトのいずれかを介して上記のガイドラインに従うことで、正確なトラッキングを保証し、分析ツールとの不一致を減らし、エクスペリメントからより意味のあるインサイトを得ることができます。データの整合性を維持するために、徹底的にテストし、実装を検証することを忘れないでください。
