Ibexa Commerce 4.6 : créer un code promo panier — REX IBEXA15
Ibexa est une Digital Experience Platform (DXP) : elle réunit la gestion de contenu, les sites, les utilisateurs et, avec Ibexa Commerce, les fonctions nécessaires à une boutique en ligne. Après avoir créé nos produits, leurs variantes et une remise catalogue, nous allons tester une autre mécanique commerciale : la promotion appliquée au panier avec un code.
Notre objectif est concret : le code IBEXA15 doit appliquer 15 % de remise à partir de 50 € d’achat, en EUR.
Ce que nous voulons démontrer
- créer un code promotionnel avec des limites d’utilisation ;
- créer une remise de type
cart; - exiger un montant minimal de 50 € ;
- limiter la règle à la devise EUR ;
- appliquer la remise uniquement avec
IBEXA15; - vérifier le résultat dans l’API et dans le storefront.
Code promo et remise : deux objets différents
Dans Ibexa Commerce, le code saisi par le client n’est pas la promotion complète.
- Le code représente la valeur
IBEXA15et ses limites d’utilisation. - La remise contient le pourcentage, le seuil, la devise et la condition exigeant ce code.
Cette séparation permet de faire évoluer les règles commerciales sans mélanger la saisie du client et le calcul du prix.
1. Créer le code et la remise par migration
La démonstration est isolée dans src/Migrations/Demo/13_cart_discount_code.yaml afin de ne pas confondre nos données de formation avec les migrations d’installation d’Ibexa.
- type: discount_code
mode: create
code: IBEXA15
global_usage_limit: 100
user_usage_limit: 1
- type: discount
mode: create
identifier: demo_cart_ibexa15
discount_type: cart
priority: 9
enabled: true
rule:
type: percentage
expressionValues:
discount_percentage: 15
conditions:
- identifier: is_in_currency
expressionValues:
currency_code: EUR
- identifier: minimum_purchase_amount
expressionValues:
minimum_purchase_amount: 50
- identifier: is_valid_discount_code
expressionValues:
discount_code: IBEXA15
usage_count: 1
global_usage_count: 100
La priorité Ibexa doit être comprise entre 1 et 10. Notre première simulation avec une valeur supérieure a été refusée avant toute modification de la base : une bonne raison d’utiliser --dry-run.
2. Simuler, exécuter et réindexer
php bin/console ibexa:migrations:migrate \
--file=13_cart_discount_code.yaml \
--dry-run
php bin/console ibexa:migrations:migrate \
--file=13_cart_discount_code.yaml
php bin/console ibexa:discounts:reindex
La réindexation rend la promotion disponible pour le moteur de calcul du storefront.
3. Tester les conditions
Nous avons placé deux variantes du T-shirt dans le panier afin de dépasser le seuil de 50 €. Les tests ont ensuite validé trois comportements :
FAUX5retourne une erreur 404 : le code n’existe pas.IBEXA15retourne 200 : le code est accepté.- Le panier expose
cart_discount_code: IBEXA15et unDiscountStampde typecartavec la valeur-15%.
4. Vérifier le résultat visuel
Le storefront affiche :
- deux T-shirts à 29,90 € HT avant remise ;
- un sous-total remisé de 50,84 € HT ;
- une réduction totale de 8,96 € ;
- une TVA de 10,16 € ;
- un total de 61,00 € TTC ;
- le code
IBEXA15et le badge-15 %.
Le seuil de 50 € est contrôlé sur le montant du panier avant l’application de la promotion panier. Une fois les conditions validées, Ibexa calcule la réduction et répartit le prix remisé sur les lignes concernées.
Deux promotions peuvent coexister sans se cumuler
Notre T-shirt possède déjà une remise catalogue de 10 %. La nouvelle promotion est une remise panier de 15 %. Les deux règles sont actives dans Ibexa, mais cela ne signifie pas que le moteur applique automatiquement les deux l’une après l’autre.
Dans notre panier, Ibexa retient la promotion panier lorsque le code IBEXA15 et le seuil sont valides :
Prix initial : 2 × 29,90 € = 59,80 € HT
Remise panier 15 % : -8,96 €
Sous-total remisé : 50,84 € HT
TVA 20 % : 10,16 €
Total : 61,00 € TTC
Il ne calcule donc pas d’abord -10 %, puis encore -15 %. Si les deux promotions étaient cumulées, le résultat HT serait proche de 45,75 €, ce qui n’est pas le montant affiché.
Cette distinction est essentielle :
- coexistence : plusieurs promotions sont configurées et actives ;
- éligibilité : leurs conditions sont vraies pour le panier courant ;
- cumul : plusieurs remises modifient réellement le même prix ;
- priorité : elle aide à départager les règles, mais ne garantit pas à elle seule leur cumul.
Sur un projet réel, la stratégie de promotions doit donc être spécifiée puis testée : meilleure remise uniquement, cumul autorisé, exclusions, groupes clients et limites d’usage.
Deux pièges découverts pendant le REX
Une remise fixe peut être calculée par unité
Notre première idée était « 5 € dès 50 € ». Avec une règle fixed_amount et deux unités, Ibexa a appliqué 5 € à chaque unité, soit 10 € au total. Nous avons donc choisi une remise en pourcentage, plus prévisible pour cette démonstration.
Catalogue et panier ne sont pas nécessairement cumulés
Le T-shirt possédait déjà une remise catalogue de 10 %. Lorsqu’une remise panier valide entre en jeu, elle ne s’ajoute pas automatiquement à la première. Une remise panier de seulement 5 % aurait même remplacé une promotion plus avantageuse dans notre scénario. Le taux final de 15 % rend l’avantage client réel et visible.
Ce comportement doit être testé avec les priorités et les règles exactes du projet, plutôt que supposé.
Pourquoi Ibexa Commerce est intéressant ici
Ibexa ne limite pas la promotion à un champ « ancien prix / nouveau prix ». Le moteur combine des règles, des conditions, des devises, des seuils, des codes, des limites d’utilisation et des données de panier. Cette approche convient aux projets B2C et B2B où les prix dépendent du contexte commercial.
La contrepartie est claire : il faut connaître la portée réelle de chaque règle et vérifier le calcul dans le panier. Les migrations versionnées et les tests API rendent ce travail reproductible.
Conclusion
Nous disposons maintenant de deux mécanismes complémentaires dans notre formation :
- une remise catalogue visible dès la fiche produit ;
- une remise panier activée par
IBEXA15à partir de 50 €.
La prochaine étape pourra porter sur les limites d’usage par client, les périodes de validité ou une promotion réservée à un groupe de clients.

