Programme de fidélité par paliers
Cas d'usage événements personnalisés + données personnalisées · Pour les boutiques avec un programme de fidélité à paliers (Bronze, Silver, Gold, Platinum) qui veulent déclencher des scénarios marketing en temps réel sur les événements du programme : gain de points, changement de palier, points à expirer.
Le besoin métier
Votre programme de fidélité attribue des points à chaque achat (ou action de gamification : parrainage, avis client, abonnement newsletter) et fait monter/descendre vos clients sur 4 paliers : Bronze, Silver, Gold, Platinum. Chaque palier débloque des avantages (livraison offerte, code promo permanent, accès anticipé aux ventes privées).
Vous voulez utiliser ShopiMind pour :
- Notifier le client en temps réel quand il gagne des points (« +50 points pour votre commande, solde = 1290 pts »).
- Féliciter le client lors du passage à un palier supérieur (« Vous êtes désormais Gold 🎉 »).
- Rattraper un client qui rétrograde (« Encore 30 jours pour reconquérir votre statut Gold »).
- Rappeler au client ses points sur le point d'expirer (« 500 points expirent dans 7 jours »).
La solution ShopiMind
Trois briques combinées :
- Une définition « LoyaltyAccount » (donnée personnalisée) qui stocke l'état courant du compte fidélité : solde, palier, date d'entrée dans le palier. Utile pour la segmentation et l'affichage dynamique dans les messages.
- Plusieurs types d'événements déclarés via
createEvent, un par moment-clé du programme. - Des scénarios d'automatisation configurés côté dashboard ShopiMind, abonnés aux événements et qui personnalisent leur contenu avec les attributs
LoyaltyAccount.
Le modèle de données
Définition « LoyaltyAccount »
L'état courant du programme pour un contact. Une ligne par client inscrit.
contact_id(number) — relation vers l'entité Contact.points_balance(number) — solde courant en points.tier(text) —Bronze,Silver,GoldouPlatinum.tier_since(date) — date d'entrée dans le palier courant.next_expiry_date(date) — date d'expiration du prochain lot de points.next_expiry_amount(number) — nombre de points qui vont expirer à cette date.- Clé d'unicité :
contact_id— un compte fidélité par contact.
Types d'événements
code_name | Déclenché par votre système | metaData |
|---|---|---|
loyalty.points_earned | À chaque gain de points (achat, parrainage, etc.) | points_amount, reason, new_balance |
loyalty.tier_upgraded | Passage à un palier supérieur | previous_tier, new_tier |
loyalty.tier_downgraded | Passage à un palier inférieur | previous_tier, new_tier, grace_period_days |
loyalty.points_expiring | X jours avant expiration d'un lot | points_at_risk, expiry_date |
Mise en place
1. Créer la définition « LoyaltyAccount »
curl -X POST 'https://core.shopimind.com/v1/custom-data-definitions' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"name": "LoyaltyAccount",
"description": "Etat courant du programme de fidelite pour un contact",
"unique_keys": ["contact_id"],
"fields": [
{ "name": "contact_id", "label": "Contact", "type": "number", "required": true },
{ "name": "points_balance", "label": "Solde points", "type": "number", "required": true },
{ "name": "tier", "label": "Palier", "type": "text", "required": true },
{ "name": "tier_since", "label": "Palier depuis", "type": "date", "required": false },
{ "name": "next_expiry_date", "label": "Prochaine expir.", "type": "date", "required": false },
{ "name": "next_expiry_amount", "label": "Points en risque", "type": "number", "required": false }
],
"relationships": [
{ "sourceField": "contact_id", "targetSchemaType": "system", "targetSchema": "contacts", "targetField": "id_contact" }
]
}'Notez l'id_definition retourné — disons 312.
2. Déclarer les types d'événements
Un appel par type d'événement. Les code_name choisis ici suivent la notation Resource.Action recommandée — vous pouvez aussi utiliser _ comme séparateur.
# 1/ Gain de points
curl -X POST 'https://core.shopimind.com/v1/events' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"name": "Fidelite — points gagnes",
"code_name": "loyalty.points_earned",
"properties": {
"metaData": [
{ "name": "points_amount", "type": "number", "required": true,
"description": "Nombre de points credites par cette action" },
{ "name": "reason", "type": "text", "required": true,
"description": "purchase | referral | review | newsletter_signup | birthday" },
{ "name": "new_balance", "type": "number", "required": true,
"description": "Solde apres credit" }
]
}
}'
# 2/ Passage de palier (up)
curl -X POST 'https://core.shopimind.com/v1/events' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"name": "Fidelite — palier debloque",
"code_name": "loyalty.tier_upgraded",
"properties": {
"metaData": [
{ "name": "previous_tier", "type": "text", "required": true },
{ "name": "new_tier", "type": "text", "required": true }
]
}
}'
# 3/ Retrogradation
curl -X POST 'https://core.shopimind.com/v1/events' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"name": "Fidelite — palier retrograde",
"code_name": "loyalty.tier_downgraded",
"properties": {
"metaData": [
{ "name": "previous_tier", "type": "text", "required": true },
{ "name": "new_tier", "type": "text", "required": true },
{ "name": "grace_period_days", "type": "number", "required": false,
"description": "Jours restants pour reconquerir l ancien palier" }
]
}
}'
# 4/ Points en expiration
curl -X POST 'https://core.shopimind.com/v1/events' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"name": "Fidelite — points en expiration",
"code_name": "loyalty.points_expiring",
"properties": {
"metaData": [
{ "name": "points_at_risk", "type": "number", "required": true },
{ "name": "expiry_date", "type": "date", "required": true }
]
}
}'3. Configurer les scénarios côté dashboard
Dans le dashboard ShopiMind, créez un scénario d'automatisation par moment-clé. Pour chaque scénario :
- Choisissez le type de déclencheur « Événement personnalisé » et sélectionnez le
code_namecorrespondant (loyalty.points_earned,loyalty.tier_upgraded, etc.). - Construisez le message en exploitant à la fois le payload de l'événement (
{var=metaData.points_amount},{var=metaData.new_tier}) et les attributs du compte fidélité ({var=LoyaltyAccount.tier},{var=LoyaltyAccount.points_balance}).
À l'enregistrement, ShopiMind câble automatiquement l'événement au scénario — aucun appel API supplémentaire n'est nécessaire côté votre système.
4. Synchroniser l'état du compte fidélité
À chaque mutation de l'état (idéalement juste avant ou juste après l'émission de l'événement), upsertez le record LoyaltyAccount. La clé d'unicité contact_id garantit que le record existant est mis à jour, pas dupliqué.
curl -X POST 'https://core.shopimind.com/v1/custom-data-records/312' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '[
{
"contact_id": { "by": "id_customer", "value": "CUST-A4521" },
"points_balance": 1290,
"tier": "Gold",
"tier_since": "2025-11-12",
"next_expiry_date": "2026-12-31",
"next_expiry_amount": 320
}
]'Cette synchronisation permet aux scénarios d'afficher le solde et le palier à jour dans leurs messages, et de filtrer/segmenter sur ces attributs.
5. Émettre les événements
À chaque action côté votre système de fidélité, appelez triggerEvent avec le code_name correspondant.
Achat avec gain de points :
curl -X POST 'https://core.shopimind.com/v1/events/trigger/loyalty.points_earned' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"contact": { "email": "marie.dupont@example.com" },
"metaData": {
"points_amount": 50,
"reason": "purchase",
"new_balance": 1290
}
}'Passage de palier :
curl -X POST 'https://core.shopimind.com/v1/events/trigger/loyalty.tier_upgraded' \
-H 'spm-api-key: VOTRE_CLE_API' \
-H 'Content-Type: application/json' \
--data '{
"contact": { "email": "marie.dupont@example.com" },
"metaData": {
"previous_tier": "Silver",
"new_tier": "Gold"
}
}'Tous les scénarios actifs abonnés à ce code_name sont déclenchés en quasi temps réel.
Personnalisation du contenu des messages
Dans le scénario « Passage Gold », vous pouvez combiner le payload de l'événement et les attributs du compte fidélité :
Félicitations {var=contact.first_name} !
Vous venez de passer au statut {var=metaData.new_tier} 🎉
Vous bénéficiez désormais de :
- Livraison gratuite sur toutes vos commandes
- 10 % de réduction permanente
- Accès anticipé aux ventes privées
Votre solde actuel : {var=LoyaltyAccount.points_balance} pointsShopiMind résout metaData.* (payload de l'événement courant) et LoyaltyAccount.* (état du compte custom) à la volée — aucune logique conditionnelle dans le template.
Aller plus loin
Diagnostiquer un scénario muet
Si un scénario semble ne pas se déclencher après un triggerEvent :
- Vérifiez via
listEventHistoriesque l'événement est bien arrivé (filtrecode_name). - Confirmez que la cible (
contactouvisitor) a été résolue — un payload avec unemailinconnu journalise l'événement mais ne déclenche aucun scénario. - Vérifiez que le scénario est en statut actif côté dashboard.
Récapitulatif
| Étape | Endpoint | Quand |
|---|---|---|
Créer définition LoyaltyAccount | createCustomDataDefinition | Une fois |
| Déclarer les 4 types d'événements | createEvent | Une fois |
| Synchroniser l'état du compte | saveCustomDataRecords | À chaque mutation |
| Émettre un événement de fidélité | triggerEvent | À chaque action utilisateur |
| Consulter l'historique des déclenchements | listEventHistories | Diagnostic |