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

# Operadores de Tiempo

> Los Operadores de Tiempo te permiten enviar mensajes relativos a un momento específico en el tiempo—como después de que ocurra una acción o antes de una fecha próxima.

## Visión general

Los Operadores de Tiempo te permiten enviar mensajes relativos a un momento específico en el tiempo—como **después de que ocurra una acción** o **antes de una fecha próxima**.

Almacenas ese momento como una **marca de tiempo Unix (en segundos)** en el usuario usando una **Etiqueta**. OneSignal luego compara el tiempo actual con esa marca de tiempo y te permite dirigirte a usuarios basándote en cuánto tiempo ha pasado (o cuánto tiempo queda).

Esto facilita automatizar mensajes como recordatorios, seguimientos y fechas límite sin programar mensajes manualmente.

**Casos de uso comunes:**

* **[Carrito abandonado](./abandoned-cart)**: Recordar a usuarios que no han finalizado la compra después de cierto tiempo
* **Recordatorios de eventos**: Enviar mensajes a usuarios antes de una cita programada o fecha de renovación
* **Hitos**: Hacer seguimiento cuando los usuarios no han completado una acción antes de una fecha límite
* **Cumpleaños**: Enviar mensajes automáticos en (o alrededor de) el cumpleaños de un usuario

<Note>
  Los Operadores de Tiempo solo están disponibles en planes de pago. Los planes gratuitos aún pueden usar filtros de segmentos basados en tiempo por defecto como Primera Sesión y Última Sesión.
</Note>

### ¿Cuándo debería usar esto?

Usa los Operadores de Tiempo cuando quieras:

* Enviar mensajes **relativos a un evento**, no en un tiempo de calendario fijo
* Crear **ventanas de tiempo móviles** (por ejemplo, "24–48 horas después")
* Reutilizar la misma lógica para muchos usuarios con diferentes fechas
* Evaluar continuamente la elegibilidad a medida que pasa el tiempo

Si necesitas disparar mensajería inmediatamente cuando ocurre un evento, considera usar **[Eventos Personalizados](./custom-events)** en su lugar.

### Etiquetas vs Eventos Personalizados

Puedes resolver muchos casos de uso de "recordatorios" con **Etiquetas** o **Eventos Personalizados**. La mejor opción depende de lo que necesites almacenar y cómo quieras disparar la automatización.

* Usa **Etiquetas** cuando quieras almacenar la **última marca de tiempo conocida** (por ejemplo, `cart_updated_at` o `subscription_expires_at`) en el usuario y segmentar basándote en ese valor a lo largo del tiempo.
* Usa **Eventos Personalizados** cuando quieras registrar **cada ocurrencia de evento** (con propiedades) y disparar Journeys basándote en comportamiento en tiempo real.

<Info>
  En la práctica, muchas implementaciones pueden usar ambos: Eventos Personalizados para seguimiento en tiempo real y Etiquetas para el estado del usuario que quieres segmentar más tarde.
</Info>

Las [etiquetas](/docs/es/add-user-data-tags) y los [eventos personalizados](/docs/es/custom-events) son ambas formas de agregar datos a sus usuarios. Sin embargo, existen algunas diferencias clave:

