Plateforme de Fidelite
Mis a jourCreez et gerez des programmes de fidelite avec points, cashback, parrainages, cagnotte, gamification, wallet passes et recommandations IA. Double perspective : client et marchand.
Derniere mise a jour : 9 avril 2026
Vue d'ensemble
La plateforme de fidelite YaniPay permet aux marchands de creer des programmes personnalises et aux clientsde cumuler des points, obtenir du cashback et parrainer des proches. Le systeme est concu pour etre flexible et s'adapter a tous les types de commerces.
Cote Client
Particuliers
Inscrivez-vous aux programmes de vos commercants favoris, cumulez des points a chaque achat et echangez-les contre des recompenses exclusives.
Cote Marchand
Professionnels
Creez votre propre programme de fidelite, gerez les recompenses et analysez le comportement de vos clients pour maximiser la retention.
Double perspective
L'API de fidelite YaniPay est concu autour de deux types d'acteurs avec des routes separees pour chacun :
API Client (/api/customer/* et /api/loyalty/*)
S'inscrire a des programmes, consulter les cartes de fidelite, voir le solde de la cagnotte, utiliser les recompenses et parrainer des proches.
API Marchand (/api/pro/*)
Creer des programmes, definir les recompenses, gerer les points et analyser les statistiques de fidelite.
Fonctionnalites
Programmes
Programmes de fidelite personnalisables avec systeme de points ou cashback. Templates de cartes, configuration des paliers et regles d'attribution automatiques.
Recompenses
Catalogue de recompenses echangeables : reductions, produits gratuits, cashback et experiences exclusives. Gestion des stocks et des expirations.
Parrainage
Systeme de parrainage avec liens uniques. Bonus pour le parrain et le filleul configurables. Suivi des conversions et analytics.
Cagnotte
Cagnotte multi-sources : cumul des cashbacks, bonus parrainage et recompenses en euros. Utilisable pour les paiements YaniPay.
Gamification
YaniPay integre un systeme de gamification complet pour stimuler l'engagement client avec des streaks (series consecutives), des badges et des multiplicateurs de points. Toute la logique est implementee en fonctions pures dans lib/loyalty/gamification.ts.
Streaks
Series d'activite consecutives (daily ou weekly). Chaque jour/semaine d'activite augmente la serie et debloque des multiplicateurs bonus.
Badges
Badges deblocables par criteres : nombre d'achats, points cumules, jours de streak, palier atteint, cashback ou programmes rejoints.
Multiplicateurs
Les streaks debloquent des bonus : +10% a 7 jours, +15% a 14 jours, +25% a 30 jours. Les badges octroient aussi des points bonus.
Streak Multipliers
Le multiplicateur de streak est calcule automatiquement en fonction de la longueur de la serie :
| Streak (jours) | Multiplicateur | Bonus points |
|---|---|---|
| 0-6 | 1.0x | Aucun |
| 7-13 | 1.1x | +10% |
| 14-29 | 1.15x | +15% |
| 30+ | 1.25x | +25% |
Badge Criteria Types
Les badges sont definis via le modele Prisma BadgeDefinition et utilisent une union discriminee BadgeCriteria pour les conditions de deblocage :
1 type BadgeCriteria = 2 | { type: 'purchase_count'; threshold: number } // Nombre d'achats 3 | { type: 'points_earned'; threshold: number } // Points cumules 4 | { type: 'streak_days'; threshold: number } // Jours de streak 5 | { type: 'tier_reached'; tier: string } // Palier atteint 6 | { type: 'cashback_earned'; threshold: number } // Cashback cumule 7 | { type: 'programs_joined'; threshold: number }; // Programmes rejoints
Fonctions pures de gamification
Six fonctions pures dans lib/loyalty/gamification.ts, plus une fonction d'integration Prisma :
1 // 1. Calcul du multiplicateur de streak 2 calculateStreakMultiplier(currentStreak: number): number 3 4 // 2. Verifier si la streak continue, se reset ou est deja comptee 5 shouldContinueStreak( 6 lastDate: string, now: Date, type: 'daily' | 'weekly' 7 ): 'continue' | 'reset' | 'already_counted' 8 9 // 3. Creer/mettre a jour les donnees de streak 10 updateStreakData(existing: StreakData | null, now: Date): StreakData 11 12 // 4. Detecter les badges nouvellement debloques 13 checkBadgeUnlocks( 14 context: BadgeUnlockContext, 15 definitions: BadgeDefinitionDTO[], 16 alreadyEarned: string[] 17 ): BadgeDefinitionDTO[] 18 19 // 5. Calculer la progression vers le prochain badge 20 calculateNextBadgeProgress( 21 context: BadgeUnlockContext, 22 definitions: BadgeDefinitionDTO[], 23 alreadyEarned: string[] 24 ): NextBadgeProgress | null 25 26 // 6. Integration Prisma -- appele depuis awardLoyalty() 27 processGamificationOnAward( 28 loyaltyCardId: string, 29 purchaseCount: number 30 ): Promise<{ newBadges: EarnedBadgeDTO[]; streakUpdated: boolean }>
Stockage JSON sur LoyaltyCard
LoyaltyCard via les champs streakData (JSON) et badges (JSON array). Le traitement se fait automatiquement a chaque appel a awardLoyalty().Wallet Passes
Les cartes de fidelite YaniPay peuvent etre ajoutees nativement a Apple Wallet (fichier .pkpass via passkit-generator) et Google Wallet (lien JWT via jose). Trois routes API gerent la generation et le statut des passes.
Apple Wallet
.pkpass via passkit-generator
Genere un fichier .pkpass signe avec les certificats Apple. Le pass affiche le nom du programme, les points, le palier et un QR code pour identification en magasin.
Google Wallet
JWT via jose
Genere un JWT signe contenant les donnees de la carte de fidelite. Le lien saveUrlretourne redirige l'utilisateur vers Google Wallet pour ajout direct.
Routes API
| Methode | Route | Reponse |
|---|---|---|
| GET | /api/wallet/passes/apple/[cardId] | application/vnd.apple.pkpass (binary) |
| GET | /api/wallet/passes/google/[cardId] | JSON { saveUrl: string } |
| GET | /api/wallet/passes/status/[cardId] | JSON { apple: PlatformStatus, google: PlatformStatus } |
1 // Telecharger le .pkpass pour une carte de fidelite 2 const response = await fetch('/api/wallet/passes/apple/lc_xyz789'); 3 4 if (response.ok) { 5 const blob = await response.blob(); 6 // Declencher le telechargement du fichier .pkpass 7 const url = URL.createObjectURL(blob); 8 window.open(url); // iOS detecte automatiquement le format 9 } 10 11 // Obtenir le lien Google Wallet 12 const googleRes = await fetch('/api/wallet/passes/google/lc_xyz789'); 13 const { saveUrl } = await googleRes.json(); 14 // Rediriger vers Google Wallet 15 window.location.href = saveUrl;
Disponibilite des Wallet Passes
503 Service Unavailable si les ressources de signature ne sont pas configurees (certificats Apple ou cle de service Google). Verifiez le statut via la route /api/wallet/passes/status/[cardId]avant de proposer les boutons "Ajouter au Wallet" dans l'interface.1 // Verifier quelles plateformes sont disponibles 2 const statusRes = await fetch('/api/wallet/passes/status/lc_xyz789'); 3 const status = await statusRes.json(); 4 5 // status.apple.isAvailable — certificats configures ? 6 // status.apple.isAdded — pass deja ajoute ? 7 // status.google.isAvailable — cle de service configuree ? 8 // status.google.isAdded — pass deja ajoute ? 9 10 // Afficher les boutons conditionnellement 11 if (status.apple.isAvailable && !status.apple.isAdded) { 12 // Afficher "Ajouter a Apple Wallet" 13 } 14 if (status.google.isAvailable && !status.google.isAdded) { 15 // Afficher "Ajouter a Google Wallet" 16 }
Recommandations IA
Y.A.N.I. analyse les habitudes de depenses et genere des recommandations personnalisees pour maximiser les recompenses de fidelite. Le moteur est implemente dans lib/loyalty/recommendations.ts avec 8 types de raisons et une analyse des patterns de depenses.
Analyse des depenses
Categorisation automatique des transactions (food, shopping, health, transport, entertainment). Analyse des tendances sur 30/60 jours avec detection de patterns croissants ou decroissants.
Recommandations ciblees
8 types de recommandations triees par priorite (high/medium/low). Chaque recommandation inclut un titre, une description, une estimation de benefice et un lien d'action.
8 types de recommandations
| Raison | Priorite | Description |
|---|---|---|
expiring_points | HIGH | Points qui expirent dans les 30 prochains jours |
new_reward_available | HIGH | Assez de points pour debloquer une recompense |
churn_prevention | HIGH | Activite en baisse, risque de desengagement |
tier_proximity | MEDIUM | A 80%+ du prochain palier (Silver/Gold/Platinum) |
streak_bonus | MEDIUM | Streak active de 3+ jours avec multiplicateur |
high_frequency | MEDIUM | Programme prefere avec activite croissante |
underutilized_program | LOW | Programme rejoint mais peu utilise (<3 transactions) |
seasonal_opportunity | LOW | Opportunite saisonniere (reserve pour extension) |
Spending Pattern Analysis
La fonction analyzeSpendingPatterns()prend l'historique de transactions et retourne des patterns par programme, incluant la frequence moyenne, la tendance et la categorie de depense :
1 interface SpendingPattern { 2 programId: string; 3 programName: string; 4 storeName: string; 5 avgSpend: number; // Depense moyenne par transaction 6 avgFrequencyDays: number; // Jours entre les transactions 7 transactionCount: number; // Nombre total de transactions 8 category: SpendingCategory; // 'food' | 'shopping' | 'health' | ... 9 trend: 'increasing' | 'stable' | 'decreasing'; 10 lastActivity: string; // ISO 8601 11 }
1 // GET /api/customer/loyalty-stats 2 // Retourne les statistiques de fidelite etendues avec patterns de depenses 3 const response = await fetch('/api/customer/loyalty-stats'); 4 const data = await response.json(); 5 6 // data.recommendations: RewardRecommendationDTO[] 7 // data.spendingPatterns: SpendingPattern[] 8 // data.generatedAt: string (ISO 8601) 9 10 // Chaque recommandation contient : 11 // - title, description, priority ('high' | 'medium' | 'low') 12 // - reason (l'un des 8 types) 13 // - programId, storeName, logoUrl 14 // - estimatedBenefit (texte libre) 15 // - action { type, url, label }
Prevention du churn
computeChurnRisk() de lib/analytics/predictions.ts pour detecter les clients en risque de desengagement. Les recommandations churn_prevention sont generees uniquement pour les risques HIGH et CRITICAL.API Overview
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/loyalty/programs | Lister les programmes disponibles |
| POST | /api/loyalty/programs | Creer un programme (Pro) |
| GET | /api/loyalty/rewards | Catalogue des recompenses |
| POST | /api/loyalty/rewards | Creer une recompense (Pro) |
| GET | /api/v1/mobile/loyalty/catalog | Catalogue des programmes disponibles (mobile) |
| GET | /api/v1/mobile/loyalty/programs | Programmes auxquels le client est inscrit (mobile) |
| POST | /api/v1/mobile/loyalty/enroll/{programId} | S'inscrire a un programme (ID dans l'URL) |
| DELETE | /api/v1/mobile/loyalty/enroll/{programId} | Se desinscrire d'un programme |
| GET | /api/loyalty/referrals | Historique parrainages |
| POST | /api/loyalty/referrals | Generer un lien de parrainage |
| GET | /api/customer/loyalty-cards | Cartes fidelite du client |
| GET | /api/customer/cagnotte | Solde de la cagnotte |
| GET | /api/customer/loyalty-stats | Statistiques fidelite |
| POST | /api/customer/loyalty-cards/[cardId]/redeem | Echanger des points (par carte) |
| GET | /api/customer/loyalty-cards/[cardId]/gamification | Streaks et badges d'une carte |
| GET | /api/customer/loyalty-cards/enrolled-programs | Programmes auxquels le client est inscrit |
| GET | /api/customer/referral | Informations de parrainage du client |
| GET | /api/wallet/passes/apple/[cardId] | Telecharger le pass Apple Wallet (.pkpass) |
| GET | /api/wallet/passes/google/[cardId] | Obtenir le lien Google Wallet (JWT) |
| GET | /api/wallet/passes/status/[cardId] | Statut des wallet passes (Apple/Google) |
Roles et permissions
/api/pro/*necessitent un compte professionnel avec le role "MERCHANT". Les routes /api/customer/* sont accessibles a tous les utilisateurs authentifies. Les routes /api/loyalty/* sont mixtes.Gamification, Wallet Passes et IA
Client vs Marchand
| Action | Client | Marchand |
|---|---|---|
| Programmes | S'inscrire, consulter | Creer, modifier, supprimer |
| Points | Consulter solde, historique | Attribuer, ajuster, definir regles |
| Recompenses | Echanger, utiliser | Creer, gerer stocks, configurer |
| Parrainage | Generer lien, inviter | Definir bonus, voir analytics |
| Cagnotte | Consulter, utiliser | N/A |
| Statistiques | Historique personnel | Dashboard analytics complet |
| Cartes fidelite | Voir ses cartes | Designer templates |
| Gamification | Streaks, badges, multiplicateurs | Definir badges, voir engagement |
| Wallet Passes | Apple Wallet, Google Wallet | Personnaliser le pass |
| Recommandations IA | Suggestions personnalisees | Analytics churn, retention |
Quick Start
Inscription a un programme (Client)
1 import { apiPost, apiDelete } from '@/lib/api/client'; 2 3 const programId = 'prog_abc123'; // ID du programme dans l'URL 4 5 // S'inscrire au programme — aucun body requis 6 const result = await apiPost(`/api/v1/mobile/loyalty/enroll/${programId}`); 7 8 // result.success — true si inscription reussie 9 // result.card — LoyaltyCard creee { id, points, tier, ... } 10 11 // Se desinscrire du programme 12 const unenrollResult = await apiDelete(`/api/v1/mobile/loyalty/enroll/${programId}`); 13 14 // Lister le catalogue (tous les programmes disponibles) 15 import { apiGet } from '@/lib/api/client'; 16 const catalog = await apiGet('/api/v1/mobile/loyalty/catalog'); 17 // catalog.programs — CatalogProgramDTO[] 18 19 // Lister ses programmes inscrits 20 const enrolled = await apiGet('/api/v1/mobile/loyalty/programs'); 21 // enrolled.programs — LoyaltyCard[] avec details du programme
Creer un programme (Marchand)
1 // POST /api/pro/programs 2 const response = await fetch('/api/pro/programs', { 3 method: 'POST', 4 headers: { 'Content-Type': 'application/json' }, 5 body: JSON.stringify({ 6 name: 'Club Premium', 7 type: 'points', // "points" | "cashback" | "hybrid" 8 pointsPerEuro: 10, // 10 points par euro depense 9 tiers: [ 10 { name: 'Bronze', minPoints: 0, multiplier: 1 }, 11 { name: 'Silver', minPoints: 500, multiplier: 1.5 }, 12 { name: 'Gold', minPoints: 2000, multiplier: 2 }, 13 ], 14 cardTemplate: { 15 backgroundColor: '#1a1a2e', 16 logoUrl: '/brands/my-store-logo.png', 17 accentColor: '#e94560', 18 }, 19 }), 20 });
Templates de cartes
Workflow complet
Le parcours type d'un client s'inscrivant a un programme de fidelite via l'application mobile YaniPay :
1 sequenceDiagram 2 participant App 3 participant API 4 App->>API: GET /loyalty/catalog 5 API-->>App: { programs: [...] } 6 App->>API: POST /loyalty/enroll/{id} 7 API-->>App: { success: true, card: {...} } 8 App->>API: GET /loyalty/status 9 API-->>App: { tier, points, ... }
| Etape | Methode | Endpoint | Resultat |
|---|---|---|---|
| 1. Parcourir | GET | /api/v1/mobile/loyalty/catalog | { programs: CatalogProgramDTO[] } |
| 2. S'inscrire | POST | /api/v1/mobile/loyalty/enroll/{programId} | { success: true, card: LoyaltyCard } |
| 3. Suivre | GET | /api/v1/mobile/loyalty/programs | { programs: LoyaltyCard[] } |
| 4. Statistiques | GET | /api/customer/loyalty-stats | { tier, points, recommendations, ... } |
| 5. Se desinscrire | DELETE | /api/v1/mobile/loyalty/enroll/{programId} | { success: true } |
Changement d'API — commit 7e98b5b8
POST /api/loyalty/subscribe avec { programId }dans le body n'existe plus. Le nouveau endpoint est POST /api/v1/mobile/loyalty/enroll/{programId} — l'ID du programme est desormais passe dans l'URL, sans body. Le catalogue est accessible via GET /api/v1/mobile/loyalty/catalog et les programmes inscrits via GET /api/v1/mobile/loyalty/programs.Prochaines etapes
Ressources associees
Derniere mise a jour : 9 avril 2026 — Endpoints mobiles mis a jour (enroll v1, catalog, programs), Workflow complet, Gamification (streaks, badges), Wallet Passes Apple/Google, Recommandations IA, @platform/api/contracts/loyalty