Tutoriel étape par étape : Créer une application Optimizely Connect Platform (OCP)

Tutoriel étape par étape : Créer une application Optimizely Connect Platform (OCP)

Alex Rollin
Alex Rollin
January 10, 2026
Dernière mise à jour : February 15, 2026
January 10, 2026

Optimizely Connect Platform est devenue disponible au grand public en juillet 2025 et s'est rapidement imposée comme la méthode standard pour intégrer des systèmes externes aux produits Optimizely. Que vous ayez besoin de synchroniser des données CRM, d'envoyer des analyses vers Opal ou de créer des flux de travail personnalisés entre votre infrastructure de commerce électronique et Optimizely, OCP fournit l'infrastructure sans serveur pour y arriver. Ce tutoriel vous guide dans la création de votre première application OCP à partir de zéro. À la fin, vous aurez une application fonctionnelle qui reçoit des données webhook et envoie des notifications vers Slack. Un point de départ pratique que vous pouvez adapter pour des intégrations plus complexes.

Prérequis

Avant de commencer, assurez-vous d'avoir les éléments suivants en place :

Environnement de développement

  • Node.js 18 ou plus récent installé
  • Un éditeur de code avec support TypeScript (VS Code fonctionne bien)
  • Git pour le contrôle de version
  • Accès au terminal pour les commandes CLI

