Implémenter Optimizely Commerce Cloud : meilleures pratiques pour les projets de migration SAP B2B

Implémenter Optimizely Commerce Cloud : meilleures pratiques pour les projets de migration SAP B2B

Valerie Gaudette
Valerie Gaudette
December 12, 2025
Dernière mise à jour : February 15, 2026
December 12, 2025

Passer de SAP Commerce (Hybris) à Optimizely Commerce Cloud représente l'un des projets de migration les plus complexes qu'une équipe B2B puisse entreprendre. La logique de tarification hautement personnalisable de SAP, les enregistrements de conditions et les hiérarchies de clients ne se traduisent pas facilement vers n'importe quelle plateforme cible, Optimizely inclus. Mais il y a de bonnes nouvelles. Optimizely a fait des progrès significatifs en 2024-2025 avec des fonctionnalités conçues spécifiquement pour les scénarios B2B : un nouveau schéma B2B dans ODP, une modélisation des organisations améliorée dans Commerce Connect 13-14, et une recherche propulsée par l'IA dans Configured Commerce. Ces changements rendent le chemin de migration plus clair qu'il ne l'était il y a seulement deux ans. Ce guide vous accompagne à travers le processus complet de migration, de la découverte initiale jusqu'au suivi post-lancement. Nous couvrirons les modèles de données spécifiques que vous devez comprendre, les points de terminaison API que vous utiliserez pour les importations en lot, et les décisions architecturales qui déterminent si votre migration réussit ou s'enlise.

Prérequis

Avant d'entreprendre une migration de SAP vers Optimizely, assurez-vous d'avoir :

Exigences techniques :

  • Optimizely Commerce Connect 13 ou 14 installé (environnement .NET 6)
  • Accès à l'API Service d'Optimizely (package NuGet EPiServer.ServiceApi)
  • Accès à la base de données SAP Commerce ou identifiants API pour l'extraction des données
  • Plateforme middleware pour l'intégration (SAP CPI, MuleSoft, Azure Logic Apps ou similaire)
  • Environnements de développement, de préproduction et de production configurés

Exigences d'équipe :

  • Spécialiste SAP SD/Hybris familier avec votre logique actuelle de tarification et de conditions
  • Développeur .NET avec expérience Commerce Connect
  • Architecte d'intégration pour la conception du middleware
  • Analyste d'affaires qui comprend vos structures de comptes B2B et workflows d'approbation

Documentation à rassembler :

  • Liste complète des types de conditions SAP utilisés (enregistrements VK11)
  • Structure de la hiérarchie client et définitions des rôles
  • Personnalisations et extensions actuelles dans SAP Commerce
  • Volume de commandes et exigences de rétention des données historiques

Mise en œuvre étape par étape

Étape 1 : Découverte et évaluation

Commencez par auditer votre implémentation SAP Commerce en détail. Ce n'est pas un exercice rapide. Prévoyez 2 à 4 semaines pour la découverte d'une opération B2B de taille moyenne.

1.1 Audit du catalogue et des données produits

Documentez chaque attribut de produit, structure de variante et système de classification actuellement dans SAP. Portez une attention particulière aux :

  • Attributs personnalisés qui influencent la logique de tarification ou de disponibilité
  • Relations entre produits (ensembles, trousses, accessoires)
  • Hiérarchies de catégories et leur profondeur
  • Ressources médias et leurs emplacements de stockage

1.2 Inventaire des prix et promotions

La tarification basée sur les conditions de SAP est généralement la partie la plus difficile de toute migration. Créez un inventaire complet des :

  • Tous les types de conditions actifs (PR00, K004, K005, etc.)
  • Échelles et tranches utilisées
  • Ententes de tarification spécifiques aux clients
  • Règles promotionnelles et leurs conditions de déclenchement

Notre expérience démontre que la plupart des implémentations SAP n'utilisent régulièrement que 30 à 40 % de leurs types de conditions configurés. Identifier ceux qui comptent vraiment réduit significativement la portée de la migration.

1.3 Cartographie de la hiérarchie client

Le modèle donneur d'ordre/destinataire/payeur de SAP doit être traduit vers la structure d'Optimizely :

  • Donneur d'ordre (Sold-to party) → Organisation (principale)
  • Destinataire (Ship-to party) → Adresse de l'organisation
  • Payeur (Bill-to party) → Adresse de l'organisation ou organisation distincte
  • Groupe de comptes → Groupe de clients
  • Hiérarchie client → Relation parent-enfant de l'organisation
  • Rôles utilisateurs (approbateurs, acheteurs) → Rôles de contact permissions

