AllyStore
Guide complet
La plateforme SaaS tout-en-un pour supermarchés africains. Découvrez en détail chaque module, son rôle et comment l'utiliser au quotidien.
Un supermarché, c'est mille gestes par jour.
AllyStore les relie tous.
Derrière chaque module, il y a une caissière pressée, un gérant qui surveille ses marges, un livreur sous la pluie. AllyStore n'est pas un logiciel de plus : c'est le fil qui relie la caisse au stock, le stock au fournisseur, le client au point de fidélité. Voici comment tout s'emboîte.
📋 Table des matières
Tableau de bord
Votre magasin d'un seul coup d'œil — KPIs, ventes récentes et alertes en temps réel.
🔧 Comment l'utiliser
Connexion et vue immédiate
Après authentification, AllyStore charge automatiquement le tableau de bord. Toutes les données sont calculées en temps réel depuis la base de données de votre boutique.
Lire les KPI du jour
Parcourez la rangée de cartes en haut : CA du jour, Ventes du jour, Panier moyen (chacune avec sa variation ▲/▼ vs hier), CA du mois (avec son objectif = total du mois dernier) et Alertes (stock bas + DLC ≤ 10 jours). Tous les montants sont nets de remises — identiques à ce qu'encaisse réellement la caisse.
Analyser les graphiques
Sous les cartes : la courbe du CA sur 14 jours (les jours sans vente apparaissent à zéro — pas de trous trompeurs), la jauge « Objectif mensuel » (demi-cercle : ambre < 60 %, bleu, vert ≥ 100 % de l'objectif = total du mois dernier), le donut des modes de paiement et le camembert du CA par catégorie (top 5 + « Autres ») sur 30 jours, et le Top 5 produits avec barres de progression et quantités vendues.
Consulter les ventes récentes
Le tableau central liste les 10 dernières ventes avec numéro, montant TTC, mode de paiement, caissier et heure. Cliquez sur une ligne pour ouvrir le reçu complet.
Gérer les alertes stock bas
La zone d'alertes liste tous les produits dont le stock actuel est inférieur ou égal au seuil minimum configuré. Cliquez sur un produit pour créer directement un bon de commande fournisseur.
Vérifier les infos boutique
Le panneau latéral affiche la devise active (FCFA), le taux de TVA, votre rôle (Admin / Caissier / Manager) et si le programme fidélité est activé pour cette boutique.
Drill-down vers les modules
Chaque KPI et chaque alerte contient un lien "Voir tout" qui navigue directement vers le module concerné (Stocks, Caisse POS, Clients…) avec les filtres pré-appliqués.
⭐ Fonctionnalités clés
KPIs avec tendance
CA du jour, ventes et panier moyen — chacun avec sa variation ▲/▼ vs hier. Jamais un chiffre isolé.
Jauge objectif mensuel
Demi-cercle de progression du CA du mois vs le total du mois dernier — ambre, bleu puis vert à 100 %.
Courbe CA 14 jours
Évolution du chiffre d'affaires net de remises, jour par jour, jours creux inclus.
Donut paiements
Répartition Espèces / Carte / Mobile Money du CA des 30 derniers jours.
Camembert catégories
Poids de chaque catégorie dans le CA (top 5 + « Autres ») pour repérer ce qui porte le magasin.
Top 5 produits
Meilleures ventes sur 30 jours avec barres de progression et quantités vendues.
Alertes consolidées
Produits sous seuil minimum + lots à DLC proche (≤ 10 jours) dans une seule carte.
Ventes récentes
Dernières transactions avec montant net, mode de paiement et caissier responsable.
Infos boutique
Devise, TVA, rôle, fidélité, produits actifs et clients inscrits en un coup d'œil.
| N° Vente | Montant TTC | Paiement | Caissier | Heure |
|---|---|---|---|---|
| #V-2026-0047 | 18 500 FC | Espèces | Amina K. | 14:32 |
| #V-2026-0046 | 42 000 FC | Mobile Money | Djibril O. | 14:17 |
| #V-2026-0045 | 9 750 FC | Carte | Amina K. | 13:58 |
| #V-2026-0044 | 63 200 FC | Espèces | Fatou S. | 13:41 |
| #V-2026-0043 | 27 800 FC | Mobile Money | Djibril O. | 13:20 |
Caisse POS
Encaissez rapidement, appliquez des remises, fidélisez vos clients et gérez tous les modes de paiement.
🔧 Comment l'utiliser
Rechercher ou scanner un produit
Tapez le nom du produit dans la barre de recherche (panneau gauche) ou scannez son code-barres. La grille de produits se filtre instantanément avec le stock disponible affiché sous chaque carte.
Ajouter au panier
Cliquez sur un produit pour l'ajouter au panier (panneau droit). Ajustez la quantité avec + / -. Appliquez une remise par ligne en pourcentage ou montant fixe directement sur la ligne article.
Identifier le client fidélité (optionnel)
Entrez le numéro de téléphone du client dans le champ dédié. AllyStore affiche son nom, son solde de points actuel et les récompenses disponibles. La vente lui attribuera automatiquement de nouveaux points.
Vérifier les totaux
Le récapitulatif panier affiche le sous-total HT, le montant TVA calculé par taux, les remises appliquées et le total TTC final. Les promotions actives (ex : -10% sur le riz) sont appliquées automatiquement.
Choisir le mode de paiement
Cliquez sur Encaisser. La modal de paiement propose : Espèces (saisie du montant remis → rendu calculé automatiquement), Carte, Mobile Money, ou Paiement mixte (plusieurs méthodes combinées).
Payer avec les points fidélité
Si un client fidélité est identifié et qu'il a un solde de points, un encart « Payer avec les points » apparaît au checkout : saisissez le nombre de points (ou bouton Max) — leur contre-valeur se déduit du total, le reste se règle normalement (espèces, carte, mobile money). Le solde est vérifié et débité côté serveur : impossible d'utiliser plus de points que le client n'en possède, même depuis deux caisses en même temps.
Finaliser et imprimer
La modal de succès confirme le numéro de vente, le rendu monnaie, les points fidélité gagnés et propose d'imprimer ou d'envoyer le reçu. Le stock est immédiatement decrementé. Si un produit atteint 0, il passe en statut PENDING_DELIVERY.
Annuler une vente (erreur de caisse)
Depuis la modal de succès, le bouton « Annuler la vente » (confirmation en deux temps) contre-passe TOUT automatiquement : la vente passe en VOIDED, le stock est réintégré article par article, les compteurs du fonds de caisse sont corrigés, les promotions utilisées sont libérées, les points gagnés sont repris et les points utilisés en paiement sont remboursés au client. Chaque annulation est tracée (motif + caissier) dans le journal d'audit.
⭐ Fonctionnalités clés
Recherche instantanée
Filtrage produits en temps réel par nom, SKU ou catégorie avec affichage du stock restant.
Scan code-barres
Compatible lecteur USB et caméra mobile pour ajouter un produit en une seconde.
Remises flexibles
Remise globale sur le panier ou par ligne article, en pourcentage ou montant fixe (FC).
Rendu monnaie auto
Saisissez le montant remis par le client — AllyStore calcule et affiche le rendu en gros chiffres.
Mobile Money
Prise en charge Wave, Orange Money, M-Pesa et paiements mixtes espèces + mobile.
Fidélité intégrée
Identification client par téléphone, cumul automatique de points et affichage des récompenses disponibles.
Promotions auto
Les promotions actives (période, produit, catégorie) sont détectées et appliquées sans action du caissier.
Cycle stock auto
Stock 0 déclenche automatiquement le passage en PENDING_DELIVERY pour alerter le responsable.
Paiement par points
Le client règle tout ou partie de son panier avec ses points fidélité — solde vérifié et débité côté serveur.
Annulation sécurisée
Void en deux clics : stock réintégré, caisse corrigée, points contre-passés, promotions libérées, audit tracé.
Anti-survente
Le décrément de stock est conditionnel en base : deux caisses ne peuvent jamais vendre le même dernier article.
Montants recalculés serveur
Prix, promotions et remises sont recalculés côté serveur à l'encaissement — un poste caisse compromis ne peut pas fausser le CA.
| Produit | Qté | PU | Total |
|---|---|---|---|
| Riz 25kg | 2 | 12 500 | 25 000 FC |
| Huile Palme 5L | 3 | 4 500 | 13 500 FC |
| Farine maïs 10kg | 1 | 6 000 | 6 000 FC |
Gestion des shifts caisse
Ouvrez et fermez la caisse chaque jour, contrôlez l'écart de trésorerie et auditez l'historique des shifts.
🔧 Comment l'utiliser
Ouvrir un shift
En début de journée (ou de session), cliquez sur Ouvrir la caisse. Saisissez le montant d'amorce mis physiquement dans le tiroir-caisse. AllyStore horodate l'ouverture et enregistre le caissier responsable.
Vendre pendant le shift
Toutes les ventes enregistrées via la Caisse POS sont automatiquement rattachées au shift ouvert. Vous pouvez consulter en temps réel le cumul des ventes espèces, carte et mobile money du shift en cours.
Fermer le shift
En fin de session, cliquez sur Fermer la caisse. Saisissez le montant compté physiquement dans le tiroir. AllyStore calcule l'écart : Attendu = Amorce + Ventes espèces - Remboursements espèces.
Analyser l'écart
Un écart positif (trop en caisse) ou négatif (manquant) est affiché en rouge/vert avec le montant précis. Notez la cause dans le champ commentaire avant de valider la fermeture.
Réconciliation et historique
Le responsable peut marquer un shift fermé comme Réconcilié après vérification comptable. L'historique complet (tous les shifts) reste accessible avec filtres par date et caissier.
⭐ Fonctionnalités clés
Ouverture horodatée
Chaque shift est daté, lié au caissier et au montant d'amorce initial.
Calcul d'écart auto
Comparaison montant attendu vs compté avec affichage immédiat de la différence.
Historique complet
Tous les shifts avec statut (Ouvert / Fermé / Réconcilié) et statistiques détaillées.
Stats par shift
Nombre de ventes, total des encaissements, annulations et remboursements du shift.
Audit & réconciliation
Le manager valide chaque shift fermé et peut ajouter un commentaire de clôture comptable.
Responsabilité caissier
Chaque shift est nominatif — aucune vente ne peut être enregistrée sans shift ouvert.
| Date | Caissier | Ouverture | Fermeture | Écart | Statut |
|---|---|---|---|---|---|
| 04/06/2026 | Amina K. | 08:15 | — | — | Ouvert |
| 03/06/2026 | Djibril O. | 08:00 | 18:30 | -1 500 FC | Fermé |
| 02/06/2026 | Fatou S. | 08:10 | 18:45 | +200 FC | Réconcilié |
| 01/06/2026 | Amina K. | 08:05 | 18:00 | 0 FC | Réconcilié |
Gestion des stocks
Gérez l'inventaire complet, réceptionnez les livraisons et suivez le cycle de vie de chaque produit en rayon.
🔧 Comment l'utiliser
Créer un nouveau produit
Cliquez sur + Nouveau produit. Renseignez : nom, SKU, catégorie, prix HT, taux TVA, stock initial, seuil minimum d'alerte, fournisseur et si le produit est périssable (date d'expiration obligatoire à la réception).
Réceptionner une livraison
Depuis la fiche produit ou via le bon de commande, cliquez sur Réceptionner un lot. Saisissez la quantité reçue, le prix d'achat HT, le numéro de lot et les dates de fabrication / expiration si le produit est périssable.
Changer le stade du produit
Depuis le panneau latéral de la fiche produit, faites progresser le produit dans son cycle : PENDING_DELIVERY → IN_DELIVERY → IN_STOCK → ON_SHELF. Seuls les produits ON_SHELF apparaissent dans la caisse POS.
Filtrer et surveiller les niveaux
Utilisez les filtres en haut de la liste : recherche textuelle, catégorie, niveau de stock (OK / Bas / Rupture), et stade de cycle. Les produits en rupture ou sous seuil sont mis en évidence automatiquement.
Ajuster manuellement le stock
Pour corriger une erreur de comptage, enregistrer une perte ou un vol, utilisez Ajustement stock. Le motif et la quantité sont enregistrés dans l'InventoryLog avec le type approprié (DAMAGE, THEFT, MANUAL_ADJUSTMENT).
⭐ Fonctionnalités clés
Cycle de vie 4 états
PENDING_DELIVERY → IN_DELIVERY → IN_STOCK → ON_SHELF — chaque transition est horodatée.
Réception par lots
Réceptionnez avec n° de lot, prix d'achat et dates fab/expiration pour les périssables.
Filtres avancés
Combinez catégorie, niveau de stock et stade pour retrouver n'importe quel produit en 2 clics.
Photo produit
Chaque fiche produit peut intégrer une photo affichée dans la caisse POS pour éviter les confusions.
InventoryLog complet
Journal de tous les mouvements de stock : ventes, réceptions, pertes, ajustements, retours.
Lien fournisseur
Chaque produit est rattaché à un fournisseur pour faciliter la création de bons de commande.
Alertes seuil min
Notification automatique dès qu'un produit passe sous son seuil minimum configuré.
Valeur de stock
Calcul automatique de la valeur totale du stock au prix d'achat et au prix de vente.
| Produit | SKU | Catégorie | Prix TTC | Stock / Seuil | Stade | Actions |
|---|---|---|---|---|---|---|
| Riz parfumé 25kg | RIZ-PF-25 | Alimentaire | 12 500 FC | 8 / 10 | ON_SHELF | Voir |
| Huile Palme 5L | HUI-PAL-5 | Alimentaire | 4 500 FC | 1 / 5 | ON_SHELF | Commander |
| Farine de maïs 10kg | FAR-MAI-10 | Alimentaire | 6 000 FC | 3 / 8 | ON_SHELF | Commander |
| Savon Lux x12 | SAV-LUX-12 | Hygiène | 8 400 FC | 45 / 20 | IN_STOCK | Mettre en rayon |
| Lait concentré sucré | LAI-CON-02 | Alimentaire | 1 200 FC | 0 / 15 | PENDING_DELIVERY | Commander |
IN_STOCK est en réserve (arrière-boutique) mais pas encore accessible à la vente. Il faut explicitement le passer en ON_SHELF pour qu'il apparaisse dans la caisse POS. Cela permet de séparer la gestion physique (où est la marchandise ?) de la gestion commerciale (est-ce vendable ?).Pertes & Démarque
Enregistrez les pertes involontaires (casse, vol, expiration) et mesurez leur impact financier sur votre marge.
🔧 Comment l'utiliser
Accéder au module
Depuis le menu principal, cliquez sur Stocks → Pertes & Démarque. Vous voyez immédiatement le journal des dernières pertes enregistrées et les totaux par type.
Déclarer une nouvelle perte
Cliquez sur + Nouvelle perte. Choisissez le produit concerné, le type de perte (DAMAGE / THEFT / EXPIRED / MANUAL_ADJUSTMENT), la quantité et ajoutez un commentaire optionnel (ex : "carton tombé du rayonnage").
Valider et impacter le stock
À la validation, AllyStore décrémente automatiquement le stock du produit de la quantité saisie et crée une entrée dans l'InventoryLog avec le type correspondant. La valeur financière est calculée au prix d'achat moyen.
Analyser les pertes
Le tableau de synthèse affiche les pertes totales du mois par type (casse, vol, expiration) avec leur valeur en FCFA. Exportez les données pour votre comptable ou votre assureur.
⭐ Fonctionnalités clés
4 types de pertes
Casse (DAMAGE), Vol (THEFT), Expiration (EXPIRED), Correction manuelle (ADJUSTMENT).
Valorisation auto
Chaque perte est valorisée au prix d'achat moyen pondéré pour quantifier l'impact réel sur la marge.
Journal InventoryLog
Toutes les pertes sont tracées dans le journal central consultable par produit, période ou type.
Synthèse mensuelle
Totaux par type de perte avec comparaison mois précédent et taux de démarque en pourcentage du CA.
Impact stock immédiat
La déclaration d'une perte décrémente le stock en temps réel sans passer par la caisse.
| Date | Produit | Type | Qté | Valeur | Commentaire |
|---|---|---|---|---|---|
| 04/06 | Yaourt Activia x6 | EXPIRED | 4 | 3 600 FC | DLC dépassée |
| 03/06 | Huile Palme 5L | DAMAGE | 2 | 9 000 FC | Bouteilles cassées |
| 02/06 | Savon Lux x12 | THEFT | 1 | 8 400 FC | Vol constaté inventaire |
| 01/06 | Biscuits Oreo 300g | DAMAGE | 6 | 4 800 FC | Emballages écrasés |
THEFT ou MANUAL_ADJUSTMENT pour maintenir la fiabilité de votre inventaire comptable.Bons de commande
Formalisez vos commandes fournisseurs, suivez les livraisons et réceptionnez les marchandises en toute traçabilité.
🔧 Comment l'utiliser
Créer un bon de commande
Cliquez sur + Nouveau BC. Sélectionnez le fournisseur, ajoutez les produits avec quantité commandée et prix HT négocié. Saisissez la date de livraison attendue. AllyStore attribue automatiquement le numéro BC-2026-XXXX.
Envoyer la commande
Passez le BC en statut SENT pour signifier que la commande a été transmise au fournisseur (par téléphone, WhatsApp ou email). Le BC est verrouillé en modification une fois envoyé.
Réceptionner la livraison
À l'arrivée des marchandises, cliquez sur Réceptionner. Pour chaque ligne produit, saisissez la quantité effectivement reçue (peut être inférieure à la quantité commandée). Le stock est incrémenté et un log SUPPLIER_IN est créé.
Gérer les réceptions partielles
Si une partie seulement de la commande arrive, le BC passe en statut PARTIALLY_RECEIVED. Il reste ouvert pour une réception complémentaire ultérieure. Le suivi des quantités restantes est affiché par ligne.
Clôturer ou annuler
Une fois toutes les quantités reçues, le BC passe automatiquement en RECEIVED. Un BC peut être annulé (CANCELLED) tant qu'il n'a pas encore de réception enregistrée.
⭐ Fonctionnalités clés
Numérotation auto
Format BC-AAAA-XXXX généré automatiquement pour chaque commande, par année civile.
5 statuts de suivi
DRAFT → SENT → PARTIALLY_RECEIVED → RECEIVED / CANCELLED avec historique des transitions.
Réception partielle
Réceptionnez ligne par ligne, quantité par quantité — le BC reste ouvert jusqu'à réception complète.
Multi-fournisseurs
Un BC par fournisseur — retrouvez facilement l'historique de vos commandes par fournisseur.
Impact stock auto
Chaque réception génère un log SUPPLIER_IN et incrémente le stock en temps réel.
Prix d'achat négocié
Enregistrez le prix HT fournisseur pour calculer la marge brute précise à la revente.
| N° BC | Fournisseur | Montant HT | Livraison prévue | Statut |
|---|---|---|---|---|
| BC-2026-0018 | Diallo & Frères SARL | 185 000 FC | 06/06/2026 | SENT |
| BC-2026-0017 | Coulibaly Distribution | 320 000 FC | 04/06/2026 | PARTIALLY_RECEIVED |
| BC-2026-0016 | Mansour Import-Export | 97 500 FC | 01/06/2026 | RECEIVED |
| BC-2026-0015 | Diallo & Frères SARL | 210 000 FC | 28/05/2026 | RECEIVED |
| BC-2026-0014 | SOCOCE Grossiste | 45 000 FC | — | CANCELLED |
PENDING_DELIVERY ou IN_DELIVERY sont automatiquement suggérés lors de la création d'un nouveau BC, avec la quantité recommandée calculée pour atteindre 2× le seuil minimum.Retours clients
Gérez les retours produits, évaluez l'état des articles et remboursez le client de la manière la plus adaptée.
🔧 Comment l'utiliser
Initier un retour
Cliquez sur + Nouveau retour. Recherchez la vente d'origine par numéro (ex : #V-2026-0042) ou par téléphone client. La vente d'origine est optionnelle si le client ne dispose plus du reçu.
Sélectionner les articles retournés
Parmi les articles de la vente, cochez ceux qui sont retournés et saisissez la quantité. Pour chaque article, évaluez la condition : GOOD (article intact, remis en stock), DAMAGED (article abîmé) ou UNSELLABLE (invendable, à jeter).
Renseigner la raison du retour
Sélectionnez la raison : produit défectueux, erreur de commande, insatisfaction, date d'expiration proche, etc. Cette information est utilisée dans les rapports qualité fournisseur.
Choisir le mode de remboursement
Sélectionnez comment rembourser le client : Espèces (montant sorti de caisse), Avoir (crédit utilisable sur un prochain achat) ou Points fidélité (conversion en points sur le compte client).
Approuver et traiter
Le caissier soumet le retour (PENDING). Le manager l'examine et l'approuve (APPROVED) ou le rejette (REJECTED) avec motif. Après approbation, un clic sur Traiter passe en PROCESSED et impacte le stock et les finances.
Vérifier l'impact stock
Les articles en condition GOOD sont réintégrés en stock avec un log RETURN_IN. Les articles DAMAGED ou UNSELLABLE génèrent un log DAMAGE et ne sont pas réintégrés.
⭐ Fonctionnalités clés
Recherche vente origine
Retrouvez la vente d'origine par numéro, téléphone client ou date pour pré-remplir le formulaire.
3 conditions article
GOOD (remis en stock), DAMAGED (perte valorisée), UNSELLABLE (mise au rebut) — impact différencié.
3 modes de remboursement
Espèces, Avoir ou Points fidélité — choisissez selon la politique de votre boutique.
Workflow approbation
Séparation des rôles : le caissier initie, le manager approuve — sécurité et traçabilité garanties.
Impact stock auto
Réintégration automatique des articles GOOD avec log RETURN_IN, démarque pour les autres.
Rapport qualité
Synthèse des retours par raison et par fournisseur pour identifier les produits problématiques.
| N° Retour | Client | Produit | Condition | Remboursement | Statut |
|---|---|---|---|---|---|
| #R-2026-0012 | Mariama B. | Riz parfumé 25kg | DAMAGED | 12 500 FC espèces | PENDING |
| #R-2026-0011 | Oumar D. | Savon Lux x12 | GOOD | Avoir 8 400 FC | PROCESSED |
| #R-2026-0010 | Kadiatou S. | Yaourt Activia | UNSELLABLE | 3 600 FC espèces | PROCESSED |
| #R-2026-0009 | Ibrahima C. | Huile Palme 5L | DAMAGED | — | REJECTED |
Clients CRM
Centralisez l'historique, les points et les achats de chaque client en un seul endroit.
🔧 Comment l'utiliser
Accéder à la liste clients
Menu latéral → Clients. La liste affiche tous les clients triés par CA total descendant. Utilisez la barre de recherche pour trouver un client par nom ou téléphone.
GET /api/store/customers?search=Aminata&limit=25
Créer un client manuellement
Bouton + Nouveau client : saisissez prénom, nom, téléphone (requis), email et date de naissance (optionnel pour le bonus anniversaire). La carte fidélité est générée automatiquement.
POST /api/store/customers { firstName, lastName, phone, email, birthDate }
Consulter la fiche client
Cliquez sur un client pour ouvrir le panel latéral : solde de points, équivalent cashback, niveau de fidélité avec barre de progression vers le niveau suivant et historique complet.
GET /api/store/customers/:id
Ajouter des points manuellement
Dans la fiche → onglet Historique → bouton Ajuster les points. Choisissez le montant (positif ou négatif), la raison (cadeau, compensation, erreur de caisse) et confirmez.
POST /api/store/loyalty/adjust { customerId, points, reason }
Suivre les KPI globaux
En haut de la page Clients : CA lifetime total de tous les clients, total des points actifs non rachetés et panier moyen calculé sur les 90 derniers jours.
GET /api/store/customers/stats
⭐ Fonctionnalités clés
Fiche client complète
Avatar avec initiales colorées, coordonnées, date de naissance, niveau de fidélité et progression vers le palier suivant.
CA lifetime & panier moyen
Chaque achat incrémente le CA total et le compteur de visites. Le panier moyen se recalcule en temps réel.
Niveaux Bronze → Platinum
Progression automatique : Bronze (0 pts), Silver (1 000), Gold (5 000), Platinum (15 000). Rétrogradation possible si règle configurée.
Historique transactions
Toutes les transactions de points (EARN, REDEEM, ADJUST, EXPIRE) horodatées et liées à la vente source si applicable.
Achats récents
Les 10 dernières ventes du client avec date, montant FCFA et statut de paiement directement depuis la fiche.
Ajustement manuel
Ajout ou retrait de points avec motif obligatoire (cadeau, compensation, erreur) pour garder un audit trail complet.
| Client | Téléphone | Niveau | Points | CA Total | Visites | Dernière visite |
|---|---|---|---|---|---|---|
| KO Kofi Ouédraogo | +225 07 12 34 56 | Gold | 6 840 pts | 3 420 000 FC | 47 | Aujourd'hui |
| AD Aminata Diallo | +221 77 456 78 90 | Platinum | 18 220 pts | 5 150 000 FC | 89 | Hier |
| MC Moussa Coulibaly | +223 76 234 56 78 | Silver | 1 340 pts | 890 000 FC | 12 | Il y a 5 jours |
| FT Fatou Traoré | +225 05 98 76 54 | Bronze | 280 pts | 145 000 FC | 3 | Il y a 18 jours |
Fidélité & Points
Un programme de points configurable pour récompenser chaque achat et fidéliser vos meilleurs clients.
🔧 Comment l'utiliser
Configurer les règles de points
Paramètres → Fidélité → définissez le multiplicateur de base (ex : 1 point par 100 FC dépensés), les bonus par catégorie produit et la récompense par visite.
PATCH /api/store/loyalty/settings { pointsPerFcfa: 0.01, visitBonus: 50 }
Utilisation automatique en caisse
Lors d'une vente, si le client est identifié (téléphone ou carte fidélité), ses points sont calculés et crédités automatiquement à la validation du paiement. Aucune saisie supplémentaire.
POST /api/store/sales → déclenche EARN_PURCHASE automatiquement
Rachat de points à la caisse
Bouton Utiliser les points dans l'écran de paiement. Saisissez le nombre de points à racheter — la remise équivalente s'affiche en FCFA et s'applique au total.
POST /api/store/loyalty/redeem { customerId, pointsToRedeem, saleId }
Bonus anniversaire
Si la date de naissance est renseignée, un bonus (configurable, ex : 500 pts) est crédité automatiquement le jour J via un cron quotidien à minuit UTC.
Cron 0 0 * * * → scan clients anniversaire du jour → EARN_BONUS
Expiration des points
Configurez une durée de validité (ex : 12 mois sans achat). Les points expirés génèrent une transaction EXPIRE dans l'historique du client avec la date et le montant concernés.
PATCH /api/store/loyalty/settings { pointsExpiryDays: 365 }
⭐ Fonctionnalités clés
Règles configurables
Multiplicateur de base, bonus par catégorie (ex : ×2 sur les produits frais), récompense à la Nième visite, bonus anniversaire.
6 types de transactions
EARN_PURCHASE, EARN_BONUS, REDEEM_DISCOUNT, CASHBACK_EARN, ADJUST et EXPIRE — chaque mouvement est tracé avec sa source.
Scan carte fidélité
Code-barres ou QR code imprimé sur la carte du client — scan via caméra ou douchette pour identification instantanée.
Conversion remise / cashback
Le client choisit : remise immédiate sur l'achat en cours ou cashback crédit à utiliser lors d'une prochaine visite.
Statistiques programme
Clients actifs, points distribués ce mois, points rachetés, taux de rachat global et évolution mensuelle en graphe.
Alertes changement de niveau
Notification SMS ou email automatique quand un client passe de Bronze à Silver, Silver à Gold, etc.
Règles actives du programme
| Règle | Valeur | Statut |
|---|---|---|
| Points par 100 FC dépensés | 1 point | Actif |
| Bonus catégorie Frais (riz, manioc) | ×2 points | Actif |
| Récompense 10e visite | +200 pts | Actif |
| Bonus anniversaire | +500 pts | Actif |
| Expiration points inactifs | 365 jours | Configuré |
| 1 point = cashback FCFA | 1 FC | Actif |
Analyse clients
Segmentez votre clientèle, mesurez la rétention et identifiez les clients à fort potentiel.
🔧 Comment l'utiliser
Analyser les cohortes d'acquisition
Onglet Cohortes : tableau mensuel des nouveaux clients acquis. Survolez un mois pour voir le taux de rétention à 30j, 60j et 90j de cette cohorte.
GET /api/store/analytics/customers/cohorts?months=6
Mesurer la rétention
Onglet Rétention : clients actifs (achat dans les 30j), à risque (31-90j) et inactifs (>90j). Cliquez sur une catégorie pour exporter la liste et créer une campagne ciblée.
GET /api/store/analytics/customers/retention
Consulter la répartition par niveau
Graphe en anneau : proportion Bronze / Silver / Gold / Platinum avec nombre de clients et CA cumulé par niveau. Utile pour mesurer l'efficacité du programme de fidélité.
GET /api/store/analytics/customers/tiers
Identifier le Top 10 clients
Onglet Top clients : classement par CA total ou par fréquence de visite. Chaque ligne donne accès direct à la fiche CRM du client.
GET /api/store/analytics/customers/top?sort=revenue&limit=10
Suivre les événements client
Flux d'événements temps réel : PURCHASE, RETURN, TIER_UPGRADE, FIRST_VISIT, BIRTHDAY_VISIT, REACTIVATION. Filtrez par type ou par client pour auditer le comportement.
GET /api/store/analytics/customers/events?type=TIER_UPGRADE
⭐ Fonctionnalités clés
Cohortes d'acquisition
Visualisez mois par mois combien de nouveaux clients vous avez gagnés et mesurez leur rétention à 30, 60 et 90 jours.
Analyse de rétention RFM
Segmentation Récence / Fréquence / Montant pour identifier vos champions, clients fidèles, clients à risque et clients perdus.
Top clients actionnable
Classement croisé CA / fréquence avec lien direct vers la fiche CRM pour offrir une attention personnalisée immédiate.
Répartition par niveau
Visualisez l'évolution de votre base Bronze → Platinum pour mesurer la montée en gamme de votre clientèle mois après mois.
6 types d'événements tracés
PURCHASE, RETURN, TIER_UPGRADE, FIRST_VISIT, BIRTHDAY_VISIT, REACTIVATION — chaque événement est horodaté et filtrable.
Export segments
Exportez n'importe quel segment (clients inactifs, clients Gold, nouveaux ce mois) en CSV pour vos campagnes externes.
Top 5 clients — CA cumulé
| # | Client | Niveau | CA Total | Visites | Dernier événement |
|---|---|---|---|---|---|
| 1 | Aminata Diallo | Platinum | 5 150 000 FC | 89 | PURCHASE — aujourd'hui |
| 2 | Kofi Ouédraogo | Gold | 3 420 000 FC | 47 | TIER_UPGRADE — Bronze→Gold |
| 3 | Ibrahim Sawadogo | Gold | 2 890 000 FC | 38 | BIRTHDAY_VISIT — +500 pts |
| 4 | Mariam Keïta | Silver | 1 240 000 FC | 21 | REACTIVATION — après 95j |
| 5 | Seydou Bah | Silver | 980 000 FC | 17 | FIRST_VISIT — il y a 3j |
Campagnes marketing
Créez et envoyez des campagnes Email ou SMS ciblées pour annoncer promotions, nouveautés et offres exclusives.
🔧 Comment l'utiliser
Créer une campagne
Marketing → + Nouvelle campagne. Saisissez le nom, choisissez le canal (Email ou SMS), sélectionnez ou créez un segment cible, rédigez le sujet (email) et le corps du message.
POST /api/store/campaigns { name, channel, segmentId, subject, body }
Définir un segment
Les segments sont des règles JSON : tier minimum, nombre de visites, jours depuis dernière visite, CA minimum. Prévisualisez le nombre de clients ciblés avant envoi.
{ "tier": "GOLD", "lastVisitDays": 90, "minRevenue": 500000 }
Programmer ou envoyer immédiatement
Bouton Envoyer maintenant ou définissez une date/heure de programmation. Le statut passe de DRAFT → SCHEDULED → SENDING → SENT automatiquement.
PATCH /api/store/campaigns/:id/schedule { sendAt: "2026-06-10T09:00:00Z" }
Suivre les résultats
Page de détail campagne : total destinataires, messages envoyés, échoués, en attente, et taux de livraison. Pour les emails, taux d'ouverture si le provider le supporte.
GET /api/store/campaigns/:id/stats
Annuler une campagne programmée
Tant que le statut est SCHEDULED, vous pouvez annuler l'envoi. Les CampaignRecipients déjà en statut PENDING sont marqués CANCELLED.
PATCH /api/store/campaigns/:id/cancel
⭐ Fonctionnalités clés
Canal Email & SMS
Email pour les messages riches avec mise en page, SMS pour les notifications rapides — choisissez selon votre audience et votre budget.
Segments dynamiques JSON
Règles combinables : tier, minVisits, lastVisitDays, minRevenue. La liste des destinataires se génère au moment de l'envoi pour inclure les dernières données.
Envoi programmé
Planifiez vos campagnes à l'avance : annonce de ramadan, promotion de fin de mois, newsletter mensuelle — sans être présent au moment de l'envoi.
Envoi asynchrone
Les messages sont mis en file d'attente et envoyés en arrière-plan. Aucun ralentissement de l'interface même pour des campagnes de 1 000 destinataires.
Statistiques temps réel
Livraisons réussies, échouées et en attente mises à jour en direct pendant l'envoi via polling ou WebSocket.
Exemples de segments prêts
Clients Gold inactifs 90j, nouveaux clients 30j, clients anniversaire ce mois, clients ayant acheté du bissap — templates copiables.
| Campagne | Canal | Segment | Destinataires | Envoyés | Échecs | Statut |
|---|---|---|---|---|---|---|
| Promo Ramadan 2026 | Clients Gold+ | 87 | 87 | 0 | SENT | |
| Relance inactifs 90j | SMS | Inactifs >90j | 40 | 38 | 2 | SENT |
| Soldes huile palme | SMS | Tous clients | 342 | — | — | SCHEDULED |
| Newsletter juin | Tous clients | — | — | — | DRAFT |
Prospects
Pipeline commercial pour gérer les magasins candidats à rejoindre AllyStore — de la prise de contact à la signature.
🔧 Comment l'utiliser
Ajouter un prospect
Pipeline → + Nouveau prospect. Renseignez l'entreprise, le contact, email, téléphone, pays, ville, CA mensuel estimé, plan visé (Starter/Pro/Enterprise) et la source d'acquisition.
POST /api/store/prospects { company, contactName, email, phone, country, city, estimatedRevenue, targetPlan, source }
Faire progresser dans le pipeline
Glissez la carte Kanban vers la colonne suivante ou utilisez le menu déroulant dans la fiche : LEAD → QUALIFIED → PROPOSAL_SENT → NEGOTIATION → WON / LOST.
PATCH /api/store/prospects/:id { status: "PROPOSAL_SENT" }
Enregistrer une activité
Dans la fiche → Timeline → + Activité : type (appel, email, réunion, note), description, date et optionnellement une prochaine relance.
POST /api/store/prospects/:id/activities { type, notes, nextFollowUpAt }
Traiter les alertes de relance
Le tableau de bord SuperAdmin affiche les prospects dont la date de relance est dépassée en rouge. Cliquez pour accéder directement à la fiche et enregistrer l'action.
GET /api/store/prospects?overdueFollowUp=true
Convertir en client
Statut WON → bouton Créer le tenant : AllyStore crée automatiquement l'organisation, l'administrateur et envoie l'email d'invitation au gérant.
POST /api/store/prospects/:id/convert → crée Organization + User admin
⭐ Fonctionnalités clés
Pipeline Kanban visuel
6 colonnes drag-and-drop : LEAD, QUALIFIED, PROPOSAL_SENT, NEGOTIATION, WON, LOST. Chaque carte affiche le CA estimé et la date de dernière activité.
Fiche prospect complète
Coordonnées entreprise, contact principal, localisation (pays + ville), plan visé et CA mensuel estimé pour calculer le potentiel du pipeline.
Timeline d'activités
Historique chronologique de chaque interaction : appel, email, réunion, note — avec l'auteur et la date, pour un suivi d'équipe transparent.
Alertes relance dépassées
Badge rouge sur les prospects dont la prochaine relance est passée. Visible sur le dashboard SuperAdmin pour une action immédiate.
5 sources de prospects
REFERRAL, COLD_OUTREACH, INBOUND, PARTNER, EVENT — mesurez l'efficacité de chaque canal d'acquisition B2B.
Conversion automatique
WON → un clic crée le tenant, l'admin et envoie l'invitation. Zéro saisie manuelle côté technique pour onboarder un nouveau magasin.
| Entreprise | Ville | Plan visé | CA estimé | Statut | Relance |
|---|---|---|---|---|---|
| Épicerie Ndiaye & Fils | Dakar | Pro | 850 000 FC | NEGOTIATION | ⚠️ Hier |
| Supermarché Tanoh | Abidjan | Enterprise | 2 400 000 FC | PROPOSAL_SENT | Dans 3j |
| Boutique Diallo | Conakry | Starter | 320 000 FC | WON | — |
| Marché Bio Bamako | Bamako | Pro | 680 000 FC | QUALIFIED | Dans 7j |
Anti-gaspillage
Réduisez les pertes sur les produits périssables en pilotant les remises et dons avant expiration.
🔧 Comment l'utiliser
Consulter les lots à risque
Menu → Anti-gaspillage → onglet DLC. La liste affiche tous les lots avec leur date d'expiration, quantité restante et badge d'urgence coloré calculé automatiquement.
GET /api/store/antiwaste/batches?status=AT_RISK
Appliquer une remise sur un lot
Cliquez Appliquer remise sur un lot → modal avec slider de % ou boutons présélection 20 / 30 / 50 %. La remise est enregistrée et s'applique immédiatement en caisse sur ce lot.
PATCH /api/store/antiwaste/batches/:id/discount { discountPercent: 30 }
Donner à une association
Bouton Donner → sélectionnez l'association partenaire dans la liste → confirmez. Le lot est vidé (quantité → 0) et un mouvement ADJUSTMENT_OUT est enregistré dans le stock.
POST /api/store/antiwaste/batches/:id/donate { partnerId }
Configurer les règles automatiques
Onglet Règles auto → + Nouvelle règle : définissez "X jours avant expiration → appliquer Y % de remise". Activez/désactivez chaque règle avec le toggle.
POST /api/store/antiwaste/rules { daysBeforeExpiry: 5, discountPercent: 20 }
Laisser le cron travailler
Chaque jour à 7h UTC, AllyStore scanne automatiquement tous les lots et applique les règles actives. Un badge rouge sur la sidebar indique le nombre de lots nécessitant une action manuelle.
Cron 0 7 * * * → scanBatchExpiry() → applique règles → notifie
⭐ Fonctionnalités clés
Badges d'urgence DLC
Rouge (Expiré), Orange (Critique <3j), Jaune (Bientôt 3-10j) — visibilité immédiate des priorités sans avoir à lire les dates.
Remise rapide 20/30/50 %
Boutons présélection pour aller vite en situation d'urgence. La remise s'applique en temps réel sur le prix affiché en caisse.
Don aux associations
Liste des associations partenaires configurables. Le don génère un bon de sortie comptable automatique pour la déduction fiscale.
Règles automatiques
Créez des règles "si J-5 → -20 %, si J-2 → -50 %" activées ou désactivées à la volée. Le cron les applique chaque matin.
Badge sidebar temps réel
Le nombre de lots nécessitant une action est visible en permanence dans le menu — impossible de les oublier même en pleine journée chargée.
Dashboard valeur en jeu
Valeur totale FCFA des lots à risque : visualisez l'enjeu financier d'une action rapide vs d'un jet.
| Produit | Qté restante | Expiration | Remise | Urgence | Action |
|---|---|---|---|---|---|
| Manioc tranché 500g | 23 sachets | 2026-06-04 | — | Expiré | Donner → |
| Lait frais Saloum | 18 bouteilles | 2026-06-06 | — | Critique J-2 | Remise 50 % |
| Bissap séché 250g | 54 sachets | 2026-06-09 | 20 % appliqué | Bientôt J-5 | — |
| Huile palme artisanale | 12 bidons | 2026-06-12 | — | Bientôt J-8 | Remise 20 % |
HACCP
Enregistrez et tracez les contrôles sanitaires obligatoires pour répondre aux exigences réglementaires alimentaires.
🔧 Comment l'utiliser
Créer les points de contrôle
HACCP → Paramétrage → + Point de contrôle. Choisissez le type (TEMPERATURE, CLEANING, RECEPTION, EXPIRY_CHECK, OTHER), définissez la fréquence en heures et les seuils min/max si applicable.
POST /api/store/haccp/checkpoints { name, type, frequencyHours, minValue, maxValue, unit }
Saisir un relevé
HACCP → Registre → + Nouveau relevé. Sélectionnez le point de contrôle, saisissez la valeur mesurée, le résultat (OK / NON_COMPLIANT) et le signataire. Le résultat peut être calculé automatiquement si les seuils sont définis.
POST /api/store/haccp/records { checkpointId, value, result, signedBy, notes }
Documenter une action corrective
Si le résultat est NON_COMPLIANT, le champ Action corrective devient obligatoire avant de pouvoir valider le relevé. Décrivez l'action prise (ex : "Compresseur relancé, température rétablie à 4°C à 10h30").
POST /api/store/haccp/records { ..., correctiveAction: "Compresseur relancé..." }
Activer le relevé IoT automatique
Si vous disposez d'un capteur connecté (sonde de température WiFi), liez-le au point de contrôle via l'API. Les relevés s'enregistrent automatiquement selon la fréquence définie.
PATCH /api/store/haccp/checkpoints/:id { iotSensorId: "SENSOR_001" }
Exporter le registre
Bouton Exporter PDF ou Exporter CSV sur n'importe quelle plage de dates. Le registre horodaté et signé est prêt pour une inspection ou un audit interne.
GET /api/store/haccp/records/export?from=2026-06-01&to=2026-06-30&format=pdf
Surveiller les KPI de conformité
Dashboard HACCP : nombre de points de contrôle actifs, relevés effectués aujourd'hui vs attendus, et non-conformités des 7 derniers jours avec statut d'action corrective.
GET /api/store/haccp/dashboard
⭐ Fonctionnalités clés
5 types de contrôle
TEMPERATURE (réfrigérateurs, congélateurs), CLEANING (surfaces, équipements), RECEPTION (produits reçus), EXPIRY_CHECK (vérification DLC), OTHER (procédures personnalisées).
Calcul automatique OK/NON_COMPLIANT
Si les seuils min/max sont définis (ex : 0°C–4°C), le résultat est calculé automatiquement à la saisie de la valeur. Zéro erreur humaine possible.
Action corrective obligatoire
Impossible de valider un relevé NON_COMPLIANT sans décrire l'action prise. Garantit un registre complet et auditable en toutes circonstances.
Lien capteur IoT
Connexion optionnelle à des sondes de température WiFi/Bluetooth pour des relevés automatiques sans saisie humaine.
Registre horodaté et signé
Chaque relevé conserve l'identité du signataire, l'heure exacte et la valeur brute mesurée — conforme aux exigences réglementaires.
Export PDF / CSV
Générez un registre officiel sur n'importe quelle période, prêt à présenter lors d'un contrôle sanitaire ou d'un audit de certification.
| Point de contrôle | Type | Valeur | Seuils | Résultat | Signataire | Heure |
|---|---|---|---|---|---|---|
| Réfrigérateur viande | TEMP | 3,2 °C | 0 – 4 °C | OK | Kofi O. | 07:12 |
| Congélateur poisson | TEMP | -17,8 °C | -25 – -15 °C | OK | Aminata D. | 07:15 |
| Nettoyage plan de coupe | CLEANING | — | — | OK | Moussa C. | 09:00 |
| Réception riz Basmati | RECEPTION | 24 °C ambiant | < 30 °C | OK | Fatou T. | 11:30 |
| Réfrigérateur laitier | TEMP | 7,1 °C | 0 – 4 °C | NON-CONFORME | Kofi O. | 13:00 |
Comptabilité
Vue financière centralisée — dépenses, budgets et trésorerie en un coup d'œil
🔧 Comment l'utiliser
Accéder au tableau de bord comptable
Depuis le menu latéral, cliquez sur Comptabilité. Le dashboard s'affiche avec les indicateurs du mois en cours : total dépenses, factures en attente et en retard, taux de consommation budgétaire.
Menu → Comptabilité → Dashboard
Surveiller les factures en attente
Le widget "Factures en attente" liste les fournisseurs non encore réglés. Cliquez sur une ligne pour accéder directement au détail de la facture.
Comptabilité → Factures fournisseurs (sous-module)
Contrôler les retards de paiement
Les factures dont la date d'échéance est dépassée apparaissent en rouge avec le badge OVERDUE. Une alerte email est envoyée si la configuration le prévoit.
Badge OVERDUE → Enregistrer paiement
Naviguer vers les sous-modules
Deux boutons de navigation rapide mènent vers Factures fournisseurs (gestion des factures d'achat) et Budgets & Prévisions (planification des dépenses).
Dashboard → Sous-modules Factures / Budgets
Analyser la trésorerie mensuelle
Le graphe de trésorerie compare les entrées (ventes caisse) et les sorties (règlements fournisseurs) semaine par semaine pour le mois sélectionné.
Dashboard → Graphe Trésorerie → Sélecteur de mois
⭐ Fonctionnalités clés
KPI temps réel
Dépenses totales du mois, nombre de factures en attente, montant en retard et budget consommé mis à jour à chaque synchronisation.
Navigation rapide
Accès en un clic aux sous-modules Factures fournisseurs et Budgets, sans passer par le menu général.
Alertes retards
Indicateur visuel rouge pour chaque facture OVERDUE, avec montant total des impayés en retard clairement affiché.
Graphe trésorerie
Visualisation semaine par semaine des flux entrants et sortants pour anticiper les tensions de liquidités.
Sélecteur de période
Basculez entre mois, trimestre ou année pour adapter la vue à votre horizon de pilotage.
Factures fournisseurs
Enregistrez, suivez et réglez toutes vos factures d'achat depuis une interface unifiée
🔧 Comment l'utiliser
Saisir une nouvelle facture
Cliquez sur Nouvelle facture. Sélectionnez le fournisseur, renseignez le numéro de facture, la date d'émission et la date d'échéance. Ajoutez ensuite les lignes (description, quantité, prix unitaire HT, taux TVA).
POST /api/store/supplier-invoices — { supplierId, invoiceNumber, lines[], dueDate }
Vérifier les montants calculés
Le système calcule automatiquement le montant HT total, la TVA et le montant TTC. Vérifiez la cohérence avec la facture papier avant de valider.
totalTTC = totalHT × (1 + tauxTVA / 100)
Enregistrer un paiement
Sur une facture PENDING ou PARTIAL, cliquez sur Enregistrer paiement. Saisissez le montant versé, la méthode (virement, espèces, chèque), la référence et la date. Le statut passe à PARTIAL si le règlement est partiel, PAID si complet.
POST /api/store/supplier-invoices/:id/payments — { amount, method, reference, paidAt }
Surveiller les factures en retard
Un job automatique vérifie chaque nuit les dates d'échéance. Les factures dépassées passent en statut OVERDUE. Filtrez sur ce statut pour prioriser vos règlements.
Filtre → Statut : OVERDUE → Trier par date échéance croissante
Annuler une facture
En cas d'erreur de saisie ou d'avoir reçu, passez la facture en statut CANCELLED. Les paiements déjà enregistrés restent en historique pour traçabilité comptable.
PATCH /api/store/supplier-invoices/:id — { status: "CANCELLED" }
⭐ Fonctionnalités clés
Saisie multi-lignes
Ajoutez autant de lignes que nécessaire par facture, avec description libre, quantité, prix unitaire HT et taux de TVA (0 %, 5 %, 10 %, 18 %).
Paiements partiels
Un fournisseur accepte un acompte ? Enregistrez-le. Le solde restant est recalculé automatiquement à chaque versement. Passage PAID dès que le solde atteint zéro.
Alertes OVERDUE
Détection automatique des retards de paiement à minuit. Badge rouge visible dans la liste, et remontée dans le dashboard Comptabilité.
Filtres puissants
Filtrez par fournisseur, statut, période, montant min/max. Exportez la liste filtrée en CSV pour votre comptable externe.
Historique des paiements
Chaque facture conserve l'intégralité des versements : montant, date, méthode, référence. Traçabilité complète pour les audits.
Lien avec les achats
Une facture peut être liée à un bon de commande fournisseur existant pour rapprochement automatique des quantités reçues.
| N° Facture | Fournisseur | HT | TVA | TTC | Payé | Statut | Échéance |
|---|---|---|---|---|---|---|---|
| FAC-2026-0089 | SOCOPRO Dakar | 1 200 000 FC | 216 000 FC | 1 416 000 FC | 1 416 000 FC | PAID | 28/05/2026 |
| FAC-2026-0093 | Moussa Diallo & Fils | 850 000 FC | 85 000 FC | 935 000 FC | 500 000 FC | PARTIAL | 10/06/2026 |
| FAC-2026-0094 | Aminata Trading Co. | 620 000 FC | 111 600 FC | 731 600 FC | 0 FC | OVERDUE | 01/06/2026 |
| FAC-2026-0097 | Fatou Agri-Prod | 430 000 FC | 43 000 FC | 473 000 FC | 0 FC | PENDING | 15/06/2026 |
| FAC-2026-0098 | Kofi Imports | 310 000 FC | 55 800 FC | 365 800 FC | 365 800 FC | PAID | 20/06/2026 |
Budgets & Prévisions
Planifiez vos dépenses par catégorie et mesurez l'écart réel vs prévu en temps réel
🔧 Comment l'utiliser
Créer un budget
Cliquez sur Nouveau budget. Donnez-lui un nom (ex. "Achats Juin 2026"), choisissez la période (MONTHLY, QUARTERLY, ANNUAL) et le montant total planifié.
POST /api/store/budgets — { name, period, plannedTotal, startDate }
Ajouter des lignes budgétaires
Décomposez le budget en catégories : Achats alimentaires, Frais de transport, Électricité, Salaires temporaires… Chaque ligne a un libellé et un montant planifié.
POST /api/store/budgets/:id/lines — { category, label, plannedAmount }
Suivre la consommation
À chaque facture fournisseur réglée, le montant est imputé automatiquement à la ligne budgétaire correspondante. Le taux de consommation (réel / planifié × 100) se met à jour en direct.
actualAmount / plannedAmount × 100 → barre de progression
Interpréter les couleurs
Barre verte : consommation < 70 %. Orange : entre 70 % et 90 %. Rouge : dépassement imminent ou dépassé. Agissez avant d'atteindre 100 %.
0-69 % → vert | 70-89 % → orange | 90+ % → rouge
Verrouiller un budget finalisé
Une fois le budget approuvé par le gérant, activez Verrouiller. Plus aucune modification des montants planifiés n'est possible, garantissant l'intégrité de la comparaison réel/prévu.
PATCH /api/store/budgets/:id — { isLocked: true }
⭐ Fonctionnalités clés
Multi-périodes
Créez des budgets mensuels pour le quotidien, trimestriels pour les investissements, annuels pour la stratégie globale.
Écart réel vs prévu
Chaque ligne affiche l'écart en montant et en pourcentage. Un écart positif (dépassement) est signalé en rouge, un écart négatif (économie) en vert.
Verrouillage budget
Fige les montants planifiés pour empêcher toute modification a posteriori. Indispensable pour les audits ou la validation par un tiers.
Imputation automatique
Les paiements fournisseurs sont rattachés aux lignes budgétaires sans ressaisie manuelle, réduisant les erreurs de catégorisation.
Vue synthétique
Un tableau récapitulatif par budget montre le total planifié, le total réel, le solde disponible et le taux global de consommation.
| Catégorie | Libellé | Planifié | Réel | Consommation | Écart |
|---|---|---|---|---|---|
| Achats alimentaires | Céréales & farines | 1 500 000 FC | 1 320 000 FC | ■■■■■■■■░░ 88 % | +180 000 |
| Achats alimentaires | Huiles & graisses | 800 000 FC | 850 000 FC | ■■■■■■■■■■ 106 % | -50 000 |
| Transport | Livraisons fournisseurs | 300 000 FC | 195 000 FC | ■■■■■░░░░░ 65 % | +105 000 |
| Énergie | Électricité & groupe | 450 000 FC | 398 000 FC | ■■■■■■■░░░ 88 % | +52 000 |
| Frais généraux | Emballages & sachets | 150 000 FC | 57 000 FC | ■■■░░░░░░░ 38 % | +93 000 |
Tarification
Gérez les prix de vente et les marges de tous vos produits depuis une interface inline-edit centralisée
🔧 Comment l'utiliser
Ouvrir le tableau de tarification
Accédez via Catalogue → Tarification. Tous les produits actifs s'affichent avec leurs prix d'achat, de vente, TVA et marge calculée.
Menu → Catalogue → Tarification
Modifier un prix en inline
Cliquez sur la cellule "Prix vente HT" d'un produit. Le champ devient éditable directement dans la table. Saisissez le nouveau prix et appuyez sur Entrée ou cliquez ailleurs pour sauvegarder.
PATCH /api/store/products/:id — { sellingPriceHT: 1200 }
Lire la marge calculée
La marge est recalculée à chaque modification : (vente HT − achat HT) / vente HT × 100. Elle s'affiche colorée : rouge si négative, orange si < 10 %, vert si ≥ 30 %.
marge % = (prixVenteHT - prixAchatHT) / prixVenteHT × 100
Filtrer et rechercher
Utilisez la barre de recherche (nom produit ou SKU), le filtre par catégorie, ou le filtre "Marge basse" pour isoler les produits nécessitant un ajustement de prix.
?search=riz&category=cereales&marginFilter=low
Vérifier les KPI globaux
Les 4 KPI en haut de page donnent une vision globale : total produits, marge moyenne, nombre de produits à marge basse et nombre de produits en perte.
Dashboard KPI → actions correctives si margeNégative > 0
⭐ Fonctionnalités clés
Édition inline
Modifiez prix d'achat, prix de vente et taux TVA directement dans la cellule du tableau. Aucun formulaire séparé, aucun chargement de page.
Code couleur marge
Rouge (< 0 %), orange (< 10 %), vert (≥ 30 %) — identification visuelle immédiate des produits à risque sans avoir à lire chaque chiffre.
TTC auto-calculé
Le prix TTC est recalculé en temps réel dès que vous changez le prix HT ou le taux TVA. Idéal pour vérifier le prix affiché en rayon.
Filtres intelligents
Filtrez sur la marge (basse, négative, normale), la catégorie, ou recherchez par nom/SKU. Le compteur de résultats s'actualise en temps réel.
Export CSV
Exportez la grille tarifaire complète ou filtrée en CSV pour partager avec un responsable achats ou intégrer dans un outil externe.
Historique des prix
Chaque modification de prix est horodatée et attribuée à l'utilisateur auteur. Naviguez dans l'historique pour comprendre l'évolution d'un tarif.
| Produit | Catégorie | Achat HT | Vente HT | TTC | TVA | Marge % |
|---|---|---|---|---|---|---|
| Riz parfumé 25 kg | Céréales | 18 500 FC | 22 000 FC | 23 760 FC | 8 % | 15,9 % |
| Huile palme 5 L | Huiles | 4 800 FC | 5 200 FC | 5 616 FC | 8 % | 7,7 % |
| Lait en poudre 2 kg | Produits laitiers | 6 200 FC | 8 500 FC | 9 180 FC | 8 % | 27,1 % |
| Savon de Marseille | Hygiène | 1 100 FC | 980 FC | 1 058 FC | 8 % | -12,2 % |
| Tomate concentrée 850g | Conserves | 1 900 FC | 2 800 FC | 3 024 FC | 8 % | 32,1 % |
Promotions
Créez des offres spéciales, codes promo et remises automatiques pour stimuler vos ventes
🔧 Comment l'utiliser
Créer une promotion
Cliquez sur Nouvelle promotion. Choisissez le type (PERCENT, AMOUNT, BOGO), la cible (produit, catégorie, panier), la valeur et les dates de validité.
POST /api/store/promotions — { type, target, value, startDate, endDate }
Configurer le ciblage
PRODUCT cible un produit précis, CATEGORY s'applique à toute une gamme, CART nécessite un montant de panier minimum. Combinez avec un code promo optionnel pour les offres exclusives.
target: "CATEGORY", targetId: "cat_cereales", minCartAmount: 10000
Activer et publier
La promo est créée en statut DRAFT. Passez-la en ACTIVE pour qu'elle entre en vigueur. Elle s'appliquera automatiquement en caisse entre startDate et endDate.
PATCH /api/store/promotions/:id — { status: "ACTIVE" }
Suivre les utilisations
Chaque application en caisse crée une entrée PromotionRedemption. Consultez le compteur d'utilisations et définissez une limite maximale pour les offres à quantité limitée.
GET /api/store/promotions/:id/redemptions — maxRedemptions: 200
Mettre en pause ou clôturer
Passez une promo en PAUSED pour la suspendre temporairement sans la supprimer. Elle expire automatiquement à la date de fin ou quand le quota d'utilisations est atteint (statut EXPIRED).
status: ACTIVE → PAUSED → ACTIVE | EXPIRED (auto)
⭐ Fonctionnalités clés
3 types de remise
PERCENT (ex. −15 %), AMOUNT (ex. −500 FC sur le panier), BOGO (achetez 2 packs de lait → 1 offert). Chaque type a sa logique de calcul distincte.
Ciblage précis
Ciblez un produit exact, toute une catégorie de produits, ou déclenchez la remise au-delà d'un seuil de panier minimum. Flexibilité maximale.
Code promo optionnel
Créez des codes promotionnels (ex. FETE2026) à saisir en caisse ou à partager avec des clients VIP. La remise ne s'applique qu'en cas de saisie correcte du code.
Compteur d'utilisations
Limitez le nombre total d'utilisations pour créer des offres exclusives. Le compteur est décrémenté en temps réel ; la promo expire automatiquement à épuisement.
Empilement configurable
Définissez si une promo peut se cumuler avec d'autres offres actives. Par défaut, seule la promo la plus avantageuse est appliquée.
Application automatique en caisse
Le moteur de promotions évalue toutes les promos ACTIVE à chaque ajout de ligne en caisse. Aucune action supplémentaire pour le caissier.
| Nom | Type | Cible | Valeur | Code | Utilisations | Validité | Statut |
|---|---|---|---|---|---|---|---|
| Fête des mères | PERCENT | Cosmétiques | −20 % | MAMA2026 | 47 / 100 | 01−30/06/2026 | ACTIVE |
| Promo Riz géant | BOGO | Riz parfumé 25 kg | 2 → 1 offert | — | 23 / illimité | 01−15/06/2026 | ACTIVE |
| Panier weekend | AMOUNT | Panier ≥ 25 000 FC | −2 000 FC | — | 89 / 200 | 06−08/06/2026 | PAUSED |
| Soldes céréales | PERCENT | Céréales | −10 % | CEREAL10 | 200 / 200 | 15−31/05/2026 | EXPIRED |
Drive / Click & Collect
Permettez à vos clients de commander en ligne et de venir retirer leurs courses en magasin
🔧 Comment l'utiliser
Configurer les créneaux Drive
Dans Drive → Créneaux, créez des plages horaires (ex. "08h00–10h00") avec une capacité maximale (nombre de commandes acceptées simultanément). Activez ou désactivez chaque créneau selon vos disponibilités.
POST /api/store/drive/slots — { startTime, endTime, maxCapacity, date }
Recevoir et affecter les commandes
Les commandes passées en ligne apparaissent automatiquement dans la file d'attente. Affectez un préparateur (picker) à chaque commande. Le statut passe à PREPARING.
PATCH /api/store/drive/orders/:id — { status: "PREPARING", pickerId }
Préparer la commande article par article
Le picker scanne ou coche chaque article : PICKED (trouvé), MISSING (rupture de stock), SUBSTITUTED (remplacé par un produit alternatif). Le client est notifié en temps réel des substitutions.
PATCH /api/store/drive/orders/:id/items/:itemId — { status: "SUBSTITUTED", substituteProductId }
Marquer READY et notifier le client
Quand tous les articles sont traités, passez la commande en READY. Une notification est envoyée au client (SMS ou email) : "Votre commande est prête, venez la récupérer !"
PATCH /api/store/drive/orders/:id — { status: "READY" }
Finaliser à la remise
Lorsque le client retire sa commande, passez en DELIVERED. Si la commande est liée à une livraison à domicile, elle est transmise automatiquement au module Livraisons.
PATCH /api/store/drive/orders/:id — { status: "DELIVERED" }
⭐ Fonctionnalités clés
Créneaux avec capacité
Définissez combien de commandes vous pouvez préparer par créneau. Le créneau se ferme automatiquement quand la capacité maximale est atteinte.
Préparation guidée
Le picker suit une checklist article par article, réduit les oublis et les erreurs. Statut PICKED / MISSING / SUBSTITUTED par ligne.
Gestion des substitutions
Si un article est en rupture, proposez un produit de remplacement. Le client est notifié et peut accepter ou refuser la substitution.
Lien avec Livraisons
Une commande Drive peut générer automatiquement un arrêt dans une tournée de livraison pour les clients qui ne peuvent pas se déplacer.
Notifications client
SMS ou email automatiques aux étapes clés : confirmation commande, commande en préparation, commande prête à retirer.
Tableau de bord Drive
Vue en temps réel du nombre de commandes par statut, taux de substitution, et commandes en retard de préparation.
| Commande | Client | Créneau | Articles | Montant | Statut |
|---|---|---|---|---|---|
| DRV-0241 | Aminata Kouyaté | 08h00–10h00 | 12 articles | 47 800 FC | READY |
| DRV-0242 | Seun Adeyemi | 10h00–12h00 | 7 articles | 28 500 FC | PREPARING |
| DRV-0243 | Moussa Traoré | 10h00–12h00 | 18 articles | 82 000 FC | TO_PREPARE |
| DRV-0240 | Fatou Diallo | 08h00–10h00 | 9 articles | 31 200 FC | DELIVERED |
Livraisons & Tournées
Planifiez, organisez et suivez vos tournées de livraison jusqu'au dernier kilomètre
🔧 Comment l'utiliser
Créer une tournée
Cliquez sur Nouvelle tournée. Assignez un chauffeur (employé), un véhicule, la date planifiée et une note interne. La tournée est créée en statut PLANNED.
POST /api/store/deliveries — { driverId, vehicleId, plannedDate, notes }
Ajouter des arrêts
Pour chaque client à livrer, ajoutez un arrêt : nom du client, adresse, téléphone, numéro d'ordre de passage et commande Drive liée (optionnel). Réordonnez les arrêts par glisser-déposer.
POST /api/store/deliveries/:id/stops — { clientName, address, phone, orderIndex, driveOrderId }
Démarrer la tournée
Quand le chauffeur part, cliquez sur Démarrer. L'horodatage de départ est enregistré automatiquement. Le statut passe à IN_PROGRESS.
PATCH /api/store/deliveries/:id — { status: "IN_PROGRESS", startedAt: now() }
Mettre à jour les arrêts
Le chauffeur (ou le dispatcher) marque chaque arrêt DELIVERED au moment de la remise, ou FAILED avec un motif (absent, adresse incorrecte, refus…).
PATCH /api/store/deliveries/:id/stops/:stopId — { status: "FAILED", failureReason: "Client absent" }
Clôturer la tournée
À son retour, cliquez sur Terminer la tournée. L'horodatage de fin est enregistré. Un récapitulatif (arrêts livrés, échoués) est disponible pour le rapport journalier.
PATCH /api/store/deliveries/:id — { status: "COMPLETED", completedAt: now() }
⭐ Fonctionnalités clés
Arrêts ordonnés
Définissez l'ordre de passage optimal pour minimiser le trajet. Réordonnez par glisser-déposer avant le départ de la tournée.
Horodatage automatique
Heure de départ et heure de fin enregistrées automatiquement. Durée de tournée calculée pour le reporting RH et logistique.
Gestion des échecs
Un arrêt FAILED conserve le motif (absent, refus, mauvaise adresse). Ces cas peuvent générer un rappel client ou un second passage programmé.
Lien commande Drive
Chaque arrêt peut être lié à une commande Drive. Le statut de la commande Drive est mis à jour automatiquement quand l'arrêt passe à DELIVERED.
Gestion des véhicules
Créez une flotte de véhicules (moto, voiture, tricycle) avec immatriculation et capacité de charge. Assignez le bon véhicule à chaque tournée.
Récapitulatif tournée
Après clôture, un rapport synthétise le nombre d'arrêts livrés / échoués, la durée, le chauffeur et les notes. Exportable en PDF.
| # | Client | Adresse | Téléphone | Commande | Statut arrêt |
|---|---|---|---|---|---|
| 1 | Fatou Sarr | Quartier Médina, Rue 12 | +221 77 234 56 78 | DRV-0238 | DELIVERED |
| 2 | Moussa Camara | Plateau, Av. Indépendance | +221 70 456 78 90 | DRV-0239 | DELIVERED |
| 3 | Aminata Bah | Grand Yoff, Impasse 5 | +221 76 111 22 33 | — | PENDING |
| 4 | Ibou Diop | Parcelles Assainies, B17 | +221 77 987 65 43 | DRV-0243 | FAILED — absent |
| 5 | Seun Okonkwo | HLM, Villa 23 | +221 76 555 44 33 | — | PENDING |
Énergie & IoT
Surveillance temps réel des températures, consommations énergétiques et alertes équipements
🔧 Comment l'utiliser
Déclarer un appareil IoT
Dans Énergie → Appareils, créez chaque équipement : type (FRIDGE, FREEZER, SENSOR, METER), nom, code unique, emplacement dans le magasin et seuils min/max.
POST /api/store/energy/devices — { type: "FRIDGE", name: "Frigo Boissons", minThreshold: 2, maxThreshold: 8 }
Recevoir les relevés automatiques
Les capteurs envoient leurs mesures toutes les 5 à 15 minutes via l'API. Chaque relevé est enregistré avec la valeur, l'unité (°C, kWh) et l'horodatage.
POST /api/store/energy/readings — { deviceId, value: 6.4, unit: "°C", recordedAt }
Consulter le tableau de bord
La vue principale affiche la température actuelle de chaque frigo/congélateur avec une pastille colorée (vert = normal, orange = attention, rouge = critique), et le graphe historique des 24 dernières heures.
GET /api/store/energy/dashboard — températures + alertes actives
Gérer les alertes
Une alerte est créée automatiquement quand une mesure sort des seuils. Niveaux : INFO (hors cible), WARNING (seuil approché), CRITICAL (seuil dépassé). Accusez réception (ACKNOWLEDGED) ou résolvez (RESOLVED).
PATCH /api/store/energy/alerts/:id — { status: "ACKNOWLEDGED" }
Planifier la maintenance préventive
Créez des interventions planifiées sur chaque appareil : nettoyage du condenseur, contrôle du joint, remplacement filtre. La maintenance est horodatée et liée à l'appareil pour traçabilité.
POST /api/store/energy/maintenance — { deviceId, type, scheduledDate, technicianId }
⭐ Fonctionnalités clés
4 types d'appareils
FRIDGE (frigo positif), FREEZER (congélateur), SENSOR (capteur générique température/humidité), METER (compteur électrique kWh).
Alertes 3 niveaux
INFO pour les déviations légères, WARNING pour les approches de seuil, CRITICAL pour les dépassements avérés nécessitant une action immédiate.
Graphe historique
Visualisez l'évolution de la température sur les dernières 24h, 7 jours ou 30 jours. Identifiez les dérives nocturnes ou les pics liés aux ouvertures de portes.
Maintenance préventive
Planifiez des entretiens récurrents sur chaque équipement. Un calendrier de maintenance évite les pannes en haute saison et prolonge la durée de vie des appareils.
Compteur électrique
Connectez votre compteur principal pour suivre la consommation en kWh par jour/mois et détecter les surconsommations anormales (appareil défaillant, fuite thermique).
Localisation des appareils
Chaque appareil est localisé par emplacement textuel (ex. "Rayon frais", "Réserve B"). Idéal pour guider le technicien lors d'une intervention.
| Appareil | Type | Emplacement | Valeur actuelle | Seuils | Statut |
|---|---|---|---|---|---|
| Frigo Boissons | FRIDGE | Rayon frais | 6,2 °C | 2 °C – 8 °C | ● Normal |
| Congel. Poissons | FREEZER | Réserve A | −16,8 °C | −20 °C – −15 °C | ● Attention |
| Vitrine Charcuterie | FRIDGE | Rayon traiteur | 10,4 °C | 2 °C – 8 °C | ● CRITIQUE |
| Compteur principal | METER | Tableau élect. | 87 kWh / jour | — / 120 kWh | ● Normal |
Rayons & Planogrammes
Organisez visuellement vos rayons, positionnez vos produits et pilotez les tâches des employés
🔧 Comment l'utiliser
Créer les allées du magasin
Dans Rayons → Allées, créez chaque allée avec un nom et une description (ex. "Allée A — Céréales", "Allée B — Boissons & Eaux"). Chaque allée représente une zone physique du magasin.
POST /api/store/shelves/aisles — { name: "Allée A", description: "Céréales, Farines, Légumineuses" }
Définir le planogramme
Pour chaque allée, uploadez ou éditez le planogramme : un JSON structuré décrivant les étagères, le nombre de positions par étagère et le produit affecté à chaque position.
PUT /api/store/shelves/aisles/:id/planogram — { shelves: [{ level: 1, slots: [{ position: 1, productId, facings: 3 }] }] }
Créer des tâches rayon
Assignez des tâches aux employés : réapprovisionnement, facing, nettoyage, pose de signalétique. Définissez la priorité (LOW / MEDIUM / HIGH) et la date d'échéance.
POST /api/store/shelves/tasks — { aisleId, type: "RESTOCK", assignedTo, priority: "HIGH", dueDate }
Suivre l'avancement des tâches
L'employé passe la tâche en IN_PROGRESS quand il commence, puis en DONE à la fin. Il peut joindre une photo de réalisation (facing bien fait, rayon réapprovisionné) pour valider la tâche.
PATCH /api/store/shelves/tasks/:id — { status: "DONE", completionPhotoUrl: "..." }
Analyser l'organisation du magasin
Le tableau de bord Rayons donne une vue synthétique : tâches en attente par allée, tâches en retard, taux de complétion de la semaine. Identifiez les zones négligées.
GET /api/store/shelves/dashboard — tâches par statut + allées + employés
⭐ Fonctionnalités clés
Organisation par allées
Créez autant d'allées que votre magasin en compte. Chaque allée a son propre planogramme et sa propre liste de tâches.
Planogramme JSON
Le planogramme décrit précisément étagères, positions et facings (nombre de produits côte à côte). Exportez-le pour votre chef de rayon ou votre merchandiser.
Tâches avec priorité
LOW, MEDIUM, HIGH — les tâches urgentes (rupture imminente, hygiène) remontent en haut de la liste. Code couleur visuel pour la prioritisation immédiate.
Assignation employés
Chaque tâche est assignée à un employé précis. Il la retrouve dans son tableau de bord personnel et reçoit une notification si elle devient urgente.
Validation par photo
L'employé prend une photo du rayon une fois la tâche accomplie. Le manager valide visuellement la conformité depuis son interface. Fin des allers-retours.
Tableau de bord rayons
Vue globale des tâches par statut (TODO / IN_PROGRESS / DONE), par allée et par employé. Identifiez en un coup d'œil les zones à problème.
| Allée | Type de tâche | Assigné à | Priorité | Échéance | Statut |
|---|---|---|---|---|---|
| Allée A — Céréales | Réapprovisionnement Riz | Kofi Atta | HIGH | Aujourd'hui 10h | IN_PROGRESS |
| Allée B — Boissons | Facing Jus de goyave | Aminata Sy | MEDIUM | Aujourd'hui 12h | TODO |
| Allée C — Hygiène | Signalétique promo | Moussa Keïta | HIGH | Aujourd'hui 09h | EN RETARD |
| Allée D — Épices | Nettoyage étagères | Fatou Cissé | LOW | Demain 08h | TODO |
| Allée E — Conserves | Réapprovisionnement tomates | Seun Babatunde | MEDIUM | Aujourd'hui 15h | DONE ✓ |
Étagère 2 (hauteur main) — Position 1 : Maïs farine 5 kg (×3) · Position 2 : Semoule fine 2 kg (×4)
Étagère 3 (bas) — Position 1 : Sacs mil 10 kg (×2) · Position 2 : Sorgho 5 kg (×2)
RH & Planning
Gérez les équipes, planifiez les shifts hebdomadaires et suivez les présences en temps réel.
🔧 Comment l'utiliser
Ajouter les employés
Créez une fiche par employé avec nom, poste, email, téléphone et taux horaire. Le statut est ACTIVE par défaut.
POST /api/store/hr/employees
Planifier les shifts
Assignez des créneaux horaires à chaque employé par jour. Statut initial : PLANNED, puis CONFIRMED ou ABSENT.
POST /api/store/hr/shifts
Pointage du jour
À l'arrivée, l'employé ou le manager clique Check-in. Au départ, Check-out. Les heures sont calculées automatiquement.
POST /api/store/hr/attendance/checkin
Consulter les présences
Filtrez par employé ou période. Exportez la synthèse mensuelle pour le calcul de paie.
GET /api/store/hr/attendance?from=2025-06-01&to=2025-06-30
⭐ Fonctionnalités clés
Calendrier hebdomadaire
Vue grille 7 jours × employés avec créneaux colorés selon le statut (vert = confirmé, orange = planifié, rouge = absent).
Pointage en temps réel
Bouton Check-in / Check-out par employé pour aujourd'hui. Heure enregistrée au moment du clic.
Synthèse des heures
Calcul automatique heures travaillées = checkout − checkin, avec total mensuel par employé.
Alertes absences
Notification si un employé avec shift confirmé n'a pas pointé 30 minutes après l'heure de début.
Équipe — Liste employés
| Nom | Poste | Taux horaire | Statut | |
|---|---|---|---|---|
| Kofi Asante | Caissier | kofi@ally.sn | 1 200 FC/h | Actif |
| Aminata Diallo | Responsable stock | aminata@ally.sn | 1 800 FC/h | Actif |
| Moussa Coulibaly | Manager | moussa@ally.sn | 2 500 FC/h | Actif |
| Fatou Ndiaye | Caissière | fatou@ally.sn | 1 200 FC/h | Congé |
Pointage aujourd'hui — 04/06/2026
| Employé | Check-in | Check-out | Heures | Action |
|---|---|---|---|---|
| Kofi Asante | 08:02 | — | — | Check-out |
| Aminata Diallo | 07:55 | 16:05 | 8 h 10 | OK |
| Moussa Coulibaly | — | — | — | Check-in |
Formations
Planifiez et suivez les formations obligatoires et volontaires de votre équipe.
🔧 Comment l'utiliser
Créer le catalogue
Ajoutez chaque formation : titre, catégorie, durée en heures, caractère obligatoire, et fréquence de recyclage en mois.
POST /api/store/hr/trainings
Assigner à un employé
Créez une TrainingCompletion : employé + formation + date planifiée. Statut initial PLANNED.
POST /api/store/hr/training-completions
Suivre la progression
Passez le statut à IN_PROGRESS puis COMPLETED avec la date de réalisation, le score et les notes.
PATCH /api/store/hr/training-completions/[id]
Gérer les alertes d'échéance
AllyStore calcule automatiquement la prochaine date de recyclage et génère une alerte 30 jours avant.
GET /api/store/hr/training-completions?expiring=true
⭐ Fonctionnalités clés
Catalogue centralisé
Bibliothèque de formations réutilisables, obligatoires ou facultatives, avec durée et cycle de recyclage.
Recyclage automatique
Pour les formations récurrentes, la prochaine échéance est calculée dès la complétion de la précédente.
Suivi individuel
Historique complet par employé : toutes les formations passées, scores, notes et statuts.
Alertes proactives
Notifications 30 jours avant échéance des formations obligatoires récurrentes pour anticipation.
Catalogue formations
| Formation | Catégorie | Durée | Obligation | Recyclage |
|---|---|---|---|---|
| HACCP Niveau 1 | Hygiène | 8 h | Obligatoire | 12 mois |
| Sécurité incendie | Sécurité | 4 h | Obligatoire | 24 mois |
| Accueil client | Soft skills | 6 h | Facultatif | — |
| Gestion de caisse | Opérationnel | 3 h | Recommandé | — |
Contrats de travail
Enregistrez, gérez et générez en PDF les contrats de travail de vos employés.
🔧 Comment l'utiliser
Créer un contrat
Sélectionnez l'employé, le type (CDI, CDD, STAGE, INTERIM, FREELANCE), les dates, le salaire brut et le poste.
POST /api/store/hr/contracts
Générer le PDF
Cliquez sur "Générer PDF" pour obtenir un document formaté avec toutes les données du contrat.
GET /api/store/hr/contracts/[id]/pdf
Archiver les anciens contrats
Les contrats expirés ou remplacés passent en statut ARCHIVED et restent consultables dans l'historique.
PATCH /api/store/hr/contracts/[id] { "status": "ARCHIVED" }
⭐ Fonctionnalités clés
5 types de contrats
CDI, CDD, Stage, Intérim et Freelance — chaque type adapte les champs affichés (date de fin optionnelle pour CDI).
Génération PDF
PDF prêt à imprimer avec en-tête magasin, données employé, conditions de travail et signature.
Historique par employé
Consultez tous les contrats passés et actifs d'un employé, triés chronologiquement.
Statut actif / archivé
Les contrats actifs sont mis en évidence. L'archivage conserve la trace sans encombrer la vue principale.
Contrats actifs
| Employé | Type | Début | Fin | Salaire brut | Statut | Action |
|---|---|---|---|---|---|---|
| Kofi Asante | CDI | 01/01/2024 | — | 192 000 FC/mois | Actif | |
| Fatou Ndiaye | CDD | 01/03/2026 | 31/08/2026 | 144 000 FC/mois | Actif | |
| Sidy Konaté | Stage | 01/06/2026 | 31/08/2026 | 60 000 FC/mois | Actif | |
| Binta Traoré | CDI | 15/05/2022 | — | 216 000 FC/mois | Archivé |
Pointage avancé
Suivez les horaires réels avec écarts vs planning pour un calcul de paie précis.
🔧 Comment l'utiliser
Check-in en temps réel
Le manager ou l'employé clique le bouton Check-in. L'heure exacte est enregistrée côté serveur.
POST /api/store/hr/attendance/checkin { "employeeId": "emp_001" }
Check-out en fin de shift
Le checkout clôt la session. Les heures travaillées sont calculées : checkout − checkin.
POST /api/store/hr/attendance/checkout { "employeeId": "emp_001" }
Saisie manuelle
En cas d'oubli, le manager peut saisir manuellement les heures d'arrivée et de départ pour n'importe quelle date passée.
POST /api/store/hr/attendance/manual
Export mensuel
Générez un récapitulatif par employé sur la période choisie pour préparer la paie.
GET /api/store/hr/attendance/export?month=2026-06
⭐ Fonctionnalités clés
Pointage en un clic
Interface simple et rapide pour le check-in / check-out, accessible depuis mobile ou tablette de caisse.
Calcul automatique
Heures travaillées, écarts vs planning et retards calculés sans aucune saisie manuelle.
Détection des retards
Comparaison automatique entre l'heure de shift prévue et l'heure de check-in réelle.
Export paie
Synthèse mensuelle exportable par employé : jours travaillés, heures totales, absences.
Synthèse présences — Juin 2026
| Employé | Jours travaillés | Heures réelles | Heures planifiées | Écart | Retards |
|---|---|---|---|---|---|
| Kofi Asante | 22 | 176 h | 176 h | 0 h | 1 |
| Aminata Diallo | 21 | 168 h | 176 h | -8 h | 0 |
| Moussa Coulibaly | 22 | 184 h | 176 h | +8 h | 0 |
| Fatou Ndiaye | 18 | 144 h | 176 h | -32 h | 3 |
Analytics
Analysez les performances du magasin sur des périodes personnalisées pour prendre de meilleures décisions.
⭐ Fonctionnalités clés
Courbe CA journalière
Sparkline du chiffre d'affaires jour par jour sur la période sélectionnée pour identifier les pics et creux.
Répartition des paiements
Espèces, carte bancaire, Mobile Money (Wave, Orange Money) — barres proportionnelles avec pourcentages.
Top catégories
CA et nombre de ventes par catégorie en barres horizontales triées par performance décroissante.
Alertes stock intégrées
Ruptures et produits en stock bas affichés directement dans le dashboard Analytics pour action immédiate.
Répartition paiements — 30 derniers jours
| Mode | Montant | Transactions | Part |
|---|---|---|---|
| 💵 Espèces | 2 140 000 FC | 524 | 50 % |
| 📱 Mobile Money | 1 498 000 FC | 245 | 35 % |
| 💳 Carte | 642 000 FC | 78 | 15 % |
Top catégories
| Catégorie | CA | Ventes | Évolution |
|---|---|---|---|
| Alimentation sèche | 1 820 000 FC | 312 | ↑ +14 % |
| Boissons | 956 000 FC | 201 | ↑ +9 % |
| Hygiène | 744 000 FC | 188 | → 0 % |
| Produits frais | 560 000 FC | 146 | ↓ -5 % |
Analytics Pricing & Marges
Analysez la rentabilité de votre catalogue et identifiez les produits qui perdent de l'argent.
⭐ Fonctionnalités clés
Vue marges par produit
Tableau complet : prix achat, prix vente, marge absolue (FC), taux de marge (%), classé par rentabilité croissante.
Produits à marge négative
Liste des références vendues à perte (prix vente < prix achat). Action directe : ajuster le prix ou contacter le fournisseur.
Produits sous seuil de risque
Alertes pour les produits dont la marge est inférieure à un seuil paramétrable (ex. : < 10 %).
Suggestions de réévaluation
Pour chaque produit sous seuil, AllyStore suggère un prix de vente minimum ou un prix d'achat cible.
Analyse marges — Catalogue complet
| Produit | Prix achat | Prix vente | Marge FC | Taux | Statut |
|---|---|---|---|---|---|
| Huile Palme 1L | 850 FC | 750 FC | -100 FC | -11.8 % | Perte |
| Lait Gloria 500g | 1 200 FC | 1 250 FC | 50 FC | 4.0 % | Risque |
| Riz Parfumé 5kg | 3 200 FC | 3 800 FC | 600 FC | 15.8 % | OK |
| Savon Kaloum | 200 FC | 350 FC | 150 FC | 42.9 % | Excellent |
Analytics Drive
Mesurez les performances du service Drive : remplissage des créneaux, articles manquants et délais de préparation.
⭐ Fonctionnalités clés
Taux de remplissage
Ratio commandes réelles / capacité par créneau. Identifiez les créneaux sous-utilisés pour les supprimer ou les réaffecter.
Top articles manquants
Classement des produits les plus souvent substitués ou indisponibles — base pour réajuster les réassorts Drive.
Délai de préparation
Temps moyen entre TO_PREPARE et READY par créneau. Détectez les goulots d'étranglement en préparation.
Drive vs POS
Comparaison du volume de commandes Drive vs ventes en caisse pour mesurer la part du canal digital.
Articles les plus manquants — Juin 2026
| Produit | Occurrences | Action |
|---|---|---|
| Eau Cristaline 1.5L (pack 6) | 8 fois | Réassort urgent |
| Tomates concentrées Boni | 6 fois | Réassort urgent |
| Chips Paprika 150g | 4 fois | Vérifier stock |
| Lait Gloria 1L | 3 fois | Vérifier stock |
Financier avancé
LTV, CAC, churn, cohortes et prévisions de revenus — les métriques SaaS appliquées au retail africain.
⭐ Fonctionnalités clés
LTV & CAC
LTV = lifetimeSpent moyen des clients actifs. CAC = proxy acquisition à 15 % du CA / nouveaux clients. Ratio LTV/CAC coloré selon santé.
Churn 30 jours
% de clients actifs sur les 60 derniers jours qui n'ont pas acheté sur les 30 derniers jours.
Tableau cohortes 6 mois
Nouveaux clients, revenus, panier moyen et rétention M+1 sur les 6 derniers mois pour mesurer la fidélisation.
Prévisions de revenus
Régression linéaire sur les 3 derniers mois projetée sur les 3 prochains — hypothèses basse / centrale / haute.
Cohortes — Nouveaux clients par mois
| Mois | Nouveaux clients | Revenus cohorte | Panier moyen | Rétention M+1 |
|---|---|---|---|---|
| Janvier 2026 | 28 | 480 000 FC | 17 143 FC | 68 % |
| Février 2026 | 34 | 612 000 FC | 18 000 FC | 71 % |
| Mars 2026 | 31 | 527 000 FC | 17 000 FC | 59 % |
| Avril 2026 | 42 | 798 000 FC | 19 000 FC | 74 % |
| Mai 2026 | 38 | 722 000 FC | 19 000 FC | 72 % |
| Juin 2026 | 22 | 418 000 FC | 19 000 FC | — |
Changelog
Communiquez les évolutions d'AllyStore aux utilisateurs avec une timeline versionnée.
🔧 Comment l'utiliser
Créer une entrée (SuperAdmin)
Rédigez le titre, la version, le type (FEATURE, IMPROVEMENT, BUGFIX, SECURITY, DEPRECATION) et le contenu. Statut initial : brouillon.
POST /api/store/changelog
Publier l'entrée
Définir publishedAt déclenche la visibilité pour les utilisateurs du plan ciblé. Filtrez par STARTER / PRO / ENTERPRISE / tous.
PATCH /api/store/changelog/[id] { "publishedAt": "2026-06-04" }
Vue publique utilisateur
Tous les utilisateurs connectés voient la timeline des versions publiées, triée de la plus récente à la plus ancienne.
GET /api/store/changelog/public
⭐ Fonctionnalités clés
5 types d'entrées
FEATURE (bleu), IMPROVEMENT (vert), BUGFIX (orange), SECURITY (rouge), DEPRECATION (gris) — badges colorés distinctifs.
Ciblage par plan
Publiez une nouveauté uniquement pour les comptes PRO ou ENTERPRISE sans la montrer aux utilisateurs STARTER.
Admin exclusif
Seuls les SuperAdmins peuvent créer, modifier ou supprimer des entrées. Les managers voient uniquement la vue publique.
Timeline versionnée
Affichage chronologique en timeline avec numéros de version sémantique (v2.5.0, v2.4.1, etc.).
Changelog AllyStore — Dernières versions
| Version | Type | Titre | Date | Plan |
|---|---|---|---|---|
| v2.5.0 | Feature | Module Drive avec créneaux personnalisables | 04/06/2026 | PRO+ |
| v2.4.2 | Bugfix | Correction calcul TVA multi-taux | 28/05/2026 | Tous |
| v2.4.1 | Improvement | Performances caisse POS ×3 | 20/05/2026 | Tous |
| v2.4.0 | Security | Renforcement JWT + rotation des clés API | 10/05/2026 | Tous |
Notifications
Alertez les bons utilisateurs sur les événements critiques : stock bas, DLC, paiements, retours.
🔧 Comment l'utiliser
Configurer les canaux
Dans les paramètres, activez IN_APP (toujours actif), EMAIL et/ou SMS selon votre abonnement et préférences.
PATCH /api/store/settings/notifications
Recevoir les alertes
La cloche dans la barre de navigation affiche un badge rouge avec le nombre de notifications non lues.
GET /api/store/notifications?unread=true
Marquer comme lu
Cliquez sur une notification pour la marquer lue individuellement, ou "Tout marquer lu" pour vider le centre.
PATCH /api/store/notifications/[id]/read
⭐ Fonctionnalités clés
8 types d'événements
LOW_STOCK, EXPIRY_ALERT, SALE_COMPLETED, NEW_CUSTOMER, PAYMENT_RECEIVED, SUPPLIER_INVOICE_DUE, BUDGET_EXCEEDED, RETURN_CREATED.
3 canaux de diffusion
IN_APP (centre de notifications en temps réel), EMAIL (récapitulatif) et SMS (alertes urgentes uniquement).
Centre chronologique
Liste de toutes les notifications triées par date, avec badge de non-lues et actions rapides.
Cycle de statut complet
PENDING → SENT → READ / FAILED. Traçabilité complète de chaque notification pour audit.
Centre de notifications — 4 non lues
| Type | Message | Canal | Statut | Date |
|---|---|---|---|---|
| LOW_STOCK | Riz Parfumé 5kg : 3 unités restantes | IN_APP + EMAIL | Non lu | Aujourd'hui 09:14 |
| EXPIRY_ALERT | Yaourt Bissap : DLC dans 2 jours | IN_APP | Non lu | Aujourd'hui 08:30 |
| PAYMENT_RECEIVED | Paiement Mobile Money 45 000 FC reçu | IN_APP | Lu | Hier 17:22 |
| BUDGET_EXCEEDED | Budget Frais généraux dépassé de 12 % | IN_APP + SMS | Non lu | Hier 14:05 |
Imprimante & tiroir-caisse
Impression directe des tickets (ePOS) et ouverture automatique du tiroir — sans aucun logiciel à installer sur le poste.
🔧 Comment l'utiliser
Brancher le matériel
Imprimante sur le réseau du magasin (Ethernet/WiFi), tiroir-caisse relié à l'imprimante par câble RJ12 (port DK). Réservez l'IP de l'imprimante dans votre routeur (bail DHCP statique).
Imprimante compatible ePOS-Print requise (ex. Epson TM-m30III)
Configurer le poste de caisse
Paramètres → Imprimante de caisse : saisissez l'adresse IP de l'imprimante (visible sur son ticket de statut), activez SSL, puis lancez un ticket de test. La configuration est propre à chaque poste.
Config stockée par poste (localStorage) — pas en base
Encaisser normalement
Après chaque vente, bouton « Imprimer le ticket » dans l'écran de succès. Sur paiement espèces, le tiroir s'ouvre automatiquement — y compris pour les ventes hors-ligne.
Ticket 80mm : TVA ventilée, remises, points fidélité, rendu monnaie
⭐ Fonctionnalités clés
Impression directe ePOS
Le navigateur parle directement à l'imprimante en HTTP/XML sur le réseau local. Aucun driver, aucun agent à installer — fonctionne sur PC, Android et iPad.
Tiroir piloté
Ouverture automatique sur paiement espèces via l'impulsion DK de l'imprimante. Test manuel disponible depuis l'écran de configuration.
Ticket conforme
En-tête et pied personnalisables (Paramètres → Ticket), ventilation TVA par taux, remises promotions, points fidélité, rendu monnaie, devise du magasin.
SSL imprimante
L'application étant servie en HTTPS, l'imprimante est appelée en SSL (certificat à accepter une fois par poste) — guide intégré dans l'écran de réglages.
Imprimante de caisse — poste Caisse 1
| Réglage | Valeur | Statut |
|---|---|---|
| Adresse IP | 192.168.1.50 | Joignable |
| Device ID | local_printer | OK |
| SSL | Activé | Certificat accepté |
| Ticket de test | Imprimé + tiroir ouvert | Test réussi ✓ |
Mode hors-ligne
La caisse continue d'encaisser pendant les coupures internet — synchronisation automatique au retour du réseau.
🔧 Comment ça marche
Coupure détectée
Un bandeau rouge apparaît en caisse : « Mode hors-ligne ». Vous continuez à scanner et encaisser normalement — les ventes reçoivent un ticket provisoire (OFF-XXXXXXXX).
File locale IndexedDB — rien ne quitte le poste
Retour du réseau
Les ventes en attente se synchronisent automatiquement (bandeau ambre avec compteur). Chaque vente porte un identifiant unique généré avant l'envoi : aucun doublon possible, même si la réponse réseau se perd.
POST /api/store/sales (clientSaleId idempotent)
Numérotation définitive
Une fois synchronisée, la vente reçoit son numéro officiel et les stocks affichés se rafraîchissent. Les annulations restent désactivées tant qu'une vente n'est pas synchronisée.
Synchro périodique de secours toutes les 60 s
⭐ Fonctionnalités clés
Caisse ininterrompue
Scan, panier, remises et encaissement espèces/carte fonctionnent sans réseau. L'impression du ticket aussi — l'imprimante est sur le réseau local.
Synchro idempotente
Identifiant client généré avant l'envoi : si la réponse se perd après l'enregistrement serveur, le renvoi ne crée pas de doublon.
Limites maîtrisées
Le paiement par points fidélité est désactivé hors-ligne (le solde vit côté serveur). Les stocks affichés peuvent être légèrement décalés jusqu'à la synchro.
Combo onduleur
Associé à un onduleur UPS (kit Complet), le magasin encaisse même pendant une coupure de courant ET d'internet.
Support & Aide
Tickets de support intégrés, guide contextuel et assistance par votre canal préféré.
🔧 Comment l'utiliser
Créer un ticket
Menu Support → « Nouveau ticket » : titre, description, priorité. L'équipe AllyStore est notifiée immédiatement.
POST /api/store/tickets
Suivre la conversation
Chaque ticket a un fil de discussion. Vous êtes notifié à chaque réponse du support ; répondre à un ticket résolu le rouvre automatiquement.
POST /api/store/tickets/[id]/messages
Consulter le guide intégré
La page Aide documente tous vos écrans, filtrés selon les modules actifs de votre abonnement — inutile de lire la doc d'un module que vous n'avez pas.
GET /help — généré depuis le registre des pages
⭐ Fonctionnalités clés
Tickets intégrés
Statuts OPEN → IN_PROGRESS → RESOLVED, priorités, réouverture automatique. Tout l'historique reste consultable.
Aide contextuelle
Guide intégré généré automatiquement depuis le registre des pages — toujours à jour avec l'application, filtré par abonnement.
Multi-canal
Tickets in-app pour le suivi, WhatsApp et téléphone pour l'urgence (caisse bloquée, imprimante en panne) — 7j/7, 8h–18h GMT.
Console admin dédiée
Côté plateforme, l'équipe AllyStore traite les tickets de tous les magasins avec vue par priorité et temps de réponse.
Équipements & kits matériel
Trois kits clés en main pour équiper votre magasin : du démarrage simple au supermarché multi-caisses.
⭐ Les trois kits
Kit Minimal — 149 000 FCFA
Tablette POS + douchette USB + imprimante ePOS. Le strict nécessaire pour encaisser proprement dès le premier jour. Pour boutiques et petites épiceries (plan Starter).
Kit Standard — 545 000 FCFA
Caisse complète : 2 tablettes, tiroir-caisse piloté, écran client, balance connectée, routeur WiFi, terminal mobile money. Le plus populaire (plan Growth).
Kit Complet — 1 290 000 FCFA
Supermarché multi-caisses : 19 équipements dont station POS 15", scanners omnidirectionnels, NAS de sauvegarde, caméras IP et onduleur (plan Premium).
Installation incluse
Livraison 22 pays (5–10 jours), installation et formation sur site, garantie 2 ans avec remplacement sous 72h. Paiement en 3× sans frais dès le kit Standard.
Catalogue équipements — devis en ligne
| Équipement | Kit | Compatibilité AllyStore |
|---|---|---|
| Imprimante thermique ePOS 80mm | Tous | Impression directe + tiroir piloté |
| Lecteur code-barres USB | Tous | Scan → panier instantané |
| Balance connectée 15kg | Standard+ | Poids → prix au kilo auto |
| Terminal Mobile Money | Standard+ | Rapports de caisse par mode |
| Serveur NAS 2 To | Complet | Exports + sauvegarde locale |
Paramètres magasin
Configurez l'identité, la devise, la TVA et le programme de fidélité de votre magasin.
5 / 7 modules selon votre plan). Un module non souscrit est invisible dans le menu, ses pages redirigent vers le tableau de bord et ses API répondent 403 MODULE_INACTIVE — l'activation se gère avec le support AllyStore.🔧 Comment l'utiliser
Informations de base
Définissez le nom du magasin, la devise (XOF, XAF, KMF, KES, NGN, EUR, USD…), le symbole monétaire, la locale et le fuseau horaire. À la création du magasin, la devise est pré-remplie automatiquement selon le pays (KMF aux Comores, KES au Kenya…).
PATCH /api/store/settings { "currency": "XOF", "symbol": "FC" }
Configurer la TVA
Définissez les trois taux : normal (18 % par défaut), réduit (8 %) et super-réduit (5 %) appliqués aux ventes.
PATCH /api/store/settings { "vatStandard": 18, "vatReduced": 8 }
Activer la fidélité
Activez le programme, définissez les points par unité monétaire, la valeur par point et le taux de cashback.
PATCH /api/store/settings { "loyaltyEnabled": true, "pointsPerUnit": 1 }
⭐ Fonctionnalités clés
Multi-devises africaines
Prise en charge native de XOF (Franc CFA BCEAO), XAF (Franc CFA BEAC), EUR, USD avec symbole et locale configurables.
TVA à 3 niveaux
Taux normal, réduit et super-réduit assignables par catégorie de produit pour une conformité fiscale complète.
Programme fidélité flexible
Points par unité, valeur par point, taux de cashback — entièrement paramétrable selon votre stratégie commerciale.
Ticket de caisse personnalisé
En-tête, pied de page et affichage du logo sur chaque ticket imprimé depuis la caisse POS.
Paramètres — Supermarché Diallo & Frères
| Paramètre | Valeur |
|---|---|
| Devise | XOF — Franc CFA (FC) |
| Locale | fr-SN (Sénégal) |
| Fuseau horaire | Africa/Dakar (UTC+0) |
| TVA normale | 18 % |
| TVA réduite | 8 % (alimentation) |
| Programme fidélité | Actif |
| Points par 1 000 FC | 10 points |
| Valeur par point | 5 FC |
| Taux cashback | 1 % |
Facturation & Abonnement
Consultez votre abonnement AllyStore, vos factures, et payez directement par mobile money.
🔧 Comment l'utiliser
Consulter votre abonnement
La carte du haut affiche votre plan, le statut de l'abonnement — Essai (14 jours offerts à la création), Actif, Impayé ou Annulé — la période en cours et le cycle (mensuel / annuel, l'annuel étant remisé).
Lire vos factures
Le tableau liste vos 20 dernières factures : numéro (INV-2026-00042), date d'émission, montant TTC dans votre devise locale (TVA 18 % incluse), date d'échéance (7 jours) et statut — À payer ou Payée. À chaque émission, les propriétaires du magasin reçoivent un email.
Payer une facture
Bouton Payer sur toute facture impayée → choisissez le moyen de paiement parmi ceux activés pour votre magasin, saisissez votre numéro de téléphone (mobile money), puis Payer maintenant. Selon le provider : une page de paiement s'ouvre, ou un code USSD à composer s'affiche (avec bouton copier). Validez sur votre téléphone puis cliquez Actualiser.
POST /api/store/payments/initiate { provider, amount, currency, phone, reference }
Confirmation automatique
Dès que le provider confirme le paiement (notification sécurisée vérifiée par signature), la facture passe Payée, l'abonnement redevient Actif et vous recevez un email de confirmation. Aucune action manuelle.
Comprendre le cycle d'impayé
Facture émise → J+5 après l'échéance : email de relance avec la date limite → J+7 : l'accès du magasin est suspendu automatiquement (écran « Accès suspendu » pour toute l'équipe). Le paiement de la facture réactive l'accès immédiatement, sans intervention du support.
⭐ Fonctionnalités clés
Historique des factures
20 dernières factures avec numéro, montants TTC, échéance et statut, triées de la plus récente à la plus ancienne.
Paiement mobile money
Orange Money, M-Pesa, MVola, Tigo Pesa, Flutterwave, Stripe… selon les providers activés pour votre magasin et votre pays.
Code USSD intégré
Pour les providers sans page web : le code à composer s'affiche en grand avec un bouton copier.
Facture en devise locale
Si un tarif local existe pour votre devise (KES, KMF, NGN…), la facture est émise dedans — sinon en FCFA.
Emails automatiques
Facture émise, relance avant suspension et confirmation de paiement — en français ou anglais, aux couleurs de votre magasin.
Réactivation instantanée
Un magasin suspendu pour impayé est rouvert automatiquement dès que le paiement est confirmé.
| Numéro | Date | Montant TTC | Échéance | Statut | |
|---|---|---|---|---|---|
| INV-2026-00057 | 01/06/2026 | 41 300 FC | 08/06/2026 | À payer | Payer → |
| INV-2026-00043 | 01/05/2026 | 41 300 FC | 08/05/2026 | Payée | |
| INV-2026-00029 | 01/04/2026 | 41 300 FC | 08/04/2026 | Payée |
Thème & Logo
Personnalisez l'apparence visuelle pour une marque blanche — vos couleurs, votre identité.
🔧 Comment l'utiliser
Uploader le logo
Glissez votre logo (PNG/SVG, fond transparent recommandé). AllyStore l'envoie sur Cloudinary et stocke l'URL.
POST /api/store/theme/logo (multipart/form-data)
Choisir les couleurs
Sélectionnez via color picker une couleur primaire, secondaire et accent. La prévisualisation se met à jour en direct.
PATCH /api/store/theme { "primary": "#1a6b3c", "secondary": "#f59e0b" }
Sauvegarder & appliquer
Les couleurs sont injectées comme CSS custom properties. Tous les boutons, badges et la navigation adoptent les nouvelles couleurs immédiatement.
--color-primary: #1a6b3c; --color-accent: #f59e0b;
⭐ Fonctionnalités clés
Logo & favicon Cloudinary
Upload direct vers Cloudinary avec optimisation automatique. URL HTTPS sécurisée stockée en base.
3 couleurs configurables
Primaire (navigation, boutons principaux), secondaire (accents), accent (badges, highlights) — via color picker natif.
Prévisualisation en direct
L'interface se met à jour en temps réel pendant la sélection des couleurs, sans rechargement de page.
Isolation par tenant
Chaque magasin a ses propres paramètres de thème indépendants. La personnalisation est strictement isolée.
Configuration thème — Supermarché Diallo & Frères
| Élément | Valeur | Prévisualisation |
|---|---|---|
| Logo | logo-diallo.png (Cloudinary) | ✓ Uploadé |
| Favicon | favicon-diallo.ico | ✓ Uploadé |
| Couleur primaire | #1a6b3c (Vert forêt) | ████ |
| Couleur secondaire | #f59e0b (Or) | ████ |
| Couleur accent | #ef4444 (Rouge vif) | ████ |
Équipe
Gérez les utilisateurs du back-office avec des rôles distincts pour sécuriser les accès.
🔧 Comment l'utiliser
Inviter un utilisateur
Saisissez l'email, prénom, nom, rôle et un mot de passe provisoire. L'utilisateur reçoit un email d'invitation.
POST /api/store/team/invite
Choisir le rôle
OWNER (tous droits), MANAGER (gestion sans admin), CASHIER (caisse uniquement), STOCK_CLERK (stocks uniquement).
{ "role": "CASHIER" }
Désactiver un compte
En cas de départ, désactivez le compte (isActive = false) sans le supprimer — l'historique des actions reste intact.
PATCH /api/store/team/[userId] { "isActive": false }
⭐ Fonctionnalités clés
4 rôles granulaires
OWNER, MANAGER, CASHIER, STOCK_CLERK — chaque rôle ouvre uniquement les modules nécessaires à la fonction.
Invitation par email
Email d'invitation automatique avec mot de passe provisoire sécurisé à changer à la première connexion.
Désactivation sans suppression
Les comptes désactivés ne peuvent plus se connecter mais leur historique (ventes, actions) reste consultable.
Historique de connexion
lastLoginAt enregistré à chaque connexion pour auditabilité et détection de comptes inactifs.
Membres de l'équipe — Supermarché Diallo & Frères
| Nom | Rôle | Dernière connexion | Statut | |
|---|---|---|---|---|
| Moussa Diallo | moussa@diallo-sm.sn | OWNER | Aujourd'hui 08:02 | Actif |
| Aminata Sow | aminata@diallo-sm.sn | MANAGER | Aujourd'hui 08:45 | Actif |
| Kofi Asante | kofi@diallo-sm.sn | CASHIER | Hier 18:30 | Actif |
| Binta Traoré | binta@diallo-sm.sn | STOCK_CLERK | 03/06/2026 | Désactivé |
Clés API & Sécurité
Permettez à des applications tierces d'accéder à l'API AllyStore de façon sécurisée via des clés à scopes.
🔧 Comment l'utiliser
Générer une clé
Donnez un nom descriptif à la clé, sélectionnez les scopes nécessaires et définissez une date d'expiration optionnelle.
POST /api/store/security/api-keys
Copier la clé (one-time)
La clé complète ally_sk_ab12cd34ef56... s'affiche une seule fois. Copiez-la maintenant dans votre application.
Authorization: Bearer ally_sk_ab12cd34ef56gh78ij90
Utiliser dans votre app
Ajoutez le header Authorization à chaque requête API. AllyStore vérifie le hash et les scopes à chaque appel.
GET /api/store/products (avec Authorization)
Révoquer si nécessaire
Désactivez une clé compromise en un clic sans la supprimer — la trace audit reste. Toutes les requêtes avec cette clé sont immédiatement rejetées.
PATCH /api/store/security/api-keys/[id]/revoke
⭐ Fonctionnalités clés
Stockage SHA-256
La clé brute n'est jamais persitée en base. Seul son hash SHA-256 est stocké — même une compromission DB n'expose pas les clés.
Préfixe identifiable
Format ally_sk_[8 chars]... — les 8 premiers caractères sont visibles en clair pour identifier la clé sans l'exposer.
Scopes précis
READ_ALL, WRITE_ALL, SALES_READ, SALES_WRITE, PRODUCTS_READ, PRODUCTS_WRITE, CUSTOMERS_READ, CUSTOMERS_WRITE, ANALYTICS_READ — principe du moindre privilège.
Expiration optionnelle
Définissez une date d'expiration pour les intégrations temporaires. La clé est automatiquement invalidée à échéance.
Clés API actives
| Nom | Préfixe | Scopes | Expiration | Statut | Action |
|---|---|---|---|---|---|
| ERP Odoo Prod | ally_sk_ab12cd34 |
READ_ALL WRITE_ALL | 31/12/2026 | Actif | Révoquer |
| BI Metabase | ally_sk_ef56gh78 |
ANALYTICS_READ SALES_READ | — | Actif | Révoquer |
| Boutique WooCommerce | ally_sk_ij90kl12 |
PRODUCTS_READ CUSTOMERS_WRITE | 30/06/2026 | Expiré | Renouveler |