Accès Optimizely

  • Un compte développeur OCP (demandez l'accès en envoyant un courriel à l'équipe de développement OCP listée dans la documentation d'Optimizely)
  • Le CLI OCP installé et configuré avec vos identifiants
  • Accès à au moins un compte OCP où vous pouvez installer des applications

Services externes

  • Un espace de travail Slack où vous pouvez créer des webhooks entrants
  • Une URL webhook Slack pour les tests (créez-en une sur api.slack.com sous Incoming Webhooks)

Connaissances techniques

  • Familiarité de base avec TypeScript
  • Compréhension des API REST et des webhooks
  • Expérience avec la gestion de paquets npm

Si vous n'avez pas encore de compte développeur OCP, c'est l'élément qui prend le plus de temps à obtenir. Optimizely traite généralement les demandes en quelques jours ouvrables.

Étape 1 : Installer et configurer le CLI OCP

Le CLI OCP gère tout, de la création de la structure de votre application jusqu'à sa publication dans le répertoire d'applications. Commencez par l'installer globalement :

npm install -g @optimizely/ocp-cli

Après l'installation, authentifiez-vous avec vos identifiants de développeur :

ocp auth login

Cela ouvre une fenêtre de navigateur pour l'authentification Opti ID. Une fois authentifié, vérifiez votre configuration :

ocp auth status

Vous devriez voir les informations de votre compte développeur et les permissions associées.

Étape 2 : Enregistrer votre application

Chaque application OCP nécessite un identifiant unique enregistré auprès d'Optimizely avant de pouvoir la développer. Exécutez la commande d'enregistrement :

ocp app register

Le CLI vous demande plusieurs informations :

  • App ID : Utilisez le format snake_case, comme slack_notifier. Cet identifiant doit être unique globalement.
  • Display Name : Nom lisible par les humains, comme « Slack Notifier »
  • Target Product : Sélectionnez « Connect Platform »
  • Visibility : Choisissez « private » pour le développement (vous pourrez changer ça plus tard)

L'enregistrement réserve votre identifiant d'application et crée les enregistrements backend nécessaires au développement.

Étape 3 : Créer la structure de l'application

Avec votre application enregistrée, générez la structure du projet :

ocp app init

Le CLI demande des détails supplémentaires :

  • Name : Pré-rempli depuis l'enregistrement
  • App ID : Pré-rempli depuis l'enregistrement
  • Version : Commencez avec 1.0.0-dev.1 pour le développement
  • Summary : Description brève comme « Envoie des notifications Slack pour les événements OCP »
  • Support URL : Votre page de documentation ou de support
  • Support Email : Courriel de contact pour les utilisateurs
  • Category : Choisissez quelque chose d'approprié (évitez les catégories réservées comme Commerce Platform ou Content Management)
  • Template : Sélectionnez « Empty Project » pour ce tutoriel

La création génère cette structure :

slack-notifier/
├── app.yml
├── package.json
├── tsconfig.json
├── src/
│   ├── functions/
│   ├── jobs/
│   └── schema/
└── node_modules/

Naviguez dans votre nouveau projet et installez les dépendances :

cd slack-notifier
npm install

Étape 4 : Définir le formulaire de paramètres

Les utilisateurs ont besoin d'un moyen de configurer votre application après l'installation. OCP gère ça via un formulaire de paramètres défini dans votre fichier app.yml. Ouvrez-le et ajoutez une section settings :

id: slack_notifier
name: Slack Notifier
version: 1.0.0-dev.1
summary: Sends Slack notifications for OCP events

settings:
  - id: slack_webhook_url
    type: string
    label: Slack Webhook URL
    description: The incoming webhook URL from your Slack workspace
    required: true
    sensitive: true
  - id: notification_channel
    type: string
    label: Channel Override
    description: Optional channel name to override the webhook default
    required: false
  - id: include_timestamp
    type: boolean
    label: Include Timestamp
    description: Add timestamp to notification messages
    default: true

Le paramètre sensitive: true indique à OCP de masquer ce champ dans les journaux et l'interface utilisateur. Utilisez toujours ceci pour les clés API, les jetons et les URL webhook.

Notre expérience montre que fournir des valeurs par défaut sensées et des descriptions claires dans les paramètres réduit considérablement les demandes de support. Les utilisateurs apprécient de savoir exactement ce que chaque champ fait sans avoir besoin de consulter une documentation externe.

Étape 5 : Créer la fonction de notification

Les fonctions sont le cœur des applications OCP : elles gèrent les requêtes entrantes et exécutent votre logique métier. Créez un nouveau fichier à src/functions/notify.ts :

import * as App from '@zaiusinc/app-sdk';

interface NotificationPayload {
  title: string;
  message: string;
  severity?: 'info' | 'warning' | 'error';
  metadata?: Record<string, string>;
}

export class Notify extends App.Function {
  public async perform(): Promise<App.Response> {
    // Get configuration from app settings
    const webhookUrl = this.app.settings.slack_webhook_url;
    const channelOverride = this.app.settings.notification_channel;
    const includeTimestamp = this.app.settings.include_timestamp;

    if (!webhookUrl) {
      this.logger.error('Slack webhook URL not configured');
      return new App.Response(500, {
        error: 'Slack webhook URL not configured'
      });
    }

    // Parse incoming request
    let payload: NotificationPayload;
    try {
      payload = this.request.body as NotificationPayload;
    } catch (err) {
      this.logger.error('Invalid request payload', { error: err });
      return new App.Response(400, {
        error: 'Invalid request payload'
      });
    }

    // Build Slack message
    const slackMessage = this.buildSlackMessage(
      payload,
      includeTimestamp,
      channelOverride
    );

    // Send to Slack
    try {
      const response = await fetch(webhookUrl, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(slackMessage)
      });

      if (!response.ok) {
        throw new Error(`Slack returned ${response.status}`);
      }

      this.logger.info('Notification sent successfully', {
        title: payload.title
      });

      return new App.Response(200, {
        success: true,
        message: 'Notification sent'
      });
    } catch (err) {
      this.logger.error('Failed to send Slack notification', { error: err });
      return new App.Response(500, {
        error: 'Failed to send notification'
      });
    }
  }

  private buildSlackMessage(
    payload: NotificationPayload,
    includeTimestamp: boolean,
    channelOverride?: string
  ) {
    const colorMap = {
      info: '#36a64f',
      warning: '#ff9800',
      error: '#dc3545'
    };

    const attachment: any = {
      color: colorMap[payload.severity || 'info'],
      title: payload.title,
      text: payload.message,
      fields: []
    };

    // Add metadata as fields
    if (payload.metadata) {
      for (const [key, value] of Object.entries(payload.metadata)) {
        attachment.fields.push({
          title: key,
          value: value,
          short: true
        });
      }
    }

    // Add timestamp if configured
    if (includeTimestamp) {
      attachment.ts = Math.floor(Date.now() / 1000);
    }

    const message: any = {
      attachments: [attachment]
    };

    if (channelOverride) {
      message.channel = channelOverride;
    }

    return message;
  }
}