1.4 Résultats de l'analyse des écarts

Créez un document clair listant :

  • Les fonctionnalités qui se transposent directement (vert)
  • Les fonctionnalités nécessitant un développement personnalisé (jaune)
  • Les fonctionnalités nécessitant des services externes ou une réarchitecture importante (rouge)

Étape 2 : Conception de l'architecture cible

2.1 Choisissez votre plateforme de commerce

Optimizely offre deux options de commerce B2B :

Commerce Cloud (Commerce Connect) : Idéal quand vous avez besoin d'une intégration étroite avec le CMS, d'expériences fortement axées sur le contenu et de flexibilité pour le développement personnalisé. C'est le choix typique pour les migrations SAP où l'implémentation existante est fortement personnalisée.

Configured Commerce : Préférable pour les équipes souhaitant une approche nécessitant moins de code avec de solides fonctionnalités B2B prêtes à l'emploi. Les versions mensuelles signifient un accès plus rapide aux nouvelles capacités, mais moins de contrôle sur le calendrier des mises à jour.

Pour la plupart des migrations SAP B2B, Commerce Cloud (Commerce Connect 13/14) avec Optimizely CMS et ODP constitue la pile de référence.

2.2 Architecture d'intégration

Ne connectez jamais SAP directement à Optimizely. Utilisez toujours un middleware :

SAP ERP/Commerce → Middleware (CPI/MuleSoft/Azure) → Optimizely Commerce Cloud
                                                    → ODP (pour la personnalisation)

Définissez des patrons d'intégration clairs :

  • Appels synchrones : Passage à la caisse, vérifications d'inventaire en temps réel, validation du crédit
  • Événements asynchrones : Mises à jour du catalogue, actualisations des listes de prix, synchronisations du statut des commandes

2.3 Sélection de l'approche de migration

Choisissez entre :

Déploiement par phases : Commencez par la navigation du catalogue, puis activez la fonctionnalité de panier, puis la saisie des commandes. Alternativement, déployez par région ou segment de clientèle. Risque plus faible, délai plus long.

Bascule complète (big-bang) : Tout bascule en même temps. Risque plus élevé, mais évite de maintenir deux systèmes pendant des périodes prolongées.

La plupart des migrations B2B bénéficient d'une approche par phases, particulièrement quand la formation des clients et la gestion du changement sont des facteurs importants.

Étape 3 : Exécution de la migration des données

3.1 Conception du pipeline ETL

Construisez des scripts d'extraction qui récupèrent les données de SAP Commerce et les transforment au format attendu par Optimizely. Voici un exemple simplifié de transformation d'articles de catalogue :

public class CatalogMigrationService
{
    private readonly HttpClient _serviceApiClient;
    
    public async Task ImportProductBatch(IEnumerable<SapProduct> sapProducts)
    {
        var optimizelyEntries = sapProducts.Select(MapToCommerceEntry).ToList();
        
        // Recommandation de taille de lot : 100-500 articles par requête
        foreach (var batch in optimizelyEntries.Chunk(250))
        {
            var request = new HttpRequestMessage(HttpMethod.Post, "/episerverapi/commerce/import")
            {
                Content = JsonContent.Create(new { Entries = batch })
            };
            
            var response = await _serviceApiClient.SendAsync(request);
            response.EnsureSuccessStatusCode();
            
            // Ajouter un délai entre les lots pour éviter la limitation
            await Task.Delay(500);
        }
    }
    
    private CatalogEntry MapToCommerceEntry(SapProduct sap)
    {
        return new CatalogEntry
        {
            Code = sap.MaterialNumber,
            Name = sap.Description,
            CatalogName = "MainCatalog",
            MetaClassName = DetermineMetaClass(sap.ProductType),
            // Mapper la classification SAP aux catégories Optimizely
            Categories = MapClassificationToCategories(sap.Classifications),
            // Attributs personnalisés
            Properties = MapCustomAttributes(sap.Characteristics)
        };
    }
}

3.2 Importation des clients et organisations

Les organisations nécessitent un séquencement minutieux. Les enregistrements parents doivent exister avant les enfants :

