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

> Synchronisez les événements personnalisés de Snowflake vers OneSignal pour déclencher des Journeys automatisés et des campagnes de messagerie personnalisées basées sur le comportement des utilisateurs.

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 vous utilisez Snowflake avec l'intégration héritée de OneSignal, veuillez consulter le guide [Intégration héritée de Snowflake](./snowflake-legacy). Voir [Migration depuis l'ancienne version](#migrating-from-legacy) pour les étapes de migration.
</Note>

***

## Aperçu

L'intégration OneSignal + Snowflake prend en charge deux pipelines de données puissants :

* **Sortant** : Envoyez automatiquement les données d'événements de messagerie (push, email, SMS, in-app) de OneSignal vers Snowflake pour l'analyse et les rapports.
* **Entrant** : Synchronisez les événements utilisateur personnalisés de vos ensembles de données Snowflake vers OneSignal pour déclencher des Journeys automatisés et une messagerie personnalisée.

Ensemble, ces intégrations vous donnent un contrôle complet sur les données d'engagement des utilisateurs—alimentant des analyses avancées et une messagerie en temps réel basée sur le comportement.

***

## Configuration sortante

<Note>
  Ceci est actuellement en accès anticipé.
  Pour demander l'accès, contactez `support@onesignal.com` avec :

  * Le nom de votre entreprise
  * Votre ID d'organisation OneSignal
  * Les ID d'application que vous voulez activer
</Note>

Envoyez les événements de performance et d'engagement de messagerie (par ex., envois, ouvertures, clics) vers Snowflake pour :

* Créer des tableaux de bord et des rapports personnalisés
* Suivre les tendances de livraison et d'engagement entre les canaux
* Combiner les données OneSignal avec d'autres données commerciales pour l'analyse

Envoyez les événements de performance et d'engagement de messagerie (par ex., envois, ouvertures, clics) vers Snowflake pour :

* Créer des tableaux de bord et des rapports personnalisés
* Suivre les tendances de livraison et d'engagement entre les canaux
* Combiner les données OneSignal avec d'autres données commerciales pour l'analyse

**Exigences**

* **Plan Professional** de OneSignal (non disponible pour les applications gratuites)
* [Compte Snowflake](https://docs.snowflake.com/en/user-guide/getting-started-tutorial)
* Rôle SECURITYADMIN ou ACCOUNTADMIN dans Snowflake (pour la configuration)

### 1. Rassemblez les détails de votre compte Snowflake

Avant de configurer l'intégration, collectez les informations suivantes de votre compte Snowflake :

* **Hôte Snowflake** : L'URL de votre compte au format `<account_identifier>.snowflakecomputing.com`
* **Nom de la base de données** : La base de données où OneSignal écrira les données d'événements
* **Nom du schéma** : Le schéma dans la base de données pour les tables OneSignal (sera créé automatiquement par OneSignal)
* **Nom de l'entrepôt** : L'entrepôt à utiliser pour les opérations de chargement de données

<Frame caption="Emplacement de l'identifiant de compte 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. Exécutez le script de configuration dans Snowflake

Exécutez le script SQL suivant dans votre entrepôt Snowflake pour créer le rôle, l'utilisateur, l'entrepôt et la base de données nécessaires pour 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>
  Vous pouvez personnaliser les valeurs des variables en haut du script pour correspondre à vos conventions de nommage. Si vous utilisez un entrepôt ou une base de données existante, modifiez le script en conséquence.
</Note>

### 3. Générez une paire de clés pour l'authentification

OneSignal nécessite une authentification par paire de clés pour un accès sécurisé à votre compte Snowflake. Suivez ces étapes pour générer et configurer les clés :

<Steps>
  <Step title="Générer une clé privée">
    Exécutez l'une des commandes suivantes pour générer une clé privée :

    **Clé privée non chiffrée** (plus simple, mais moins sécurisée) :

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

    **Clé privée chiffrée** (recommandée pour la production) :

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

    Si vous utilisez une clé chiffrée, vous serez invité à créer une phrase secrète. Conservez cette phrase secrète en toute sécurité—vous en aurez besoin lors de la configuration de OneSignal.
  </Step>

  <Step title="Générer la clé publique">
    Générez la clé publique à partir de votre clé privée :

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

  <Step title="Attribuer la clé publique à votre utilisateur Snowflake">
    Copiez le contenu du fichier de clé publique (à l'exclusion des lignes d'en-tête et de pied de page), puis exécutez cette commande SQL dans Snowflake :

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

    Remplacez `<YOUR_PUBLIC_KEY_CONTENT>` par le contenu de la clé (sans les lignes `-----BEGIN PUBLIC KEY-----` et `-----END PUBLIC KEY-----`).
  </Step>
</Steps>

<Warning>
  Conservez votre fichier de clé privée en toute sécurité. Vous devrez le fournir à OneSignal à l'étape suivante. Ne partagez jamais votre clé privée publiquement et ne la validez pas dans le contrôle de version.
</Warning>

### 4. Connectez OneSignal

<Steps>
  <Step title="Activer l'intégration">
    Dans OneSignal, accédez à **Données > Intégrations > Snowflake**.
  </Step>

  <Step title="Saisir les détails">
    * Hôte : `<your_account>.snowflakecomputing.com`
    * Port : Optionnel, par défaut `443`
    * Base de données : par ex., `ONESIGNAL`
    * Rôle : Optionnel, utilise le rôle par défaut de l'utilisateur si omis
    * Utilisateur : par ex., `ONESIGNAL_USER`
    * Clé privée : Collez le contenu de votre fichier de clé privée (`rsa_key.p8`)
    * Phrase secrète de clé privée : Optionnel, seulement si votre clé privée est chiffrée
    * Localisation du traitement des données : Où les données sont traitées avant d'être envoyées à Snowflake
  </Step>

  <Step title="Configurer l'intégration">
    * **Fréquence de synchronisation :** aussi souvent que toutes les 15 minutes
    * **Noms de schéma/table :** prédéfinis comme `onesignal_events_<app-id>` et `message_events` (modifiable)
    * **Types d'événements :** choisissez lesquels synchroniser—sélectionnez tous ou seulement ceux dont vous avez besoin
  </Step>

  <Step title="Sélectionner les événements">
    Sélectionnez les événements que vous souhaitez recevoir dans votre entrepôt Snowflake.
  </Step>

  <Step title="Terminer la configuration">
    Cliquez sur **Enregistrer** et attendez la confirmation de succès
  </Step>
</Steps>

<Note>
  La synchronisation initiale des données peut prendre 15 à 30 minutes avant d'apparaître dans Snowflake.

  Pendant que vous attendez, envoyez des messages via push, email, in-app ou SMS pour déclencher les événements sélectionnés.
</Note>

### 5. Afficher les données dans Snowflake

Une fois la synchronisation initiale terminée, interrogez vos données d'événements OneSignal :

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

<Info>
  Si vous rencontrez des problèmes tels que des schémas manquants, des erreurs de permission ou des événements mal formés, contactez `support@onesignal.com`.
</Info>

## Événements et propriétés de message

### Types d'événements de message

**Propriété :** `event_kind`
**Type :** `String`

Le type de message et d'événement (par exemple `message.push.received`, `message.push.sent`).

| Événement de message (OneSignal) |           `event_kind`           | Description                                                                    |
| :------------------------------: | :------------------------------: | ------------------------------------------------------------------------------ |
|             Push Sent            |        `message.push.sent`       | Notification push envoyée avec succès.                                         |
|           Push Received          |      `message.push.received`     | Push livrée (voir [Confirmed receipt](/docs/en/confirmed-delivery)).           |
|           Push Clicked           |      `message.push.clicked`      | L'utilisateur a cliqué sur la push.                                            |
|            Push Failed           |       `message.push.failed`      | Échec de la livraison. Voir les rapports de message.                           |
|         Push Unsubscribed        |    `message.push.unsubscribed`   | L'utilisateur s'est désabonné de la push.                                      |
|         In-App Impression        |     `message.iam.impression`     | Message In-App affiché.                                                        |
|          In-App Clicked          |       `message.iam.clicked`      | Message In-App cliqué.                                                         |
|        In-App Page Viewed        |   `message.iam.page_displayed`   | Page In-App affichée.                                                          |
|            Email Sent            |       `message.email.sent`       | Email livré.                                                                   |
|          Email Received          |     `message.email.received`     | Email accepté par le serveur de messagerie du destinataire.                    |
|           Email Opened           |      `message.email.opened`      | Email ouvert. Voir [Email Reports](/docs/en/email-message-reports).            |
|        Email Link Clicked        |      `message.email.clicked`     | Lien dans l'email cliqué.                                                      |
|        Email Unsubscribed        |   `message.email.unsubscribed`   | Destinataire désabonné.                                                        |
|      Email Reported As Spam      | `message.email.reported_as_spam` | Marqué comme spam. Voir [Email Deliverability](/docs/en/email-deliverability). |
|           Email Bounced          |      `message.email.bounced`     | Rebond dû à un échec de livraison permanent.                                   |
|           Email Failed           |      `message.email.failed`      | Échec de la livraison.                                                         |
|         Email Suppressed         |    `message.email.suppressed`    | Supprimé en raison de la liste de suppression.                                 |
|             SMS Sent             |        `message.sms.sent`        | SMS envoyé.                                                                    |
|           SMS Delivered          |      `message.sms.delivered`     | SMS livré avec succès.                                                         |
|            SMS Failed            |       `message.sms.failed`       | Échec de la livraison du SMS.                                                  |
|          SMS Undelivered         |     `message.sms.undelivered`    | SMS rejeté ou injoignable.                                                     |

### Schéma des données d'événement

Pour chaque événement de message généré par un utilisateur, les métadonnées suivantes seront jointes à l'enregistrement.

|                  Nom de colonne                 |       Type      | Description                                                                      |
| :---------------------------------------------: | :-------------: | -------------------------------------------------------------------------------- |
|                    `event_id`                   |       UUID      | Identifiant unique de l'événement                                                |
|                `event_timestamp`                |    Timestamp    | Heure de l'occurrence de l'événement                                             |
|                   `event_kind`                  |      String     | Le [Type d'événement](#types-devenements-de-message)                             |
|            `subscription_device_type`           |      String     | Type d'appareil (par exemple, iOS, Android, Web, Email, SMS)                     |
|                    `language`                   |      String     | Code de langue de l'abonnement                                                   |
|                    `version`                    |      String     | Version de l'intégration                                                         |
|                   `device_os`                   |      String     | Version du système d'exploitation de l'appareil                                  |
|                  `device_type`                  |      Number     | Type d'appareil numérique                                                        |
|                     `token`                     |      String     | Jeton push, numéro de téléphone ou email                                         |
|                `subscription_id`                |       UUID      | ID d'abonnement                                                                  |
|                   `subscribed`                  |     Boolean     | Statut d'abonnement                                                              |
|                  `onesignal_id`                 |       UUID      | ID utilisateur OneSignal                                                         |
|                  `last_active`                  |      String     | Horodatage de dernière activité                                                  |
|                      `sdk`                      |      String     | Version du SDK OneSignal                                                         |
|                  `external_id`                  |      String     | ID utilisateur externe qui doit correspondre à l'ID utilisateur de l'intégration |
|                     `app_id`                    |       UUID      | App ID de OneSignal                                                              |
|                  `template_id`                  |       UUID      | Template ID (le cas échéant)                                                     |
|                   `message_id`                  |       UUID      | ID du lot/requête de message                                                     |
|                  `message_name`                 |      String     | Nom du message                                                                   |
|                 `message_title`                 |      String     | Titre du message (anglais uniquement)                                            |
|                `message_contents`               |      String     | Corps du message tronqué (anglais uniquement)                                    |
|                 `failure_reason`                |      String     | Raison d'échec (pour les événements d'échec de push et d'email)                  |
| `_created`, `_id`, `_index`, `_fivetran_synced` | *Usage interne* | Métadonnées de synchronisation Fivetran                                          |

### Notes

* Les synchronisations après l'enregistrement/l'activation peuvent prendre 15 à 30 minutes supplémentaires pour se terminer.
* La désactivation peut toujours entraîner une dernière synchronisation finale après la désactivation.
* Pour garantir une synchronisation efficace des données, notre système crée et gère automatiquement des ensembles de données intermédiaires. Ces ensembles de données, nommés selon un modèle comme `fivetran_{deux mots aléatoires}_staging`, stockent temporairement les données pendant le traitement avant qu'elles ne soient intégrées dans votre schéma principal. Ces ensembles de données intermédiaires sont essentiels pour maintenir un flux de travail rationalisé et ne doivent pas être supprimés, car ils seront automatiquement recréés.

***

## Migration depuis l'ancienne version

Si vous utilisez actuellement l'[intégration Snowflake héritée](./snowflake-legacy), cette section couvre les différences clés et comment migrer vos requêtes.

### Différences clés

| Fonctionnalité                   | Hérité                                       | Nouveau                                       |
| -------------------------------- | -------------------------------------------- | --------------------------------------------- |
| **Fréquence de synchronisation** | 24 heures                                    | Aussi souvent que toutes les 15 minutes       |
| **Propriété des données**        | Accès en lecture seule aux données partagées | Écrit directement dans votre compte Snowflake |
| **Rétention des données**        | 30 jours                                     | Vous contrôlez la rétention                   |
| **Sélection d'événements**       | Tous les événements                          | Choisissez des types d'événements spécifiques |

### Changements de schéma

La nouvelle intégration crée des colonnes à la demande. Si aucun événement ne contient de données pour un champ particulier, cette colonne n'existera pas dans votre table. Quand des données apparaissent pour ce champ, la colonne est créée automatiquement.

#### Renommage de colonnes

| Colonne héritée              | Nouvelle colonne   |
| ---------------------------- | ------------------ |
| `EVENT_IMPRESSION_TIMESTAMP` | `EVENT_TIMESTAMP`  |
| `SUBSCRIPTION_LANGUAGE`      | `LANGUAGE`         |
| `MESSAGE_BODY`               | `MESSAGE_CONTENTS` |

### Inférence de type

La nouvelle intégration utilise l'inférence automatique de type. Si toutes les valeurs d'une colonne sont numériques (par ex., toutes vos valeurs `EXTERNAL_ID` sont des nombres), la colonne peut être typée comme `NUMBER`. Si une valeur non numérique apparaît plus tard, le type de colonne est promu vers `VARCHAR`.

Utilisez un casting explicite si nécessaire :

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

### Migration des requêtes

Pour migrer les requêtes existantes :

1. Mettez à jour les références à la base de données héritée pour pointer vers votre nouvelle base de données Snowflake
2. Tenez compte des renommages de colonnes listés ci-dessus
3. Ajoutez un casting de type explicite si nécessaire

Optionnellement, créez une vue de compatibilité qui fait un alias des nouveaux noms de colonnes vers les noms hérités :

```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>
  Remplacez `ONESIGNAL_DB.ONESIGNAL_EVENTS_XXXXX.MESSAGE_EVENTS` par vos noms réels de base de données, schéma et table.
</Note>

Pour déconnecter votre partage de données hérité, contactez [snowflake-data-sharing@onesignal.com](mailto:snowflake-data-sharing@onesignal.com).

***

## Configuration entrante

Importez des données d'événements comportementaux de Snowflake vers OneSignal pour :

* Déclencher des Journeys basés sur l'activité des utilisateurs
* Personnaliser la messagerie en fonction des données comportementales

**Exigences**

* Accès aux [Event Streams](/docs/en/event-streams) pour les événements de message sortants (Les limitations de forfait et les dépassements s'appliquent)
* Accès aux [Événements personnalisés](/docs/en/custom-events) pour la synchronisation des événements entrants (Les limitations de forfait et les dépassements s'appliquent)
* [Forfait de compte mis à jour](https://onesignal.com/pricing) (non disponible sur les applications gratuites)

- **Compte Snowflake** avec accès à l'entrepôt
- **Données d'événements** stockées dans des tables ou vues Snowflake
- **Connectivité réseau** de OneSignal vers votre instance Snowflake
- **Identifiants utilisateur** avec les permissions appropriées

<Steps>
  <Step title="Créer un rôle dédié pour OneSignal">
    Créez une hiérarchie de rôles en suivant les meilleures pratiques 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="Créer un entrepôt dédié">
    Créez un entrepôt optimisé en termes de coût pour les opérations 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="Créer un utilisateur et accorder les permissions">
    Créez l'utilisateur OneSignal et accordez l'accès à vos données d'événements :

    ```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="Créer une base de données de comptabilité (Moteur de synchronisation avancé)">
    Créez une base de données privée pour la gestion de l'état de synchronisation 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>
      Ignorez cette étape si vous utilisez le moteur de synchronisation de base ou le mode lecture seule.
    </Warning>
  </Step>

  <Step title="Configurer l'authentification">
    Configurez l'authentification par paire de clés (recommandée) pour une sécurité renforcée :

    1. Générez une paire de clés publique/privée en suivant [la documentation de Snowflake](https://docs.snowflake.com/en/user-guide/key-pair-auth)
    2. Configurez la clé publique sur votre utilisateur Snowflake
    3. Utilisez la clé privée dans les paramètres de connexion de OneSignal

    Alternativement, vous pouvez utiliser l'authentification par mot de passe (obsolète - sera bloquée en novembre 2025).
  </Step>

  <Step title="Se connecter à OneSignal">
    Dans OneSignal, allez dans **Data > Integrations** et cliquez sur **Add Integration**.

    Sélectionnez **Snowflake** et fournissez les détails de connexion suivants :

    * **Nom du compte :** Votre identifiant de compte Snowflake (par ex., `abc123.us-east-1`)
    * **Entrepôt :** `CENSUS_WAREHOUSE`
    * **Utilisateur :** `CENSUS`
    * **Base de données :** Le nom de votre base de données d'événements
    * **Schéma :** Le nom de votre schéma de données d'événements
    * **Authentification :** Paire de clés (fournir la clé privée et la phrase secrète facultative)
  </Step>
</Steps>

***

### Mappage des données d'événement

Mappez vos {DATA_TYPE_0} {PLATFORM_0} au format des événements personnalisés de OneSignal :

| Champ OneSignal | {COLUMN_HEADER_0} | Description                     | Requis |
| --------------- | ----------------- | ------------------------------- | ------ |
| `name`          | `event_name`      | Identifiant de l'événement      | Oui    |
| `external_id`   | `user_id`         | Identifiant de l'utilisateur    | Oui    |
| `timestamp`     | `event_timestamp` | Quand l'événement s'est produit | Non    |
| `properties`    | `event_data`      | {PROPERTIES_DESCRIPTION_0}      | Non    |

#### Schéma de table d'événements exemple

```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
);
```

#### Mode requête SQL

Écrivez des requêtes SQL personnalisées pour transformer vos données d'événements :

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

### Configuration avancée

#### Gestion des coûts de l'entrepôt

* Utilisez une taille d'entrepôt X-Small pour l'optimisation des coûts
* Configurez la suspension automatique (60 secondes) et la reprise automatique
* Planifiez les synchronisations pendant les heures creuses
* Envisagez de partager l'entrepôt avec d'autres systèmes de traitement par lots

#### Prise en charge des synchronisations en direct

Pour le traitement des événements en temps réel, activez le suivi des modifications sur vos tables d'événements :

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

#### Sécurité réseau

Si vous utilisez la politique réseau d'adresses IP autorisées de Snowflake, ajoutez les adresses IP de OneSignal à votre liste d'autorisation. Contactez le support OneSignal pour les plages d'IP actuelles.

***

## Limitations

* Les requêtes analytiques complexes peuvent impacter les performances et les coûts de l'entrepôt
* L'authentification Utilisateur/Mot de passe sera obsolète en novembre 2025
* La base de données CENSUS est réservée uniquement aux opérations OneSignal

***

## FAQ

### Quelle méthode d'authentification dois-je utiliser ?

Utilisez **l'authentification par paire de clés** (recommandée). L'authentification Utilisateur/Mot de passe sera bloquée par Snowflake à partir de novembre 2025.

### Puis-je utiliser un entrepôt existant ?

Oui, vous pouvez partager un entrepôt avec d'autres systèmes de traitement par lots comme dbt ou Fivetran pour optimiser les coûts. Assurez-vous que l'entrepôt dispose d'une capacité suffisante pour vos besoins de traitement d'événements.

### Comment puis-je optimiser les coûts ?

* Utilisez une taille d'entrepôt X-Small
* Configurez une suspension automatique agressive (60 secondes)
* Planifiez les synchronisations pendant les heures creuses
* Utilisez des synchronisations horaires/quotidiennes au lieu d'une synchronisation continue

***