Maintenant, enregistrez cette fonction dans votre app.yml :

functions:
  - id: notify
    entry_point: src/functions/notify.ts
    description: Receives notification requests and sends them to Slack

Étape 6 : Ajouter une tâche planifiée de vérification de santé

Les tâches (jobs) s'exécutent selon des horaires plutôt qu'en réponse à des requêtes HTTP. Elles sont utiles pour les synchronisations périodiques, les tâches de nettoyage ou les vérifications de santé. Créez src/jobs/health-check.ts :

import * as App from '@zaiusinc/app-sdk';

export class HealthCheck extends App.Job {
  public async perform(): Promise<void> {
    const webhookUrl = this.app.settings.slack_webhook_url;

    if (!webhookUrl) {
      this.logger.warn('Health check skipped: webhook not configured');
      return;
    }

    try {
      // Send a simple test message
      const response = await fetch(webhookUrl, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          text: '✅ OCP Slack Notifier health check: Connection verified'
        })
      });

      if (response.ok) {
        this.logger.info('Health check passed');
      } else {
        this.logger.error('Health check failed', {
          status: response.status
        });
      }
    } catch (err) {
      this.logger.error('Health check error', { error: err });
    }
  }
}

Enregistrez la tâche dans app.yml :

jobs:
  - id: health_check
    entry_point: src/jobs/health-check.ts
    description: Verifies Slack webhook connectivity
    schedule: 0 9 * * 1  # Every Monday at 9 AM

Étape 7 : Tester localement avec l'outil de développement OCP

L'outil de test local, lancé en décembre 2025, vous permet de tester votre application sans la déployer. Démarrez-le avec :

ocp dev

Cela lance une interface web locale où vous pouvez :

Tester le formulaire de paramètres

Naviguez vers l'onglet Settings pour voir exactement comment votre formulaire s'affiche. Entrez votre URL webhook Slack et sauvegardez. L'outil valide les champs obligatoires et gère le masquage des données sensibles.

Tester les fonctions

Allez dans l'onglet Functions, sélectionnez votre fonction notify et envoyez un payload de test :

{
  "title": "Test Notification",
  "message": "This is a test from the OCP local dev tool",
  "severity": "info",
  "metadata": {
    "Source": "Local Testing",
    "Environment": "Development"
  }
}

Cliquez sur Execute et vérifiez à la fois la réponse dans l'outil et votre canal Slack pour le message.

Tester les tâches

Passez à l'onglet Jobs et déclenchez manuellement la vérification de santé. Examinez les journaux d'exécution pour vérifier qu'elle s'est complétée avec succès.

Examiner les journaux

Le panneau Logs affiche la sortie détaillée de toutes les exécutions de fonctions et de tâches, incluant vos messages de journal personnalisés. C'est inestimable pour le débogage.

Étape 8 : Valider et préparer la publication

Une fois les tests locaux réussis, validez la configuration de votre application :

ocp app validate

Cela vérifie votre app.yml, la compilation TypeScript et les définitions de schéma. Corrigez toute erreur avant de poursuivre.

Ensuite, préparez le paquet distribuable :

ocp app prepare

Cela regroupe votre code, vos définitions de paramètres et vos métadonnées dans un format prêt pour le répertoire d'applications.

Étape 9 : Publier dans le répertoire d'applications

Publiez votre application avec :

ocp directory publish [email protected]

Cela téléverse votre application dans le répertoire d'applications. Puisque vous l'avez enregistrée comme privée, seul votre compte peut la voir initialement.

Étape 10 : Installer et configurer dans un compte OCP

Pour installer votre application dans un compte OCP spécifique, vous avez besoin de l'identifiant tracker du compte. Trouvez-le dans l'interface OCP sous les paramètres du compte, puis exécutez :

ocp directory install [email protected] YOUR_TRACKER_ID

Après l'installation :

  • Ouvrez l'interface OCP et naviguez vers le répertoire d'applications
  • Trouvez votre application Slack Notifier
  • Cliquez sur Configure et entrez votre URL webhook Slack de production
  • Sauvegardez les paramètres

Votre fonction est maintenant en ligne et accessible à une URL comme :