| Característica     |                     Etiquetas                    |                                           Eventos personalizados                                          |
| ------------------ | :----------------------------------------------: | :-------------------------------------------------------------------------------------------------------: |
| Uso de datos       |          Segmentación y personalización          | Activar journeys sin un segmento, pasos de esperar hasta, personalización directamente dentro de journeys |
| Retención de datos |                    De por vida                   |     30+ días ([el almacenamiento de por vida está disponible](/docs/es/billing-faq#streaming-events))     |
| Formato de datos   |           Cadenas o números clave-valor          |                                                    JSON                                                   |
| Fuente de datos    | SDK de OneSignal, API o integraciones (limitado) |                                   SDK de OneSignal, API o integraciones                                   |
| Acceso a datos     |    Segmentación y personalización de mensajes    |        Journeys y personalización de plantillas de mensajes de journey, segmentación (Próximamente)       |

La distinción clave entre etiquetas y eventos personalizados está en su profundidad y casos de uso. Las etiquetas son propiedades de un usuario, como nombre, estado de cuenta o ubicación. Los eventos son cosas que el usuario ha hecho, como comprar un artículo, completar un nivel o invitar a un amigo. Tanto las etiquetas como los eventos pueden usarse para segmentación y personalización.

En la práctica, probablemente usará ambos:

* Etiquetas para propiedades de usuario que son estáticas y no cambian con frecuencia
* Eventos personalizados para escenarios en tiempo real, segmentación compleja y flujos de trabajo de journey más sofisticados

***

## Referencia rápida

1. Convierte la fecha del evento a una marca de tiempo Unix en **segundos**.
2. Establece una [Etiqueta](./add-user-data-tags) donde la clave sea el nombre del evento y el valor sea la marca de tiempo como **cadena** (ej., `'event_date': '1739145600'`).
3. Crea un segmento usando el operador **Time Elapsed Greater Than**:
   * Después de una fecha pasada usando el operador **Time Elapsed Greater Than** con un valor positivo
   * Antes de una fecha futura usando el operador **Time Elapsed Greater Than** con un valor negativo

<Warning>
  Un error común es establecer marcas de tiempo en **milisegundos** (13 dígitos) en lugar de **segundos** (10 dígitos). Los Operadores de Tiempo requieren **segundos**.
</Warning>

***

## Enviar mensajes después de un evento pasado

Usa este patrón cuando quieras enviar mensajes a usuarios **después de que haya pasado cierto tiempo** desde que algo ocurrió.

**Ejemplo: Recordatorio de carrito abandonado 24 horas después de que el usuario actualizó su carrito**

<Steps>
  <Step title="Almacenar la marca de tiempo cuando ocurre el evento">
    Cuando el usuario actualiza su carrito, guarda el tiempo actual como una marca de tiempo Unix (en segundos):

    ```javascript theme={null}
    // Ejemplo SDK
    const timestampSeconds = String(Math.floor(Date.now() / 1000));
    OneSignal.User.addTag("cart_updated_at", timestampSeconds);
    ```

    <Warning>
      Usa segundos (10 dígitos), no milisegundos (13 dígitos).
    </Warning>
  </Step>

  <Step title="Crear un segmento">
    1. Ve a **Audience** > **Segments**
    2. Agrega un filtro **User Tag**
    3. Establece **Key** como `cart_updated_at`
    4. Elige **Time Elapsed Greater Than**
    5. Establece **Value** como `1` día (o `24` horas o `86400` segundos)

    <Frame caption="Segmento para usuarios que abandonaron su carrito hace más de 24 horas">
      <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-than.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=fd95aaf5b4ff3d4ebf594af867a594c8" alt="Segmento usando Time Elapsed Greater Than" width="1311" height="617" data-path="images/segments/time-elapsed-greater-than.png" />
    </Frame>
  </Step>

  <Step title="Agregar un límite superior (Recomendado)">
    Sin un límite superior, los usuarios permanecen en el segmento para siempre. Agrega un segundo filtro para crear una ventana:

    * **Time Elapsed Greater Than** `24` horas
    * **Time Elapsed Less Than** `48` horas

    Ahora los usuarios solo están en el segmento entre 24-48 horas después del evento.

    <Frame caption="Segmento con una ventana de 24-48 horas">
      <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-less-than.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=3cb973d5b0252683e9f804e4b04a37b4" alt="Segmento con ambos Time Elapsed Greater Than y Less Than" width="1292" height="715" data-path="images/segments/time-elapsed-greater-less-than.png" />
    </Frame>
  </Step>

  <Step title="Usar el segmento en un Journey">
    Crea un [Journey](./journeys-overview) que se dirija a tu segmento para automatizar la mensajería.
  </Step>
</Steps>

***

## Enviar mensajes antes de un evento futuro

Usa este patrón para enviar mensajes a usuarios **antes de una fecha futura**, como una cita o renovación.

1. Almacena la fecha futura como una etiqueta de marca de tiempo Unix (ej., `'future_date': '1739145600'`)
2. Crea un segmento con **Time Elapsed Greater Than** y tu tiempo de entrada deseado como un valor negativo
   * Ejemplo: `-2` días (o `-172800` segundos)

<Frame caption="Segmento para usuarios con un evento próximo">
  <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-than-negative-value.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=bea6fe1e5d4a2d3349fe05674946b910" alt="Segmento usando Time Elapsed Greater Than con un valor negativo" width="1291" height="618" data-path="images/segments/time-elapsed-greater-than-negative-value.png" />
</Frame>

3. Agrega un límite superior usando el mismo operador **Time Elapsed Greater Than** con un valor negativo de un tiempo más cercano
   * Ejemplo: `-1` día (o `-86400` segundos)

<Frame caption="Segmento con un límite superior">
  <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-than-negative-value-upper-limit.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=406246bb0136f1997ababc06a638408f" alt="Segmento usando Time Elapsed Greater Than con un valor negativo y un límite superior" width="1286" height="703" data-path="images/segments/time-elapsed-greater-than-negative-value-upper-limit.png" />
</Frame>

### Ejemplo: Mensajes de cumpleaños

Envía mensajes de cumpleaños almacenando el **próximo cumpleaños** de cada usuario como una marca de tiempo.

<Steps>
  <Step title="Almacenar la marca de tiempo del próximo cumpleaños">
    Calcula y almacena el próximo cumpleaños del usuario:

    ```javascript theme={null}
    function getNextBirthday(month, day) {
      // month: 0-11 (Jan=0), day: 1-31
      const now = new Date();
      let birthday = new Date(now.getFullYear(), month, day);

      if (birthday <= now) {
        birthday = new Date(now.getFullYear() + 1, month, day);
      }

      return String(Math.floor(birthday.getTime() / 1000));
    }

    // Ejemplo: cumpleaños del 15 de enero
    OneSignal.User.addTag("birthday", getNextBirthday(0, 15));
    ```
  </Step>

  <Step title="Crear un segmento de cumpleaños">
    * **User Tag**: `birthday`
    * **Time Elapsed Greater Than**: `0` segundos

    Los usuarios ingresan al segmento una vez que pasa su marca de tiempo de cumpleaños.

    <Frame caption="Segmento de cumpleaños">
      <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/birthday-segment.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=6f431d2f592779f74a5b4e27045ad984" alt="Segmento de cumpleaños usando Time Elapsed Greater Than 0" width="1287" height="602" data-path="images/segments/birthday-segment.png" />
    </Frame>
  </Step>

  <Step title="Configurar un Journey recurrente">
    1. Crea un [Journey](./journeys-overview) dirigido a tu segmento de cumpleaños
    2. Establece la reentrada a **52 semanas** para que los usuarios puedan reingresar el próximo año
    3. Actualiza la etiqueta `birthday` a la fecha del próximo año después de enviar (en tu backend o Journey)
  </Step>
</Steps>

<Note>
  Calcula las marcas de tiempo de cumpleaños usando la zona horaria local del usuario cuando sea posible. Usar solo el tiempo del servidor puede hacer que los mensajes se envíen más temprano o más tarde de lo esperado.
</Note>

<Warning>
  Si quieres que los mensajes se mantengan precisos año tras año, actualiza la etiqueta `birthday` del usuario al próximo cumpleaños después de enviar el mensaje (por ejemplo, en tu backend o en un paso del Journey). Ten en cuenta que, si haces esto, puede ser más fácil usar [Eventos Personalizados](./custom-events) en su lugar.
</Warning>

<Check>
  Los mensajes de cumpleaños se enviarán a los usuarios alrededor de la fecha de su etiqueta `birthday`.
</Check>

***

## FAQ

### ¿Cómo funciona la matemática? (detalles técnicos)

Los Operadores de Tiempo existen para permitirte crear **ventanas relativas y móviles** en lugar de fechas fijas.

OneSignal calcula el tiempo transcurrido usando esta fórmula:

```
time_elapsed = current_time - tag_timestamp
```

* **Marcas de tiempo pasadas** → valores positivos
* **Marcas de tiempo futuras** → valores negativos

**Operadores:**

* `Time Elapsed Greater Than X`: coincide cuando `elapsed > X`
* `Time Elapsed Less Than X`: coincide cuando `elapsed < X`

**Por qué las marcas de tiempo futuras coinciden inmediatamente con `Less Than`:**

Cualquier número negativo es menor que cualquier número positivo. Por lo tanto `time_elapsed_lt 2 days` (172,800 segundos) coincidirá con una marca de tiempo 30 días en el futuro porque:

```
-2,592,000 < 172,800  →  true (coincide)
```

Como las marcas de tiempo futuras siempre producen tiempo transcurrido negativo, **debes usar valores negativos** para definir cuándo los usuarios deben ingresar y salir de segmentos antes de un evento próximo. Los valores positivos no pueden representar tiempo *antes* de una fecha futura.

### ¿Cómo puedo probar?

1. Encuentra tu usuario mediante el ID Externo, ID de Suscripción, Email o número de teléfono. Consulta [Encontrar y establecer suscripciones de prueba](./test-users) para detalles sobre encontrar tu usuario.
2. Obtén una marca de tiempo en segundos de la fecha actual y una fecha futura (5 minutos desde ahora).
3. Establece dos etiquetas con las claves 'current\_time' y 'future\_time' y los valores como las marcas de tiempo en segundos.
4. Crea un segmento `current_time` con los siguientes filtros:
   * **User Tag**: `current_time` **Time Elapsed Greater Than**: `2` minutos
   * Y **User Tag**: `current_time` **Time Elapsed Less Than**: `5` minutos
5. Crea un segmento `future_time` con los siguientes filtros:
   * **User Tag**: `future_time` **Time Elapsed Greater Than**: `-5` minutos
   * Y **User Tag**: `future_time` **Time Elapsed Less Than**: `-2` minutos

Deberías ver que tu usuario:

* Ingresa al segmento `current_time` 2 minutos después de la fecha de tiempo actual y sale del segmento 5 minutos después de la fecha de tiempo actual.
* Ingresa al segmento `future_time` 5 minutos antes de la fecha de tiempo futuro y sale del segmento 2 minutos antes de la fecha de tiempo futuro.

***