public async Task ImportOrganizationHierarchy(IEnumerable<SapCustomerHierarchy> hierarchies)
{
    // Trier par niveau de hiérarchie pour s'assurer que les parents sont créés en premier
    var sorted = hierarchies.OrderBy(h => h.Level).ToList();
    
    foreach (var hierarchy in sorted)
    {
        var org = new OrganizationDto
        {
            Name = hierarchy.CustomerName,
            OrgCustomerId = hierarchy.SapCustomerId,
            // Lier à l'organisation parente si ce n'est pas le niveau racine
            ParentOrganizationId = hierarchy.ParentSapId != null 
                ? await GetOptimizelyOrgId(hierarchy.ParentSapId) 
                : null,
            // Assigner des groupes de clients pour la segmentation tarifaire
            CustomerGroups = MapAccountGroupToCustomerGroups(hierarchy.AccountGroup)
        };
        
        await _serviceApiClient.PostAsync("/episerverapi/commerce/customers/organization", 
            JsonContent.Create(org));
    }
}

3.3 Migration des listes de prix

Convertissez les enregistrements de conditions SAP en listes de prix Optimizely. Les types de conditions complexes peuvent nécessiter un fournisseur de tarification personnalisé :

public class SapPricingProvider : IPriceService
{
    private readonly ISapPricingGateway _sapGateway;
    
    public IPriceValue GetPrice(CatalogKey catalogKey, MarketId market, Currency currency)
    {
        // Pour les scénarios de tarification complexes, appeler SAP en temps réel
        // Mettre en cache les résultats de manière agressive pour réduire la latence
        var cacheKey = $"{catalogKey.CatalogEntryCode}_{market}_{currency}";
        
        if (!_cache.TryGetValue(cacheKey, out var price))
        {
            price = _sapGateway.CalculatePrice(
                catalogKey.CatalogEntryCode,
                GetCurrentOrganization(),
                market,
                currency);
            
            _cache.Set(cacheKey, price, TimeSpan.FromMinutes(15));
        }
        
        return price;
    }
}

Étape 4 : Configuration des fonctionnalités B2B

4.1 Configuration des organisations et permissions

Configurez le modèle d'organisation pour prendre en charge les workflows d'achat B2B :

// Définir les rôles d'acheteur au sein des organisations
public static class BuyerRoles
{
    public const string Administrator = "OrgAdmin";
    public const string Purchaser = "Purchaser";
    public const string Approver = "Approver";
    public const string Viewer = "Viewer";
}

// Assigner les permissions selon le rôle
public void ConfigureOrganizationPermissions(Organization org)
{
    var permissions = new Dictionary<string, string[]>
    {
        [BuyerRoles.Administrator] = new[] { "ManageUsers", "ManageAddresses", "PlaceOrders", "ApproveOrders" },
        [BuyerRoles.Purchaser] = new[] { "PlaceOrders", "ViewOrderHistory" },
        [BuyerRoles.Approver] = new[] { "ApproveOrders", "ViewOrderHistory" },
        [BuyerRoles.Viewer] = new[] { "ViewCatalog", "ViewOrderHistory" }
    };
    
    foreach (var role in permissions)
    {
        _organizationService.SetRolePermissions(org.OrganizationId, role.Key, role.Value);
    }
}

4.2 Intégration ODP pour la personnalisation B2B

Avec le schéma B2B 2025 dans ODP, vous pouvez modéliser les hiérarchies de comptes et exécuter un ciblage au niveau du compte :

{
  "business": {
    "business_id": "ORG-12345",
    "name": "Acme Manufacturing",
    "parent_business_id": "ORG-PARENT",
    "industry": "Manufacturing",
    "tier": "Gold",
    "attributes": {
      "annual_contract_value": 500000,
      "primary_region": "EMEA"
    }
  }
}

Ceci permet une segmentation comme « Afficher la tarification promotionnelle aux comptes manufacturiers de niveau Or dans la région EMEA » sans développement personnalisé.

Erreurs courantes à éviter

1. Tenter de répliquer la logique de tarification à l'identique

Les enregistrements de conditions SAP peuvent encoder des centaines de règles. Essayer de répliquer chaque nuance dans Optimizely mène à du code impossible à maintenir.

Meilleure approche : Travaillez avec les parties prenantes de l'entreprise pour simplifier la tarification durant la migration. Plusieurs types de conditions existent pour des raisons historiques et peuvent être consolidés ou éliminés.

2. Migrer tout l'historique des commandes

Déplacer des millions d'enregistrements de commandes prolonge les délais et ajoute rarement de la valeur. La plupart des clients n'ont besoin que de 1 à 2 ans d'historique dans le nouveau système.

Meilleure approche : Importez les commandes récentes (12-24 mois) vers Optimizely. Construisez une vue en lecture seule ou une API contre la base de données SAP existante pour les enregistrements plus anciens.

3. Des intégrations synchrones pour tout

