Prizely — SaaS de Génération de Leads Ludifié Multi-Tenant
Aperçu
Nous avons conçu et développé Prizely, une plateforme SaaS multi-tenant en Laravel 12 qui transforme la collecte de leads en une expérience de jeu personnalisée. Les commerçants s'inscrivent, créent une ou plusieurs marques (chacune avec son propre slug, palette 2 couleurs, logo et jusqu'à 8 récompenses avec images), configurent les pourcentages de gain par récompense et activent les jeux Roue de la Fortune ou Jeu à Gratter. Chaque marque vit à une URL propre /{brand-slug} avec son identité visuelle — le joueur ne voit que cette marque. Avant de jouer, les leads remplissent un formulaire avec nom, email et téléphone (cases de consentement RGPD configurables par marque) ; la détection de doublons par email+téléphone empêche les abus. Les gagnants reçoivent un email de récompense automatisé avec codes d'échange optionnels. Les packs de crédits sont achetés via Stripe Checkout (facturation mesurée par partie), avec une page d'historique de facturation en libre-service. Le tableau de bord administrateur affiche des graphiques de parties par jour, les statistiques de distribution des récompenses, les taux de conversion et un tableau de leads filtrable et exportable (.xlsx). Un mode test bac à sable permet aux propriétaires de prévisualiser les jeux sans consommer de crédits ni enregistrer de leads. Pour les événements en personne, le mode borne verrouille l'appareil sur une marque avec un flux de déverrouillage réservé au propriétaire. La plateforme est bilingue (grec/anglais), conforme WCAG 2.2 AA, et inclut des animations GSAP au défilement, un SEO avec JSON-LD, des alternates hreflang par page et un fichier llms.txt pour la visibilité des crawlers IA.
Défis
Concevoir une architecture multi-tenant où chaque marque conserve sa propre identité visuelle (couleurs, logo, récompenses) au sein d'une seule installation Laravel, construire deux moteurs de jeu distincts (roue vs. grattage) partageant un pipeline commun de jeu/récompense, et implémenter une facturation Stripe mesurée qui déduit les crédits par partie sans latence perceptible pour le joueur.
Solutions
Utilisé le routage tenant-agnostique de Laravel avec wildcards {brand} et des gates de propriété basés sur les policies — une seule base de code, des vitrines de marque infinies. Chaque jeu a été construit comme un composant Blade/Alpine autonome alimentant un PlayController partagé qui valide les crédits, prévient les doublons, résout les récompenses via sélection aléatoire pondérée et envoie des emails de confirmation en file d'attente. Les sessions Stripe Checkout transportent des métadonnées (pack_id, brand_id, user_id) traitées par webhook ; une colonne de cache de solde de crédits évite les écritures DB par partie. Le mode borne utilise un flag de session + flux de déverrouillage par PIN avec tentatives limitées. Le tableau de bord administrateur utilise Chart.js pour la distribution des parties/récompenses et une table de leads filtrable basée sur DataTables avec export .xlsx.
Galerie

Page d'accueil — Ce qu'il fait, pour qui, et un démarrage gratuit

Comment ça marche — Une marque, ses lots et un lien en trois étapes

Les jeux — Lucky Wheel et Scratch-to-Win sur un seul formulaire

Mode borne — Une tablette, une marque, une nouvelle partie pour chaque visiteur

Questions-réponses — Ce que demande un marketeur avant de s'inscrire

Tarifs — Vous payez à la partie, les 100 premières sont offertes

Contact — Trois champs ou un e-mail direct, avec réponse sous deux jours

Page de marque — Aux couleurs de la marque, avec le choix du jeu

Accueil sur tablette — L'offre et quatre arguments d'un coup d'œil

À propos — La mission de Prizely, sans jargon

Cas d'usage — Boutiques, cafés, salons et campagnes QR, une carte chacun

Formulaire — Quatre champs entre le joueur et son lot

Accueil sur téléphone — La même offre, empilée pour une seule main

Menu mobile — Chaque page et l'inscription, à portée de doigt

Les jeux sur téléphone — Chacun expliqué en une seule carte

Page de marque — Ce que voit le joueur après avoir scanné le QR code

Formulaire — Les coordonnées du joueur, recueillies avant la partie
