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

# Snowflake

> Sincroniza eventos personalizados desde Snowflake a OneSignal para activar Journeys automatizados y campañas de mensajería personalizadas basadas en el comportamiento del usuario.

export const DATA_TYPE_0 = "event data"

export const PLATFORM_0 = "Snowflake"

export const COLUMN_HEADER_0 = "Snowflake Column"

export const PROPERTIES_DESCRIPTION_0 = "Event metadata as VARIANT/JSON"

<Note>
  Si estás utilizando Snowflake con la integración heredada de OneSignal, consulta la guía de [Integración heredada de Snowflake](./snowflake-legacy). Consulta [Migración desde la versión heredada](#migrating-from-legacy) para obtener los pasos de migración.
</Note>

***

## Descripción general

La integración de OneSignal + Snowflake admite dos potentes canales de datos:

* **Salida**: Envía automáticamente datos de eventos de mensajería (push, correo electrónico, SMS, in-app) desde OneSignal a Snowflake para análisis y generación de informes.
* **Entrada**: Sincroniza eventos de usuario personalizados desde tus conjuntos de datos de Snowflake a OneSignal para activar Journeys automatizados y mensajería personalizada.

Juntas, estas integraciones te brindan control total sobre los datos de participación del usuario, lo que impulsa análisis avanzados y mensajería en tiempo real impulsada por el comportamiento.

***

## Configuración de salida

<Note>
  Actualmente está en acceso temprano.
  Para solicitar acceso, contacta a `support@onesignal.com` con:

  * El nombre de tu empresa
  * Tu ID de organización de OneSignal
  * Los ID de aplicación que deseas habilitar
</Note>

Exporta eventos de rendimiento y participación de mensajería (p. ej., envíos, aperturas, clics) a Snowflake para:

* Crear paneles e informes personalizados
* Rastrear tendencias de entrega y participación entre canales
* Combinar datos de OneSignal con otros datos comerciales para análisis

**Requisitos**

* **Plan Professional** de OneSignal (no disponible en aplicaciones gratuitas)
* [Cuenta de Snowflake](https://docs.snowflake.com/en/user-guide/getting-started-tutorial)
* Rol SECURITYADMIN o ACCOUNTADMIN en Snowflake (para configuración)

### 1. Recopila los detalles de tu cuenta de Snowflake

Antes de configurar la integración, recopila la siguiente información de tu cuenta de Snowflake:

* **Host de Snowflake**: La URL de tu cuenta en el formato `<account_identifier>.snowflakecomputing.com`
* **Nombre de la base de datos**: La base de datos donde OneSignal escribirá los datos de eventos
* **Nombre del esquema**: El esquema dentro de la base de datos para las tablas de OneSignal (esto será creado automáticamente por OneSignal)
* **Nombre del almacén**: El almacén a utilizar para operaciones de carga de datos

<Frame caption="Ubicación del identificador de cuenta de Snowflake">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cf472c3-Screen_Shot_2023-06-27_at_4.08.19_PM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=ad89f70c336cfa9fc66849021cdab551" width="1554" height="620" data-path="images/docs/cf472c3-Screen_Shot_2023-06-27_at_4.08.19_PM.png" />
</Frame>

### 2. Ejecuta el script de configuración en Snowflake

Ejecuta el siguiente script SQL en tu almacén de Snowflake para crear el rol, usuario, almacén y base de datos necesarios para OneSignal:

```sql theme={null}
begin;

   -- create variables for user / role / warehouse / database (needs to be uppercase for objects)
   set role_name = 'ONESIGNAL_ROLE';
   set user_name = 'ONESIGNAL_USER';
   set warehouse_name = 'ONESIGNAL_WAREHOUSE';
   set database_name = 'ONESIGNAL';

   -- change role to securityadmin for user / role steps
   use role securityadmin;

   -- create role for onesignal
   create role if not exists identifier($role_name);
   grant role identifier($role_name) to role SYSADMIN;

   -- create a user for onesignal
   create user if not exists identifier($user_name)
   default_role = $role_name
   default_warehouse = $warehouse_name;

   grant role identifier($role_name) to user identifier($user_name);

   -- set binary_input_format to BASE64
   ALTER USER identifier($user_name) SET BINARY_INPUT_FORMAT = 'BASE64';

   -- set timestamp_input_format to AUTO for the user
   ALTER USER identifier($user_name) SET TIMESTAMP_INPUT_FORMAT = 'AUTO';

   -- change role to sysadmin for warehouse / database steps
   use role sysadmin;

   -- create a warehouse for onesignal
   create warehouse if not exists identifier($warehouse_name)
   warehouse_size = xsmall
   warehouse_type = standard
   auto_suspend = 60
   auto_resume = true
   initially_suspended = true;

   -- create database for onesignal
   create database if not exists identifier($database_name);

   -- grant onesignal role access to warehouse
   grant USAGE
   on warehouse identifier($warehouse_name)
   to role identifier($role_name);

   -- grant onesignal access to database
   grant CREATE SCHEMA, MONITOR, USAGE
   on database identifier($database_name)
   to role identifier($role_name);

 commit;
```

<Note>
  Puedes personalizar los valores de las variables en la parte superior del script para que coincidan con tus convenciones de nomenclatura. Si estás utilizando un almacén o base de datos existentes, modifica el script en consecuencia.
</Note>

### 3. Genera un par de claves para autenticación

OneSignal requiere autenticación de par de claves para un acceso seguro a tu cuenta de Snowflake. Sigue estos pasos para generar y configurar las claves:

<Steps>
  <Step title="Genera una clave privada">
    Ejecuta uno de los siguientes comandos para generar una clave privada:

    **Clave privada sin cifrar** (más simple, pero menos segura):

    ```bash theme={null}
    openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
    ```

    **Clave privada cifrada** (recomendado para producción):

    ```bash theme={null}
    openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 aes256 -inform PEM -out rsa_key.p8
    ```

    Si utilizas una clave cifrada, se te pedirá que crees una frase de contraseña. Guarda esta frase de contraseña de forma segura: la necesitarás al configurar OneSignal.
  </Step>

  <Step title="Genera la clave pública">
    Genera la clave pública a partir de tu clave privada:

    ```bash theme={null}
    openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
    ```
  </Step>

  <Step title="Asigna la clave pública a tu usuario de Snowflake">
    Copia el contenido del archivo de clave pública (excluyendo las líneas de encabezado y pie de página), luego ejecuta este comando SQL en Snowflake:

    ```sql theme={null}
    ALTER USER ONESIGNAL_USER SET RSA_PUBLIC_KEY='<YOUR_PUBLIC_KEY_CONTENT>';
    ```

    Reemplaza `<YOUR_PUBLIC_KEY_CONTENT>` con el contenido de la clave (sin las líneas `-----BEGIN PUBLIC KEY-----` y `-----END PUBLIC KEY-----`).
  </Step>
</Steps>

<Warning>
  Almacena tu archivo de clave privada de forma segura. Necesitarás proporcionarlo a OneSignal en el siguiente paso. Nunca compartas tu clave privada públicamente ni la confirmes en el control de versiones.
</Warning>

### 4. Conecta OneSignal

<Steps>
  <Step title="Activa la integración">
    En OneSignal, navega a **Data > Integrations > Snowflake**.
  </Step>

  <Step title="Ingresa los detalles">
    * Host: `<your_account>.snowflakecomputing.com`
    * Puerto: Opcional, por defecto es `443`
    * Base de datos: p. ej., `ONESIGNAL`
    * Rol: Opcional, usa el rol predeterminado del usuario si se omite
    * Usuario: p. ej., `ONESIGNAL_USER`
    * Clave privada: Pega el contenido de tu archivo de clave privada (`rsa_key.p8`)
    * Frase de contraseña de clave privada: Opcional, solo si tu clave privada está cifrada
    * Ubicación de procesamiento de datos: Dónde se procesan los datos antes de enviarlos a Snowflake
  </Step>

  <Step title="Configura la integración">
    * **Frecuencia de sincronización:** tan frecuente como cada 15 minutos
    * **Nombres de esquema/tabla:** preestablecidos como `onesignal_events_<app-id>` y `message_events` (editable)
    * **Tipos de eventos:** elige cuáles sincronizar: selecciona todos o solo los que necesitas
  </Step>

  <Step title="Selecciona eventos">
    Selecciona los eventos que deseas recibir en tu almacén de Snowflake.
  </Step>

  <Step title="Completa la configuración">
    Haz clic en **Save** y espera la confirmación de éxito
  </Step>
</Steps>

<Note>
  La sincronización de datos inicial puede tardar entre 15 y 30 minutos en aparecer en Snowflake.

  Mientras esperas, envía mensajes a través de push, correo electrónico, in-app o SMS para activar los eventos seleccionados.
</Note>

### 5. Ver datos en Snowflake

Una vez que se complete la sincronización inicial, consulta los datos de eventos de OneSignal:

```sql theme={null}
-- View recent message events
SELECT *
FROM <your-database>.<your-schema>.message_events
ORDER BY _CREATED DESC
LIMIT 100;
```

<Info>
  Si encuentras problemas como esquemas faltantes, errores de permisos o eventos con formato incorrecto, contacta a `support@onesignal.com`.
</Info>

## Eventos y propiedades de mensajes

### Tipos de eventos de mensajes

**Propiedad:** `event_kind`
**Tipo:** `String`

El tipo de mensaje y evento (por ejemplo, `message.push.received`, `message.push.sent`).

| Evento de mensaje (OneSignal) |           `event_kind`           | Descripción                                                                      |
| :---------------------------: | :------------------------------: | -------------------------------------------------------------------------------- |
|          Push enviado         |        `message.push.sent`       | Notificación push enviada exitosamente.                                          |
|         Push recibido         |      `message.push.received`     | Push entregado (ver [Entrega confirmada](/docs/es/confirmed-delivery)).          |
|           Push clic           |      `message.push.clicked`      | El usuario hizo clic en el push.                                                 |
|          Push fallido         |       `message.push.failed`      | Fallo de entrega. Ver informes de mensajes.                                      |
|       Push dado de baja       |    `message.push.unsubscribed`   | El usuario se dio de baja del push.                                              |
|        Impresión in-app       |     `message.iam.impression`     | Mensaje in-app mostrado.                                                         |
|          In-app clic          |       `message.iam.clicked`      | Mensaje in-app clicado.                                                          |
|      Página in-app vista      |   `message.iam.page_displayed`   | Página in-app mostrada.                                                          |
|         Email enviado         |       `message.email.sent`       | Email entregado.                                                                 |
|         Email recibido        |     `message.email.received`     | Email aceptado por el servidor de correo del destinatario.                       |
|         Email abierto         |      `message.email.opened`      | Email abierto. Ver [Informes de email](/docs/es/email-message-reports).          |
|    Enlace de email clicado    |      `message.email.clicked`     | Enlace en el email clicado.                                                      |
|       Email dado de baja      |   `message.email.unsubscribed`   | Destinatario dado de baja.                                                       |
|   Email reportado como spam   | `message.email.reported_as_spam` | Marcado como spam. Ver [Entregabilidad de email](/docs/es/email-deliverability). |
|         Email rebotado        |      `message.email.bounced`     | Rebote debido a fallo de entrega permanente.                                     |
|         Email fallido         |      `message.email.failed`      | Entrega fallida.                                                                 |
|        Email suprimido        |    `message.email.suppressed`    | Suprimido debido a lista de supresión.                                           |
|          SMS enviado          |        `message.sms.sent`        | SMS enviado.                                                                     |
|         SMS entregado         |      `message.sms.delivered`     | SMS entregado exitosamente.                                                      |
|          SMS fallido          |       `message.sms.failed`       | SMS falló al entregar.                                                           |
|        SMS no entregado       |     `message.sms.undelivered`    | SMS rechazado o inalcanzable.                                                    |

### Esquema de datos de eventos

Para cada evento de mensaje generado por un usuario, los siguientes metadatos se adjuntarán al registro.

|                Nombre de columna                |      Tipo     | Descripción                                                                  |
| :---------------------------------------------: | :-----------: | ---------------------------------------------------------------------------- |
|                    `event_id`                   |      UUID     | Identificador único del evento                                               |
|                `event_timestamp`                |   Timestamp   | Hora de ocurrencia del evento                                                |
|                   `event_kind`                  |     String    | El [Tipo de evento](#tipos-de-eventos-de-mensajes)                           |
|            `subscription_device_type`           |     String    | Tipo de dispositivo (por ejemplo, iOS, Android, Web, Email, SMS)             |
|                    `language`                   |     String    | Código de idioma de suscripción                                              |
|                    `version`                    |     String    | Versión de integración                                                       |
|                   `device_os`                   |     String    | Versión del sistema operativo del dispositivo                                |
|                  `device_type`                  |     Number    | Tipo de dispositivo numérico                                                 |
|                     `token`                     |     String    | Token push, número de teléfono o email                                       |
|                `subscription_id`                |      UUID     | ID de suscripción                                                            |
|                   `subscribed`                  |    Boolean    | Estado de suscripción                                                        |
|                  `onesignal_id`                 |      UUID     | ID de usuario de OneSignal                                                   |
|                  `last_active`                  |     String    | Marca de tiempo de última actividad                                          |
|                      `sdk`                      |     String    | Versión del SDK de OneSignal                                                 |
|                  `external_id`                  |     String    | ID de usuario externo que debe coincidir con el ID de usuario de integración |
|                     `app_id`                    |      UUID     | ID de aplicación de OneSignal                                                |
|                  `template_id`                  |      UUID     | ID de plantilla (si aplica)                                                  |
|                   `message_id`                  |      UUID     | ID de lote/solicitud de mensaje                                              |
|                  `message_name`                 |     String    | Nombre del mensaje                                                           |
|                 `message_title`                 |     String    | Título del mensaje (solo en inglés)                                          |
|                `message_contents`               |     String    | Cuerpo del mensaje truncado (solo en inglés)                                 |
|                 `failure_reason`                |     String    | Razón del fallo (para eventos de fallo de push y email)                      |
| `_created`, `_id`, `_index`, `_fivetran_synced` | *Uso interno* | Metadatos de sincronización de Fivetran                                      |

### Notas

* Las sincronizaciones después de guardar/activar pueden tardar de 15 a 30 minutos adicionales en completarse.
* Desactivar aún puede resultar en una sincronización final después de la desactivación.
* Para garantizar una sincronización de datos eficiente, nuestro sistema crea y gestiona automáticamente conjuntos de datos de preparación. Estos conjuntos de datos, nombrados con un patrón como `fivetran_{dos palabras aleatorias}_staging`, almacenan temporalmente datos durante el procesamiento antes de que se integren en su esquema principal. Estos conjuntos de datos de preparación son esenciales para mantener un flujo de trabajo optimizado y no deben eliminarse, ya que se recrearán automáticamente.

***

## Migración desde la versión heredada

Si actualmente estás usando la [integración heredada de Snowflake](./snowflake-legacy), esta sección cubre las diferencias clave y cómo migrar tus consultas.

### Diferencias clave

| Característica                   | Heredada                                   | Nueva                                          |
| -------------------------------- | ------------------------------------------ | ---------------------------------------------- |
| **Frecuencia de sincronización** | 24 horas                                   | Tan frecuente como cada 15 minutos             |
| **Propiedad de datos**           | Acceso de solo lectura a datos compartidos | Escrito directamente en tu cuenta de Snowflake |
| **Retención de datos**           | 30 días                                    | Tú controlas la retención                      |
| **Selección de eventos**         | Todos los eventos                          | Elegir tipos de eventos específicos            |

### Cambios de esquema

La nueva integración crea columnas bajo demanda. Si ningún evento contiene datos para un campo particular, esa columna no existirá en tu tabla. Cuando aparezcan datos para ese campo, la columna se creará automáticamente.

#### Cambios de nombre de columnas

| Columna heredada             | Nueva columna      |
| ---------------------------- | ------------------ |
| `EVENT_IMPRESSION_TIMESTAMP` | `EVENT_TIMESTAMP`  |
| `SUBSCRIPTION_LANGUAGE`      | `LANGUAGE`         |
| `MESSAGE_BODY`               | `MESSAGE_CONTENTS` |

### Inferencia de tipos

La nueva integración utiliza inferencia automática de tipos. Si todos los valores en una columna son numéricos (p. ej., todos tus valores `EXTERNAL_ID` son números), la columna puede ser tipada como `NUMBER`. Si aparece un valor no numérico más tarde, el tipo de columna se promociona a `VARCHAR`.

Usa conversión explícita si es necesario:

```sql theme={null}
WHERE EXTERNAL_ID = '12345'::VARCHAR
```

### Migración de consultas

Para migrar consultas existentes:

1. Actualiza las referencias a la base de datos heredada para apuntar a tu nueva base de datos de Snowflake
2. Ten en cuenta los cambios de nombre de columnas listados arriba
3. Añade conversión de tipos explícita donde sea necesario

Opcionalmente, crea una vista de compatibilidad que haga alias de los nuevos nombres de columna a los nombres heredados:

```sql theme={null}
CREATE VIEW your_schema.message_events_compat AS
SELECT
  *,
  EVENT_TIMESTAMP AS EVENT_IMPRESSION_TIMESTAMP,
  LANGUAGE AS SUBSCRIPTION_LANGUAGE,
  MESSAGE_CONTENTS AS MESSAGE_BODY
FROM ONESIGNAL_DB.ONESIGNAL_EVENTS_XXXXX.MESSAGE_EVENTS;
```

<Note>
  Reemplaza `ONESIGNAL_DB.ONESIGNAL_EVENTS_XXXXX.MESSAGE_EVENTS` con tus nombres reales de base de datos, esquema y tabla.
</Note>

Para desconectar tu compartición de datos heredada, contacta a [snowflake-data-sharing@onesignal.com](mailto:snowflake-data-sharing@onesignal.com).

***

## Configuración de entrada

Importa datos de eventos de comportamiento desde Snowflake a OneSignal para:

* Activar Journeys basados en la actividad del usuario
* Personalizar mensajes basados en datos de comportamiento

**Requisitos**

* Acceso a [flujos de eventos](/docs/es/event-streams) para eventos de mensajes salientes (Se aplican limitaciones del plan y sobrecargos)
* Acceso a [eventos personalizados](/docs/es/custom-events) para sincronización de eventos entrantes (Se aplican limitaciones del plan y sobrecargos)
* [Plan de cuenta actualizado](https://onesignal.com/pricing) (no disponible en aplicaciones gratuitas)

- **Cuenta de Snowflake** con acceso al almacén
- **Datos de eventos** almacenados en tablas o vistas de Snowflake
- **Conectividad de red** desde OneSignal a tu instancia de Snowflake
- **Credenciales de usuario** con los permisos apropiados

<Steps>
  <Step title="Crear rol dedicado para OneSignal">
    Crea una jerarquía de roles siguiendo las mejores prácticas de Snowflake:

    ```sql theme={null}
    -- Create a role for the census user
    CREATE ROLE CENSUS_ROLE;

    -- Ensure the sysadmin role inherits any privileges the census role is granted
    GRANT ROLE CENSUS_ROLE TO ROLE SYSADMIN;
    ```
  </Step>

  <Step title="Crear almacén dedicado">
    Crea un almacén optimizado en costos para las operaciones de OneSignal:

    ```sql theme={null}
    -- Create a warehouse for the census role, optimizing for cost over performance
    CREATE WAREHOUSE CENSUS_WAREHOUSE WITH
        WAREHOUSE_SIZE = XSMALL
        AUTO_SUSPEND = 60
        AUTO_RESUME = TRUE
        INITIALLY_SUSPENDED = FALSE;

    GRANT USAGE ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    GRANT OPERATE ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    GRANT MONITOR ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    ```
  </Step>

  <Step title="Crear usuario y otorgar permisos">
    Crea el usuario de OneSignal y otorga acceso a tus datos de eventos:

    ```sql theme={null}
    -- Create the census user
    CREATE USER CENSUS WITH
        DEFAULT_ROLE = CENSUS_ROLE
        DEFAULT_WAREHOUSE = CENSUS_WAREHOUSE
        PASSWORD = '<strong-unique-password>';

    GRANT ROLE CENSUS_ROLE TO USER CENSUS;

    -- Grant access to your event data (replace with your actual database/schema)
    GRANT USAGE ON DATABASE "<your-database>" TO ROLE CENSUS_ROLE;
    GRANT USAGE ON SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON ALL TABLES IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON FUTURE TABLES IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON ALL VIEWS IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON FUTURE VIEWS IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    ```
  </Step>

  <Step title="Crear base de datos de contabilidad (Motor de sincronización avanzado)">
    Crea una base de datos privada para la gestión del estado de sincronización de OneSignal:

    ```sql theme={null}
    -- Create a private bookkeeping database
    CREATE DATABASE "CENSUS";
    GRANT ALL PRIVILEGES ON DATABASE "CENSUS" TO ROLE CENSUS_ROLE;

    CREATE SCHEMA "CENSUS"."CENSUS";
    GRANT ALL PRIVILEGES ON SCHEMA "CENSUS"."CENSUS" TO ROLE CENSUS_ROLE;
    GRANT CREATE STAGE ON SCHEMA "CENSUS"."CENSUS" TO ROLE CENSUS_ROLE;
    ```

    <Warning>
      Omite este paso si utilizas el motor de sincronización básico o el modo de solo lectura.
    </Warning>
  </Step>

  <Step title="Configurar autenticación">
    Configura la autenticación de par de claves (recomendado) para mayor seguridad:

    1. Genera un par de claves pública/privada siguiendo la [documentación de Snowflake](https://docs.snowflake.com/en/user-guide/key-pair-auth)
    2. Configura la clave pública en tu usuario de Snowflake
    3. Usa la clave privada en la configuración de conexión de OneSignal

    Alternativamente, puedes usar autenticación por contraseña (obsoleto - se bloqueará en noviembre de 2025).
  </Step>

  <Step title="Conectar a OneSignal">
    En OneSignal, vaya a **Datos > Integraciones** y haga clic en **Agregar integración**.

    Selecciona **Snowflake** y proporciona los siguientes detalles de conexión:

    * **Nombre de cuenta:** Tu identificador de cuenta de Snowflake (p. ej., `abc123.us-east-1`)
    * **Almacén:** `CENSUS_WAREHOUSE`
    * **Usuario:** `CENSUS`
    * **Base de datos:** El nombre de tu base de datos de eventos
    * **Esquema:** El nombre de tu esquema de datos de eventos
    * **Autenticación:** Par de claves (proporciona la clave privada y la frase de contraseña opcional)
  </Step>
</Steps>

***

### Mapeo de datos de eventos

Mapee su {DATA_TYPE_0} de {PLATFORM_0} al formato de eventos personalizados de OneSignal:

| Campo de OneSignal | {COLUMN_HEADER_0} | Descripción                | Requerido |
| ------------------ | ----------------- | -------------------------- | --------- |
| `name`             | `event_name`      | Identificador de evento    | Sí        |
| `external_id`      | `user_id`         | Identificador de usuario   | Sí        |
| `timestamp`        | `event_timestamp` | Cuándo ocurrió el evento   | No        |
| `properties`       | `event_data`      | {PROPERTIES_DESCRIPTION_0} | No        |

#### Esquema de tabla de eventos de ejemplo

```sql theme={null}
-- Example Snowflake event table
CREATE TABLE analytics.user_events (
    event_id STRING,
    event_name STRING NOT NULL,
    user_id STRING NOT NULL,
    event_timestamp TIMESTAMP_TZ DEFAULT CURRENT_TIMESTAMP(),
    event_properties VARIANT,
    session_id STRING,
    device_type STRING
);
```

#### Modo de consulta SQL

Escribe consultas SQL personalizadas para transformar tus datos de eventos:

```sql theme={null}
-- Example: Recent high-value events
SELECT
    event_name,
    user_id,
    event_timestamp,
    event_properties
FROM analytics.user_events
WHERE event_timestamp >= DATEADD(day, -7, CURRENT_TIMESTAMP())
    AND event_properties:value::NUMBER > 100
ORDER BY event_timestamp DESC;
```

### Configuración avanzada

#### Gestión de costos del almacén

* Usa tamaño de almacén X-Small para optimización de costos
* Configura suspensión automática (60 segundos) y reanudación automática
* Programa sincronizaciones durante horas de menor actividad
* Considera compartir el almacén con otros sistemas de procesamiento por lotes

#### Soporte de sincronizaciones en vivo

Para el procesamiento de eventos en tiempo real, habilita el seguimiento de cambios en tus tablas de eventos:

```sql theme={null}
ALTER TABLE "analytics"."user_events" SET CHANGE_TRACKING = TRUE;
```

#### Seguridad de red

Si utilizas la política de red de IPs permitidas de Snowflake, agrega las direcciones IP de OneSignal a tu lista de permitidos. Contacta al soporte de OneSignal para conocer los rangos de IP actuales.

***

## Limitaciones

* Las consultas analíticas complejas pueden afectar el rendimiento y los costos del almacén
* La autenticación por Usuario/Contraseña quedará obsoleta en noviembre de 2025
* La base de datos CENSUS está reservada solo para operaciones de OneSignal

***

## Preguntas frecuentes

### ¿Qué método de autenticación debo usar?

Usa **autenticación de par de claves** (recomendado). La autenticación por Usuario/Contraseña será bloqueada por Snowflake a partir de noviembre de 2025.

### ¿Puedo usar un almacén existente?

Sí, puedes compartir un almacén con otros sistemas de procesamiento por lotes como dbt o Fivetran para optimizar costos. Asegúrate de que el almacén tenga capacidad suficiente para tus necesidades de procesamiento de eventos.

### ¿Cómo puedo optimizar los costos?

* Usa tamaño de almacén X-Small
* Configura suspensión automática agresiva (60 segundos)
* Programa sincronizaciones durante horas de menor actividad
* Usa sincronizaciones por hora/diarias en lugar de sincronización continua

***
