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

# カスタムOutcomes

> OneSignal Custom Outcomesを使用して、プッシュ通知とアプリ内メッセージからのユーザーアクションと収益を追跡する方法を学びます。アトリビューションをカスタマイズし、プラットフォーム間で柔軟なoutcomeタイプでエンゲージメントを測定します。

<Warning>
  **Custom Outcomesは廃止予定です。** プッシュ、メール、SMS、アプリ内、RCSにわたるクロスチャネルのラストタッチアトリビューションを提供する[コンバージョン指標](./conversion-metrics)に置き換えられます。コンバージョントラッキングを初めて設定する場合は、代わりに[コンバージョン指標](./conversion-metrics)をご利用ください。

  既存のCustom Outcomesデータは履歴データとしてアクセス可能な状態が維持されます。
</Warning>

OneSignal Custom Outcomesを使用すると、プッシュ通知とアプリ内メッセージから生じる意味のあるユーザーアクションを追跡できます。これらのアクション（購入、サインアップ、アプリイベントなど）は、カウント、合計、ユニークメトリクスで追跡でき、メッセージングキャンペーンの影響についての洞察が得られます。

<Info> Custom Outcomesは、**Professional**および**Enterprise**プランで利用できます。[料金](https://onesignal.com/pricing)の詳細をご覧ください。 </Info>

***

## Outcomeタイプ & SDKメソッド

ユーザーが特定のアクション（例：「カートに追加」または「アップグレード」をタップ）を完了したときに、コードの行を追加してOutcomeをトリガーできます。

| Outcomeタイプ         |                            Mobile SDKメソッド                           |                          Web SDKメソッド                         | 説明                                                                                |
| ------------------ | :-----------------------------------------------------------------: | :----------------------------------------------------------: | --------------------------------------------------------------------------------- |
| **Standard Count** |          [`addOutcome`](./mobile-sdk-reference#addoutcome)          |       [`sendOutcome`](./web-sdk-reference#sendoutcome)       | 呼び出されるたびにカウントを1ずつ増やします。値の追跡はありません。                                                |
| **Value (Sum)**    | [`addOutcomeWithValue`](./mobile-sdk-reference#addoutcomewithvalue) |       [`sendOutcome`](./web-sdk-reference#sendoutcome)       | カウントを1ずつ増やし、指定された数値で合計を増やします。収益追跡に便利です。                                           |
| **Unique Count**   |    [`addUniqueOutcome`](./mobile-sdk-reference#adduniqueoutcome)    | [`sendUniqueOutcome`](./web-sdk-reference#senduniqueoutcome) | アトリビューションウィンドウごとに1回だけカウントを1ずつ増やします。「Swipeセッション開始」や「CTAをタップ」などのバイナリユーザーアクションに最適です。 |

<Info> Outcomeイベントは、オフラインの場合にローカルにキャッシュされ、次のOneSignal初期化時に再試行されます。 </Info>

***

## カウント vs 合計

Outcomesは2つの主要なメトリクスをサポートします：

| メトリクス     | 説明                             |
| --------- | ------------------------------ |
| **Count** | outcomeイベントがトリガーされた回数          |
| **Sum**   | outcomeで送信されたすべての数値の合計（該当する場合） |

値を持つOutcomesは、常に最も近い整数に丸められます。

**例**：購入からの収益を追跡するには：

<CodeGroup>
  ```java java theme={null}
  // "Purchase" button pressed in the app
     ...
     OneSignal.Session.addOutcomeWithValue("Purchase", 18.76);
  ```

  ```objectivec objectivec theme={null}
  // "Purchase" button pressed in the app
     ...
     [OneSignal.Session addOutcomeWithValue:@"Purchase" value:18.76]
  ```

  ```javascript javascript theme={null}
  //Purchase Button pressed on site
  OneSignal.Session.addOutcomeWithValue("Purchase", 20.2);
  ```

  ```javascript Javascript(Web SDK) theme={null}
  //Purchase Button pressed on site
  OneSignal.Session.sendOutcome("Purchase", 20.20);
  ```

  ```swift Swift theme={null}
  let value = "20.20"//you supply the value
  OneSignal.Session.addOutcome(withValue: "Purchase", value: NSNumber(value:value), onSuccess: {outcomeSent in
    print("outcome sent: \(outcomeSent!.name) with random value: \(value)" )
  })
  ```

  ```csharp Unity(C#) theme={null}
  //Send an outcome
  OneSignal.Session.AddOutcome("outcomeName");

  //Send a unique outcome
  OneSignal.Session.AddUniqueOutcome("uniqueOutcomeName");

  //Send an outcome with a float value
  OneSignal.Session.AddOutcomeWithValue("outcomeWithVal", 4.2f);
  ```
</CodeGroup>

***

## Outcomeアトリビューション

各Outcomeは、それがどのように生成されたかを説明するアトリビューションタイプで追跡されます：

* **direct** — ユーザーがメッセージと直接やり取りしたときにOutcomeが発生しました。`os__click`や`os__confirmed_delivery`などの一部のOutcomesは、メッセージの結果としてのみ発生するため、直接アトリビューションのみを持ちます。
* **influenced** — メッセージが送信された後、アトリビューション時間ウィンドウ内でOutcomeが発生しましたが、ユーザーはメッセージと直接やり取りしませんでした。
* **unattributed** — メッセージとの直接的または影響関係なしにOutcomeが発生しました。
* **total** *(デフォルト)* — **direct + influenced + unattributed**の合計。

## ユースケース

### Eコマースサイト

オンラインストアは、OneSignalプッシュ通知を使用して、ユーザーを放棄されたカート、フラッシュセール、プロモーションなどに呼び戻すことができます。**Outcomes**を使用すると、ストアオーナーは、カートへの追加、購入、またはクーポンの引き換えなどのユーザーアクションとプッシュ通知を簡単に関連付けることができます。購入の場合、outcomesは単純なカウント以上に進み、購入金額を追跡できます。これにより、サイトオーナーは個々のプッシュから生成された収益の合計を簡単に表示できます。

<CodeGroup>
  ```java java theme={null}
  OneSignal.Session.addOutcomeWithValue("Purchase", 18.76);
  ```

  ```objectivec objectivec theme={null}
  [OneSignal.Session addOutcomeWithValue:@"Purchase" value:18.76]
  ```

  ```javascript javascript theme={null}
  OneSignal.Session.addOutcomeWithValue("Purchase", 18.76);
  ```

  ```Text Javascript(Web SDK) theme={null}
  OneSignal.Session.sendOutcome("Purchase", 18.76);
  ```

  ```csharp Unity(C#) theme={null}
  OneSignal.Session.AddOutcomeWithValue("Purchase", 18.76);
  ```
</CodeGroup>

### ソーシャルアプリ

ソーシャルアプリは、プッシュを使用してマッチまたは友達リクエスト、新しいいいね、または単にスワイプさせることでユーザーを再エンゲージしたい場合があります。**Outcomes**を使用することで、開発者は、プッシュ通知がマッチとのチャットの開始や34秒のスワイプセッションなどのユーザーイベントにつながったかどうかを確認できます。これらのデータは、通知とターゲティング戦略を改善するために使用できます。

次の例では、プッシュ後にユーザーがデートプロフィールのスワイプを開始したかどうかを追跡したいと考えています。すべてのスワイプをコンバージョンとしてカウントしたくないため、`sendUniqueOutcome`を使用します。

この「Swipe」outcomeは、それをトリガーしたプッシュに1回だけアトリビューションされます。例：

* ユーザーがプッシュをクリックし、このメソッドを呼び出すアクションを実行した場合、直接アトリビューションになります。
* ユーザーがプッシュを受信したがクリックせず、アトリビューションウィンドウ内でアクションを実行した場合、影響アトリビューションになります。後で同じプッシュをクリックして再度アクションを実行しても、影響のままです。
* ユーザーがアトリビューションウィンドウ外でメソッドを実行した場合、セッションごとに1回unattributedになります。

<CodeGroup>
  ```java Java theme={null}
  OneSignal.Session.addUniqueOutcome("Swipe");
  ```

  ```objectivec Objective-C theme={null}
  [OneSignal.Session addUniqueOutcome:@"Swipe"]
  ```

  ```javascript JavaScript theme={null}
  OneSignal.Session.addUniqueOutcome("my_outcome_event");
  ```

  ```csharp C# theme={null}
  OneSignal.Session.AddUniqueOutcome("swipe");
  ```
</CodeGroup>

### 言語別のプッシュクリック

SDKのNotification Opened/Clickedリスナーメソッド内で、設定された言語でプッシュをクリックしたデバイスの数を増やすようにOutcomesをセットアップできます。これには、デバイスの言語を検出するためのネイティブコードが必要ですが、その後、次のようにその言語をOutcomeに渡すことができます：

<CodeGroup>
  ```java Java theme={null}
    public void notificationOpened(OSNotificationOpenResult result) {
      String languageCode = Locale.getDefault().getLanguage();
      System.out.println("languageCode " + languageCode);
      OneSignal.Session.addOutcome(languageCode);
    }
  ```

  ```swift Swift theme={null}
  let notificationOpenedBlock: OSHandleNotificationActionBlock = { result in
    // This block gets called when the user reacts to a notification received
    if let languageCode = Locale.current.languageCode {
        print ("languageCode: " + languageCode);
        OneSignal.Session.addOutcome(languageCode);
    }
  }
  ```

  ```javascript JavaScript theme={null}
  var language = navigator.language;
  OneSignal.Session.addOutcome(language);
  ```
</CodeGroup>

### オペレーティングシステムとブラウザ別のプッシュクリック

SDKのNotification Opened/Clickedリスナーメソッド内で、どのプラットフォームが具体的にクリックされたかを増やすようにOutcomesをセットアップできます。これは、モバイルアプリのクリックハンドラーで`OneSignal.addOutcome("iOS")`または`OneSignal.addOutcome("Android")`を設定できるため、iOSとAndroidでは一般的ですが、Webプッシュプラットフォームも追跡したい場合は、たとえば次を使用できます：

<CodeGroup>
  ```javascript Javascript(Web SDK) theme={null}
  // Example taken from Stackoverflow: https://stackoverflow.com/questions/11219582/how-to-detect-my-browser-version-and-operating-system-using-javascript
  var os = "Unknown OS";
  if (navigator.userAgent.indexOf("Win") != -1) os = "Windows";
  if (navigator.userAgent.indexOf("Mac") != -1) os = "Macintosh";
  if (navigator.userAgent.indexOf("Linux") != -1) os = "Linux";
  if (navigator.userAgent.indexOf("Android") != -1) os = "Android";
  if (navigator.userAgent.indexOf("like Mac") != -1) os = "iOS";
  console.log('Your os: ' + os);

  var browserType = "Unknown Browser Type";
  if (navigator.userAgent.indexOf("Safari") != -1) browserType = "Safari";
  if (navigator.userAgent.indexOf("Chrome") != -1) browserType = "Chrome";
  if (navigator.userAgent.indexOf("OPR") != -1) browserType = "Opera";
  if (navigator.userAgent.indexOf("Firefox") != -1) browserType = "Firefox";
  console.log('Your Browser: ' + browserType);

  OneSignal.push(["addListenerForNotificationOpened", function(data) {
  OneSignal.Session.sendOutcome(os);
  OneSignal.Session.sendOutcome(browserType);
  }]);

  ```
</CodeGroup>

***

## Outcomeトラッキングを無効にする

ダッシュボード**Settings > Push & In-App > Outcomes Tracking**で特定のOutcomesの追跡を無効にします。

ここから、**Stop Tracking**ボタンをクリックして、ダッシュボードで追跡を停止するoutcomeを選択できます。outcomesの追跡を停止すると、ここにリストされ、**Start Tracking**リンクをクリックして再度追跡を開始できます。

***

## FAQ

### Outcomeデータはどのくらいの期間保存されますか？

* ダッシュボードから送信された通知は、Outcomeデータを永久に保持します。
* API経由で送信された通知は、パージされる前にoutcomesを30日間保持します。

### どのチャネルがカスタムoutcomesをサポートしていますか？

現在、カスタムoutcomesはPushとIn-App Messagesのアクションにのみ追加できます。

In-App messagesを介して送信されたOutcomesは「Unattributed」として表示され、デバイスに`outcome name : true`の形式でタグを設定します。

### Outcomesをエクスポートできますか？

一連のoutcomesまたはすべてのoutcomesをCSVとしてエクスポートできます。[個別の通知](/reference/view-message)または[すべての通知](/reference/view-outcomes)のoutcomesへのAPIアクセスも提供しています。

### Custom Outcomesの値として文字列を保存できますか？

これはサポートされていません。

### デバイスがオフラインの場合はどうなりますか？

発火されたoutcomesのデータは、デバイスが再びオンラインになったときにOneSignalに送信されるようにキューに入れられます。

### ユーザーが通知をクリックした後にアプリをバックグラウンドにし、その後戻ってOutcomeを発火した場合、それは直接または影響とカウントされますか？

ユーザーがバックグラウンドにした後30秒以内にアプリに戻る限り、セッションはまだ元のセッションと見なされ、直接アトリビューションを取得します。

### 新しいAttribution Windowはいつ有効になりますか？

たとえば、アトリビューションウィンドウを24時間から1時間に変更すると、各デバイスが新しいセッションからアプリを開くと、デバイスごとに1時間のウィンドウが有効になります。この新しいセッションは、アプリ外に30秒いた後に作成されます。

### セッションが他の分析と一致しないのはなぜですか？

OneSignalは、ユーザーがアプリを30秒以上離れた後にのみセッションをカウントします。アプリまたはウェブサイトを閉じて30秒以内に戻った場合、新しいセッションにはなりません。

たとえば、Appleの分析は、アプリが少なくとも2秒間使用された回数としてセッションを追跡します。アプリがバックグラウンドにあり、後で再び使用された場合、それは別のセッションとしてカウントされます。

***