Appeler SAP pour chaque affichage de page, recherche ou mise à jour de panier crée de la latence et des points de défaillance uniques.

Nous avons constaté que les équipes qui mettent en cache de manière agressive les données de catalogue et de tarification, en les actualisant via des événements asynchrones plutôt que des appels en temps réel, observent des temps de chargement de page 40 à 60 % plus rapides que celles utilisant des patrons synchrones partout.

4. Sauter la validation de la hiérarchie des organisations

Les relations parent-enfant doivent être correctes avant l'importation. Une hiérarchie mal alignée brise les permissions, la tarification et les rapports.

Meilleure approche : Exécutez des scripts de validation qui vérifient que chaque organisation enfant a un parent existant avant l'importation en lot. Signalez les enregistrements orphelins pour révision manuelle.

5. Sous-estimer les tests d'acceptation utilisateur avec de vrais clients

Les tests internes capturent rarement les cas limites que les clients B2B rencontrent quotidiennement : termes contractuels spécifiques, chaînes d'approbation inhabituelles, particularités de comptes existants.

Meilleure approche : Recrutez 5 à 10 comptes clés pour des tests d'acceptation prolongés. Donnez-leur des scénarios réels et surveillez attentivement.

Tests et vérification

Suite de tests de régression automatisés

Construisez des tests qui s'exécutent à chaque déploiement :

[TestClass]
public class PricingMigrationTests
{
    [TestMethod]
    public async Task CustomerSpecificPricing_MatchesSapCalculation()
    {
        // Arrange
        var testCases = await LoadPricingTestCases(); // Depuis l'export SAP
        
        foreach (var testCase in testCases)
        {
            // Act
            var optimizelyPrice = await _priceService.GetPrice(
                testCase.ProductCode,
                testCase.CustomerOrg,
                testCase.Quantity);
            
            // Assert
            Assert.AreEqual(testCase.ExpectedPrice, optimizelyPrice.Amount, 
                $"Écart de prix pour {testCase.ProductCode} / {testCase.CustomerOrg}");
        }
    }
}

Validation par exécution parallèle

Avant la bascule, exécutez les deux systèmes simultanément :

  • Traitez les mêmes commandes à travers SAP et Optimizely
  • Comparez les calculs de tarification, taxes et totaux
  • Documentez et investiguez tout écart

Scénarios de tests de charge

Les opérations B2B ont des patrons spécifiques à tester :

  • Opérations de panier volumineux (100-1000 lignes d'articles)
  • Calculs de prix en lot pour les clients sous contrat
  • Utilisateurs simultanés de la même organisation
  • Performance de recherche avec filtrage complexe

Liste de vérification du suivi post-migration

Suivez ces métriques après la mise en production :

  • Taux d'erreurs de commandes (cible : <0,5 %)
  • Changements dans l'abandon de panier vs. la base de référence
  • Temps de chargement des pages (cible : <3 secondes pour les pages de catalogue)
  • Volume de billets au service client liés à la tarification ou à l'accès aux comptes
  • Taux d'échecs d'intégration (journaux du middleware)

Conclusion

Les migrations de SAP vers Optimizely Commerce Cloud nécessitent une planification minutieuse dans trois domaines : la traduction du modèle de données (particulièrement la tarification et les hiérarchies clients), l'architecture d'intégration (utilisez toujours un middleware), et la configuration des fonctionnalités B2B (organisations, permissions, workflows d'approbation).

Les mises à jour 2024-2025 de la plateforme Optimizely (Commerce Connect 13-14, le schéma B2B dans ODP et la modélisation améliorée des organisations) ont rendu ces migrations plus simples qu'auparavant. Mais les défis fondamentaux demeurent : comprendre en profondeur vos personnalisations SAP, prendre des décisions judicieuses sur ce qu'il faut simplifier versus répliquer, et tester rigoureusement avec des scénarios clients réels.

Les équipes avec lesquelles nous travaillons rapportent que la phase de découverte, vraiment comprendre ce que SAP fait avant d'écrire du code de migration, est le facteur le plus déterminant dans le succès du projet. Précipiter la découverte mène à des changements de portée et des reprises qui prolongent les délais de plusieurs mois.

Si vous évaluez une migration de SAP Commerce vers Optimizely, nous pouvons vous aider à évaluer votre implémentation SAP actuelle, identifier les défis spécifiques dans votre configuration de tarification et de hiérarchie, et construire un plan de migration réaliste. Contactez-nous pour discuter des spécificités de votre projet et obtenir une vision claire du chemin à suivre.

Share this article