> ## 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.

# Custom Outcomes

> Aprenda como rastrear ações do usuário e receita de notificações push e mensagens in-app usando OneSignal Custom Outcomes. Personalize a atribuição e meça o engajamento com tipos de outcome flexíveis entre plataformas.

<Warning>
  **Custom Outcomes está sendo descontinuado.** É substituído pelas [métricas de conversão](./conversion-metrics), que fornecem atribuição de último toque multicanal em push, e-mail, SMS, in-app e RCS. Se você está configurando o rastreamento de conversões pela primeira vez, use [métricas de conversão](./conversion-metrics) em vez disso.

  Os dados existentes de Custom Outcomes permanecem acessíveis como dados históricos.
</Warning>

OneSignal Custom Outcomes permitem que você rastreie ações significativas do usuário resultantes de notificações push e mensagens in-app. Essas ações—como compras, inscrições ou eventos do aplicativo—podem ser rastreadas com métricas de contagem, soma e únicas, dando-lhe insights sobre o impacto de suas campanhas de mensagens.

<Info> Custom Outcomes estão disponíveis nos planos **Professional** e **Enterprise**. Saiba mais sobre nossos [preços](https://onesignal.com/pricing). </Info>

***

## Tipos de outcome e métodos SDK

Você pode acionar um Outcome adicionando uma linha de código quando um usuário completa uma ação específica (por exemplo, toca em "Adicionar ao Carrinho" ou "Upgrade").

| Tipo de Outcome    |                           Método SDK Móvel                          |                        Método SDK Web                        | Descrição                                                                                                                                                |
| ------------------ | :-----------------------------------------------------------------: | :----------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Standard Count** |          [`addOutcome`](./mobile-sdk-reference#addoutcome)          |       [`sendOutcome`](./web-sdk-reference#sendoutcome)       | Aumenta a contagem em 1 toda vez que é chamado. Sem rastreamento de valor.                                                                               |
| **Value (Sum)**    | [`addOutcomeWithValue`](./mobile-sdk-reference#addoutcomewithvalue) |       [`sendOutcome`](./web-sdk-reference#sendoutcome)       | Aumenta a contagem em 1 e a soma pelo valor numérico especificado. Útil para rastreamento de receita.                                                    |
| **Unique Count**   |    [`addUniqueOutcome`](./mobile-sdk-reference#adduniqueoutcome)    | [`sendUniqueOutcome`](./web-sdk-reference#senduniqueoutcome) | Aumenta a contagem em 1, apenas uma vez por janela de atribuição. Melhor para ações binárias de usuário como "Sessão de Swipe Iniciada" ou "CTA Tocado". |

<Info> Eventos de outcome são armazenados em cache localmente se offline e tentados novamente na próxima inicialização do OneSignal. </Info>

***

## Count vs sum

Outcomes suportam duas métricas principais:

| Métrica   | Descrição                                                                 |
| --------- | ------------------------------------------------------------------------- |
| **Count** | Número de vezes que o evento de outcome foi acionado                      |
| **Sum**   | Total de todos os valores numéricos enviados com o outcome (se aplicável) |

Outcomes com valores sempre arredondam para o número inteiro mais próximo.

**Exemplo**: Para rastrear receita de uma compra:

<CodeGroup>
  ```java java theme={null}
  // Botão "Purchase" pressionado no aplicativo
     ...
     OneSignal.Session.addOutcomeWithValue("Purchase", 18.76);
  ```

  ```objectivec objectivec theme={null}
  // Botão "Purchase" pressionado no aplicativo
     ...
     [OneSignal.Session addOutcomeWithValue:@"Purchase" value:18.76]
  ```

  ```javascript javascript theme={null}
  //Botão Purchase pressionado no site
  OneSignal.Session.addOutcomeWithValue("Purchase", 20.2);
  ```

  ```javascript Javascript(Web SDK) theme={null}
  //Botão Purchase pressionado no site
  OneSignal.Session.sendOutcome("Purchase", 20.20);
  ```

  ```swift Swift theme={null}
  let value = "20.20"//você fornece o valor
  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}
  //Enviar um outcome
  OneSignal.Session.AddOutcome("outcomeName");

  //Enviar um outcome único
  OneSignal.Session.AddUniqueOutcome("uniqueOutcomeName");

  //Enviar um outcome com um valor float
  OneSignal.Session.AddOutcomeWithValue("outcomeWithVal", 4.2f);
  ```
</CodeGroup>

***

## Atribuição de outcome

Cada Outcome é rastreado com um tipo de atribuição que explica como foi gerado:

* **direct** — o Outcome ocorreu quando o usuário interagiu diretamente com a mensagem. Alguns Outcomes, como `os__click` e `os__confirmed_delivery`, têm apenas atribuição direta porque acontecem apenas como resultado da mensagem.
* **influenced** — o Outcome ocorreu dentro da janela de tempo de atribuição após a mensagem ser enviada, mas o usuário nunca interagiu diretamente com a mensagem.
* **unattributed** — o Outcome ocorreu sem uma relação direta ou influenciada com a mensagem.
* **total** *(padrão)* — a soma de **direct + influenced + unattributed**.

## Casos de uso

### Site de e-commerce

Lojas online podem usar notificações push do OneSignal para levar usuários de volta a carrinhos abandonados, vendas relâmpago, promoções e mais. Com **Outcomes**, proprietários de lojas agora podem facilmente correlacionar notificações push a ações do usuário como adicionar ao carrinho, compra ou cupom resgatado. Para compras, outcomes vão ainda mais além do que simples contagens e podem rastrear valores de compra. Isso permite que proprietários de sites vejam facilmente a soma total da receita gerada por pushes individuais.

<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>

### Aplicativos sociais

Aplicativos sociais podem querer reengajar usuários usando um push para notificá-los de um match ou solicitação de amizade, um novo like ou simplesmente para fazê-los deslizar. Usando **Outcomes**, um desenvolvedor pode ver se uma notificação push levou a um evento de usuário como iniciar um chat com um match ou uma sessão de 34 segundos de swipe. Esses dados podem então ser usados para refinar estratégias de notificação e segmentação.

No exemplo a seguir, queremos rastrear se um usuário começou a deslizar perfis de namoro após um push. Como não queremos contar cada swipe como uma conversão, usamos `sendUniqueOutcome`

Este outcome "Swipe" só será atribuído uma vez ao push que o acionou. Exemplos:

* Se o usuário clicou no push e realizou a ação que chamou este método, será uma atribuição direta.
* Se o usuário recebeu o push mas não clicou nele e realizou a ação dentro da janela de atribuição, será uma atribuição influenciada. Mesmo se mais tarde clicar no mesmo push e realizar a ação novamente, ainda será apenas influenciada.
* Se o usuário executar o método fora de uma janela de atribuição, será não atribuído uma vez por sessão.

<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>

### Pushes clicados por idioma

Dentro dos métodos listener de Notificação Aberta/Clicada do nosso SDK, você pode configurar Outcomes para incrementar quantos dispositivos clicaram em um push por seu idioma definido. Isso exigirá algum código nativo para detectar o idioma do dispositivo, mas você pode então passar esse idioma para o Outcome assim:

<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
    // Este bloco é chamado quando o usuário reage a uma notificação recebida
    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>

### Pushes clicados por sistema operacional e navegador

Dentro dos métodos listener de Notificação Aberta/Clicada do nosso SDK, você pode configurar Outcomes para incrementar quais plataformas especificamente foram clicadas. Isso é genérico para iOS e Android como você pode definir `OneSignal.addOutcome("iOS")` ou `OneSignal.addOutcome("Android")` no manipulador de clique do seu aplicativo móvel, mas se você quiser rastrear plataformas de push web também, você pode usar isto por exemplo:

<CodeGroup>
  ```javascript Javascript(Web SDK) theme={null}
  // Exemplo retirado do 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>

***

## Desabilitar rastreamento de Outcome

Desabilite Outcomes específicos de serem rastreados no painel **Settings > Push & In-App > Outcomes Tracking**.

A partir daqui, você pode clicar no botão **Stop Tracking** para selecionar um outcome para parar de rastrear no painel. Uma vez que você parou de rastrear outcomes, você os verá listados aqui e pode começar a rastreá-los novamente clicando no link **Start Tracking**.

***

## FAQ

### Por quanto tempo os dados de Outcome são armazenados?

* Notificações enviadas do painel mantêm seus dados de Outcome para sempre.
* Notificações enviadas via API têm uma retenção de 30 dias de outcomes antes de serem purgados.

### Quais canais suportam custom outcomes?

Atualmente custom outcomes podem ser adicionados a ações em Push e Mensagens In-App apenas.

Outcomes enviados através de mensagens In-App aparecerão como "Unattributed" e definirão uma tag no dispositivo no formato: `nome do outcome : true`.

### Posso exportar Outcomes?

Você pode exportar um conjunto de outcomes ou todos os outcomes como um CSV. Também fornecemos acesso à API para outcomes para uma [notificação individual](/reference/view-message) ou para [todas as notificações](/reference/view-outcomes).

### Posso armazenar strings como valores em Custom Outcomes?

Isso não é suportado.

### O que acontece se um dispositivo estiver offline?

Dados de outcomes disparados são enfileirados para serem enviados ao OneSignal uma vez que o dispositivo esteja online novamente.

### Se um usuário coloca o aplicativo em segundo plano após clicar em uma notificação e depois volta a ele, disparando um Outcome, ele é contado como direto ou influenciado?

Enquanto o usuário retornar ao aplicativo dentro de 30 segundos após colocá-lo em segundo plano, a sessão ainda será considerada a sessão original e obterá atribuição direta.

### Quando a nova Janela de Atribuição entra em vigor?

Se você alterar a janela de atribuição de 24 horas para 1 hora, por exemplo, então a janela de 1 hora entrará em vigor por dispositivo uma vez que cada dispositivo abra o aplicativo de uma nova sessão. Esta nova sessão é criada após 30 segundos de estar fora do aplicativo.

### Por que as sessões não correspondem com outras análises?

O OneSignal só conta uma sessão após o usuário ter saído do aplicativo por mais de 30 segundos. Se você fechar o aplicativo ou site e retornar a ele dentro de 30 segundos, não será uma nova sessão.

Por exemplo, as análises da Apple rastreiam a sessão como o número de vezes que o aplicativo foi usado por pelo menos dois segundos. Se o aplicativo está em segundo plano e é usado novamente depois, isso conta como outra sessão.

***
