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

> Aprenda cómo rastrear acciones de usuarios e ingresos de notificaciones push y mensajes in-app usando OneSignal Custom Outcomes. Personalice la atribución y mida la participación con tipos de outcomes flexibles en todas las plataformas.

<Warning>
  **Los Outcomes personalizados están siendo reemplazados.** Son reemplazados por las [métricas de conversión](./conversion-metrics), que proporcionan atribución de último contacto multicanal en push, email, SMS, en la aplicación y RCS. Si estás configurando el seguimiento de conversiones por primera vez, usa [métricas de conversión](./conversion-metrics) en su lugar.

  Los datos existentes de Outcomes personalizados siguen siendo accesibles como datos históricos.
</Warning>

Los Outcomes personalizados de OneSignal le permiten rastrear acciones significativas de usuarios resultantes de notificaciones push y mensajes in-app. Estas acciones—como compras, registros o eventos de aplicación—pueden rastrearse con métricas de conteo, suma y únicas, brindándole información sobre el impacto de sus campañas de mensajería.

<Info> Los Outcomes personalizados están disponibles en los planes **Professional** y **Enterprise**. Obtenga más información sobre nuestros [precios](https://onesignal.com/pricing). </Info>

***

## Tipos de outcomes y métodos del SDK

Puede activar un Outcome agregando una línea de código cuando un usuario completa una acción específica (por ejemplo, toca "Agregar al carrito" o "Actualizar").

| Tipo de Outcome     |                         Método del SDK móvil                        |                      Método del SDK web                      | Descripción                                                                                                                                                     |
| ------------------- | :-----------------------------------------------------------------: | :----------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Conteo estándar** |          [`addOutcome`](./mobile-sdk-reference#addoutcome)          |       [`sendOutcome`](./web-sdk-reference#sendoutcome)       | Aumenta el conteo en 1 cada vez que se llama. Sin seguimiento de valor.                                                                                         |
| **Valor (Suma)**    | [`addOutcomeWithValue`](./mobile-sdk-reference#addoutcomewithvalue) |       [`sendOutcome`](./web-sdk-reference#sendoutcome)       | Aumenta el conteo en 1 y la suma por el valor numérico especificado. Útil para rastrear ingresos.                                                               |
| **Conteo único**    |    [`addUniqueOutcome`](./mobile-sdk-reference#adduniqueoutcome)    | [`sendUniqueOutcome`](./web-sdk-reference#senduniqueoutcome) | Aumenta el conteo en 1, solo una vez por ventana de atribución. Mejor para acciones de usuario binarias como "Sesión de deslizamiento iniciada" o "CTA tocado". |

<Info> Los eventos de outcomes se almacenan localmente en caché si están sin conexión y se reintentan en la siguiente inicialización de OneSignal. </Info>

***

## Conteo vs suma

Los outcomes admiten dos métricas clave:

| Métrica    | Descripción                                                              |
| ---------- | ------------------------------------------------------------------------ |
| **Conteo** | Número de veces que se activó el evento de outcome                       |
| **Suma**   | Total de todos los valores numéricos enviados con el outcome (si aplica) |

Los outcomes con valores siempre se redondean al número entero más cercano.

**Ejemplo**: Para rastrear ingresos de una compra:

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

***

## Atribución de outcomes

Cada Outcome se rastrea con un tipo de atribución que explica cómo se generó:

* **directo** — el Outcome ocurrió cuando el usuario interactuó directamente con el mensaje. Algunos Outcomes, como `os__click` y `os__confirmed_delivery`, solo tienen atribución directa porque ocurren únicamente como resultado del mensaje.
* **influenciado** — el Outcome ocurrió dentro de la ventana de tiempo de atribución después de que se envió el mensaje, pero el usuario nunca interactuó directamente con el mensaje.
* **no atribuido** — el Outcome ocurrió sin una relación directa o influenciada con el mensaje.
* **total** *(predeterminado)* — la suma de **directo + influenciado + no atribuido**.

## Casos de uso

### Sitio de comercio electrónico

Las tiendas en línea pueden usar notificaciones push de OneSignal para llevar a los usuarios de vuelta a carritos abandonados, ventas flash, promociones y más. Con **Outcomes**, los propietarios de tiendas ahora pueden correlacionar fácilmente las notificaciones push con acciones de usuario como agregar al carrito, compra o cupón canjeado. Para compras, los outcomes van más allá de simples conteos y pueden rastrear montos de compra. Esto permite a los propietarios del sitio ver fácilmente el total de ingresos generados por pushes individuales.

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

### Aplicaciones sociales

Las aplicaciones sociales pueden querer re-involucrar a los usuarios usando un push para notificarles de una coincidencia o solicitud de amistad, un nuevo me gusta, o simplemente para que comiencen a deslizar. Al usar **Outcomes**, un desarrollador puede ver si una notificación push llevó a un evento de usuario como iniciar un chat con una coincidencia o una sesión de deslizamiento de 34 segundos. Estos datos pueden luego usarse para refinar estrategias de notificación y segmentación.

En el siguiente ejemplo, queremos rastrear si un usuario comenzó a deslizar perfiles de citas después de un push. Dado que no querríamos contar cada deslizamiento como una conversión, usamos `sendUniqueOutcome`

Este outcome "Swipe" solo se atribuirá una vez al push que lo activó. Ejemplos:

* Si el usuario hizo clic en el push y realizó la acción que llamó a este método, será una atribución directa.
* Si el usuario recibió el push pero no hizo clic en él y realizó la acción dentro de la ventana de atribución, será una atribución influenciada. Incluso si luego hacen clic en el mismo push y realizan la acción nuevamente, seguirá siendo solo influenciada.
* Si el usuario realiza el método fuera de una ventana de atribución, no se atribuirá una vez por sesión.

<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 de los métodos de escucha de notificación abierta/clicada de nuestro SDK, puede configurar Outcomes para incrementar cuántos dispositivos clicaron un push por su idioma configurado. Esto requerirá algo de código nativo para detectar el idioma del dispositivo, pero luego puede pasar ese idioma al Outcome de esta manera:

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

### Pushes clicados por sistema operativo y navegador

Dentro de los métodos de escucha de notificación abierta/clicada de nuestro SDK, puede configurar Outcomes para incrementar qué plataformas específicamente fueron clicadas. Esto es genérico para iOS y Android ya que puede establecer `OneSignal.addOutcome("iOS")` o `OneSignal.addOutcome("Android")` en el controlador de clics de su aplicación móvil, pero si también desea rastrear plataformas de push web, puede usar esto por ejemplo:

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

***

## Deshabilitar el seguimiento de Outcomes

Deshabilite Outcomes específicos para que no se rastreen en el panel **Settings > Push & In-App > Outcomes Tracking**.

Desde aquí, puede hacer clic en el botón **Stop Tracking** para seleccionar un outcome para dejar de rastrear en el panel. Una vez que haya dejado de rastrear outcomes, los verá listados aquí y puede comenzar a rastrearlos nuevamente haciendo clic en el enlace **Start Tracking**.

***

## Preguntas frecuentes

### ¿Cuánto tiempo se almacenan los datos de Outcome?

* Las notificaciones enviadas desde el panel mantienen sus datos de Outcome para siempre.
* Las notificaciones enviadas a través de la API tienen una retención de 30 días de outcomes antes de ser eliminados.

### ¿Qué canales admiten outcomes personalizados?

Actualmente, los outcomes personalizados solo se pueden agregar a acciones en notificaciones push y mensajes in-app.

Los Outcomes enviados a través de mensajes in-app se mostrarán como "No atribuido" y establecerán una etiqueta en el dispositivo con el formato: `nombre del outcome : true`.

### ¿Puedo exportar Outcomes?

Puede exportar un conjunto de outcomes o todos los outcomes como CSV. También proporcionamos acceso API a outcomes para una [notificación individual](/reference/view-message) o para [todas las notificaciones](/reference/view-outcomes).

### ¿Puedo almacenar cadenas como valores en Outcomes personalizados?

Esto no es compatible.

### ¿Qué sucede si un dispositivo está sin conexión?

Los datos para outcomes activados se ponen en cola para enviarse a OneSignal una vez que el dispositivo esté en línea nuevamente.

### Si un usuario pone la aplicación en segundo plano después de hacer clic en una notificación y luego regresa a ella, activando un Outcome, ¿se cuenta como directo o influenciado?

Siempre que el usuario regrese a la aplicación dentro de los 30 segundos después de ponerla en segundo plano, la sesión aún se considerará la sesión original y obtendrá atribución directa.

### ¿Cuándo surte efecto la nueva ventana de atribución?

Si cambia la ventana de atribución de 24 horas a 1 hora, por ejemplo, entonces la ventana de 1 hora surtirá efecto por dispositivo una vez que cada dispositivo abra la aplicación desde una sesión completamente nueva. Esta nueva sesión se crea después de 30 segundos de estar fuera de la aplicación.

### ¿Por qué las sesiones no coinciden con otros análisis?

OneSignal solo cuenta una sesión después de que el usuario haya dejado la aplicación durante más de 30 segundos. Si cierra la aplicación o el sitio web y regresa a ella dentro de los 30 segundos, no será una sesión nueva.

Por ejemplo, el análisis de Apple rastrea la sesión como el número de veces que se ha usado la aplicación durante al menos dos segundos. Si la aplicación está en segundo plano y luego se usa nuevamente, eso cuenta como otra sesión.

***