https://connect.optimizely.com/slack_notifier/notify/[installation-uuid]

Utilisez cette URL comme point de terminaison webhook dans d'autres systèmes pour déclencher des notifications Slack.

Erreurs courantes à éviter

Oublier de marquer les champs sensibles

Utilisez toujours sensitive: true pour les identifiants. On a constaté que les applications qui échouent à la revue de sécurité oublient souvent ce simple paramètre sur un ou deux champs. C'est facile à négliger mais critique pour protéger les données des utilisateurs.

Coder en dur la configuration

Ne mettez jamais de clés API ou de valeurs spécifiques à l'environnement directement dans le code. Tout ce qui est configurable devrait passer par le formulaire de paramètres. Ça semble évident, mais ça devient tentant lors du débogage.

Ignorer les réponses d'erreur

Vos fonctions devraient toujours retourner des codes de statut HTTP appropriés. Une fonction qui retourne 200 pour chaque requête rend le débogage impossible pour les utilisateurs et les systèmes externes.

Sauter les tests locaux

L'outil ocp dev existe pour une raison. Déployer du code non testé et déboguer via le répertoire d'applications prend beaucoup plus de temps que l'itération locale.

Utiliser des catégories réservées

Lors de l'enregistrement de votre application, évitez les catégories comme « Commerce Platform », « Content Management » ou « Loyalty & Rewards ». Celles-ci sont réservées aux intégrations spécifiques de produits Optimizely.

Ne pas gérer les paramètres manquants

Les utilisateurs pourraient installer votre application avant de la configurer. Vos fonctions devraient gérer élégamment les paramètres obligatoires manquants plutôt que de lancer des erreurs incompréhensibles.

Vérifier votre déploiement

Après l'installation, vérifiez que tout fonctionne :

Tester le point de terminaison de la fonction

Utilisez curl ou Postman pour envoyer une requête de test :

curl -X POST https://connect.optimizely.com/slack_notifier/notify/[your-uuid] \
  -H "Content-Type: application/json" \
  -d '{"title": "Production Test", "message": "Hello from production!", "severity": "info"}'

Vérifier Slack

Confirmez que le message apparaît dans votre canal configuré avec le formatage approprié.

Examiner les journaux dans OCP

Naviguez vers votre application dans l'interface OCP et vérifiez les journaux d'exécution pour confirmer le succès.

Déclencher la tâche planifiée

Exécutez manuellement la tâche de vérification de santé depuis l'interface OCP pour vérifier que les tâches planifiées fonctionnent correctement.

Passer en production

Quand vous êtes prêt pour une distribution plus large :

Incrémenter la version

Mettez à jour votre version dans app.yml vers un numéro de production comme 1.0.0, puis exécutez à nouveau validate, prepare et publish.

Liste publique

Changez la visibilité de votre application à public et soumettez-la pour révision. Optimizely complète généralement les révisions en 1 à 2 jours ouvrables.

Documentation

Créez une documentation utilisateur couvrant l'installation, la configuration et le dépannage. Liez-la depuis votre URL de support dans app.yml.

Conclusion

Vous avez maintenant une application OCP fonctionnelle qui démontre les patrons de base : configuration des paramètres, implémentation de fonctions, tâches planifiées et le flux de travail complet du développement au déploiement. À partir d'ici, vous pouvez vous aventurer dans des territoires plus complexes : ajouter des définitions de schéma pour le stockage de données, construire des flux de synchronisation en plusieurs étapes ou intégrer des produits Optimizely supplémentaires.

Les équipes avec lesquelles on travaille rapportent que la courbe d'apprentissage initiale avec OCP vient de la compréhension du cycle de vie et des commandes CLI plutôt que du codage en tant que tel. Une fois que vous avez construit une application, les suivantes suivent les mêmes patrons.

Créer des intégrations OCP personnalisées demande d'équilibrer les conventions de la plateforme Optimizely avec vos exigences métier spécifiques. Si vous planifiez une application OCP pour usage en production, que ce soit un connecteur de synchronisation de données, une intégration d'outil Opal ou quelque chose de plus spécialisé, on peut vous aider à concevoir l'architecture et éviter les pièges courants qui ralentissent le développement.

Share this article