Découverte & modèle de données
Audit de l'opération hors ligne, modèle d'inventaire par magasin, parcours client pour les parents aux États-Unis et en UE, cadrage RGPD et CCPA, planification de la soumission App Store et Google Play.
Étude de cas · Retail · E-commerce
Comment nous avons livré une marketplace native Swift + Kotlin pour une chaîne physique de produits pour enfants — une inscription sans friction, un catalogue intelligent avec recherche flexible, un tunnel de paiement en deux taps, un panneau d'administration pour l'équipe métier et une synchronisation bidirectionnelle des stocks qui maintient l'alignement entre les stocks en ligne et hors ligne sans intervention manuelle, le tout conforme aux attentes des audiences américaines et européennes dans le cadre du RGPD et du CCPA.
L'équipe Malish est venue nous voir avec une chaîne physique florissante de magasins de produits pour enfants et une ambition numérique claire : proposer l'assortiment en ligne sans obliger les parents à se déplacer avec leurs enfants, et capter la demande au-delà du périmètre piéton de chaque point de vente. La contrainte n'était pas aspirationnelle, elle était opérationnelle. L'opération de gestion des stocks hors ligne fonctionne, le personnel connaît le catalogue, et l'avantage concurrentiel de la chaîne repose sur la curation de l'assortiment qui lui a valu sa réputation. La surface numérique devait prolonger cette opération, non la remplacer — et ne pouvait pas provoquer un incident de désalignement des stocks susceptible de briser la confiance des clients dans un sens ou dans l'autre. Le profil des acheteurs couvre les habitudes de consommation retail américaines et européennes pour des chaînes similaires qui s'étendent en ligne : des parents qui font leurs recherches sur leur téléphone le soir, attendent une précision prévisible des stocks et effectuent un réachat en moins de 30 secondes lorsque le produit est déjà connu. Les plateformes marketplace SaaS ont été écartées car leurs règles d'inventaire définies par le fournisseur et leurs contraintes d'intégration entrent en conflit avec la logique d'assortiment propre à la chaîne. Un MVP Flutter a été envisagé puis déprioritaire car la finition retail — retours haptiques natifs à la plateforme, accessibilité prévisible, comportement idiomatique de la plateforme — est précisément là où un acheteur de produits pour enfants remarque la différence, et la prime de confiance dans cette catégorie ne résiste pas à une interface en décalage. Le résultat est un client iOS natif en Swift, un client Android natif en Kotlin, un backend Symfony avec un panneau d'administration React, un catalogue propulsé par ElasticSearch, une synchronisation bidirectionnelle des stocks avec les magasins physiques et une livraison intégrée — le tout positionné pour les audiences américaines et européennes dans le respect des exigences RGPD et CCPA dès le lancement.
Un aperçu de ce que le build Malish a permis de réaliser sur iOS natif, Android natif, l'administration Symfony et la synchronisation des stocks multi-magasins au cours de son premier cycle de production.

Le choix de plateforme domine toutes les autres décisions architecturales dans une marketplace retail où la confiance de l'acheteur est le produit. Nous avons choisi Swift natif sur iOS et Kotlin natif sur Android plutôt que Flutter et les plateformes marketplace SaaS, car les compromis s'alignent clairement sur l'avantage concurrentiel de la chaîne. Swift et Kotlin natifs offrent l'expérience idiomatique que l'acheteur retail ressent dès les trois premiers taps — retours haptiques précis, navigation native au système, accessibilité prévisible et un flux tap-vers-achat indiscernable des autres applications commerciales de l'acheteur. Flutter est une alternative légitime lorsque la marque accepte explicitement une légère interface en décalage et privilégie la vélocité d'une base de code unique sur le soin retail ; pour une chaîne de produits pour enfants dont la prime de confiance ne résiste pas à ce compromis, le natif l'emporte.
Les plateformes marketplace SaaS ont été écartées car leurs règles d'inventaire définies par le fournisseur et leurs contraintes d'intégration entrent en conflit avec la logique d'assortiment propre à la chaîne et l'alignement des stocks multi-magasins déjà en place. Une option Shopify avec une application mobile personnalisée a été envisagée puis déprioritaire car la surface de verrouillage s'amplifie — fournisseur de paiement, thème, modèle d'inventaire, limites d'extensions d'application — et le fossé concurrentiel de la chaîne repose précisément sur la curation qu'une marketplace standardisée aplatit. L'ensemble du stack — Swift, Kotlin, Symfony, admin React, ElasticSearch, PostgreSQL, Redis — est ouvert et justifiable de bout en bout, sans plateforme propriétaire qui enferme l'équipe opérationnelle dans un fournisseur unique.
| Dimension | Natif (Malish) | Flutter | Plateforme marketplace SaaS |
|---|---|---|---|
| Finition native | Idiomatique à la plateforme — haptiques, navigation, accessibilité | Proche, mais risque d'interface en décalage sur le retail | Défini par le fournisseur ; varie selon le modèle |
| Flexibilité synchronisation stocks | Connecteur Symfony en propre par magasin | En propre — même backend Symfony | Connecteur fournisseur ; extension limitée |
| Adéquation multi-magasins | Disponibilité par magasin dans le catalogue | Possible ; même backend | Modèle multi-magasins fournisseur — prescriptif |
| Verrouillage SaaS marketplace | Aucun — stack entièrement maîtrisé | Aucun — stack entièrement maîtrisé | Élevé — paiement, thème, inventaire |
| Délai de lancement | 14–22 semaines pour le MVP | 10–18 semaines — base de code unique | 4–10 semaines — défini par le modèle |
| Adéquation App Store / Play Store | Binaires natifs de premier plan | Acceptable ; schémas de révision connus | Application fournisseur — enveloppe de marque |
| Adéquation conformité (US et UE) | En propre — RGPD + CCPA intégrés dès la conception | En propre — même posture | Contrôlé par le fournisseur — varie selon la région |
Références de la plateforme : Documentation Apple Swift, Documentation Kotlin, Documentation Symfony.

Le client iOS est développé en Swift avec un hybride UIKit et SwiftUI pour les écrans où la vélocité de SwiftUI aide et où la prévisibilité de UIKit est essentielle. L'ensemble de la surface orientée utilisateur s'articule autour d'un catalogue intelligent avec une recherche flexible propulsée par ElasticSearch — par marque, catégorie, tranche d'âge, taille, magasin et termes en texte libre réellement utilisés par les parents — et un tunnel de paiement en deux taps qui réduit le flux de réachat à sa surface minimale crédible. Le premier tap confirme le panier avec l'adresse de livraison par défaut et le moyen de paiement enregistré ; le deuxième tap passe la commande avec une étape de révision finale. Apple Pay et les cartes enregistrées pré-remplissent la surface de paiement ; l'autocomplétion d'adresse pré-remplit la livraison.
L'inscription est conçue pour être sans friction — un parent avec un enfant en bas âge n'a aucune patience pour une intégration multi-écrans. La sélection du magasin au premier lancement est géolocalisée avec une option de substitution manuelle ; les lancements suivants reviennent par défaut au dernier magasin sélectionné. Les notifications push pour les promotions, le statut des commandes et les signaux de disponibilité en retrait fonctionnent via le service Apple Push Notification avec un consentement explicite lors de la première autorisation. La surface iOS est livrée dans le cadre de notre pratique de développement d'applications mobiles et partage son système de design avec le client Android via une spécification de design-tokens partagée plutôt qu'une base de code commune.

Le client Android est développé en Kotlin avec Jetpack Compose pour la couche UI et le même catalogue propulsé par ElasticSearch que consomme le client iOS. Le catalogue calcule la disponibilité par magasin plutôt qu'un chiffre unique pour toute la chaîne, de sorte qu'un acheteur qui retire en magasin voit le stock de ce magasin, et qu'un acheteur en livraison voit le stock du magasin d'exécution le plus proche. L'adéquation multi-magasins était la contrainte de conception dominante — une chaîne de produits pour enfants dont les magasins portent des assortiments qui se chevauchent sans être identiques ne peut pas survivre à un chiffre de stock unique pour toute la chaîne qui trompe l'acheteur dans un sens ou dans l'autre.
Derrière le catalogue, le moteur de workflow de commandes sur le backend Symfony gère les transitions d'état — passée, préparée, prête, expédiée, livrée — avec des événements webhook vers les terminaux du personnel des magasins physiques et des notifications push vers l'acheteur. Google Play Billing gère les achats intégrés ; l'intégration de l'API du prestataire de livraison prend en charge la passation au livreur afin que la chaîne n'ait pas à coordonner les coursiers manuellement. La même équipe d'ingénierie assure iOS et Android en parallèle dans le cadre de notre pratique d'ingénierie iOS et Android, et le panneau d'administration React — une surface séparée mais co-conçue — réside dans le même déploiement Symfony pour l'équipe opérationnelle.

La posture de confidentialité de Malish était une décision d'architecture avant d'être une bannière. Les données personnelles sur les clients mobiles sont limitées à ce qui est nécessaire pour le paiement, la livraison et le réachat ; le modèle de données encode des fenêtres de conservation par entité, de sorte qu'un enregistrement de commande livrée est purgé selon un calendrier plutôt que de s'accumuler indéfiniment. Les données des enfants ne sont intentionnellement pas collectées — l'acheteur est le parent, le catalogue concerne des produits pour enfants, mais l'application ne sollicite aucune information identifiant les enfants au-delà d'un filtre générique de tranche d'âge sur le catalogue.
La synchronisation bidirectionnelle des stocks est la colonne vertébrale opérationnelle. Chaque magasin physique dispose d'un connecteur typé qui émet des mises à jour webhook lors des changements de stock — ventes, réapprovisionnements, corrections manuelles — et le backend Symfony ingère, réconcilie et propage vers le catalogue mobile. Le journal de réconciliation est exposé dans le panneau d'administration React afin qu'un opérateur puisse résoudre une divergence en quelques minutes plutôt que de réconcilier deux systèmes manuellement. Les journaux d'accès sont structurés et rotatifs ; chaque modification du catalogue, chaque transition d'état de commande et chaque décision de consentement est enregistrée dans une piste d'audit immuable. La posture est conçue pour s'aligner sur les obligations du RGPD pour les utilisateurs de l'Union européenne et sur les obligations du CCPA / CPRA pour les utilisateurs en Californie et dans l'ensemble des États-Unis.
Posture de conformité : Conforme RGPD · prêt ISO 27001 · SOC 2 Type II en cours · compatible HIPAA · CCPA reconnu.
Un build en cinq phases qui a conduit Malish d'une chaîne retail exclusivement physique à une marketplace native iOS + Android avec synchronisation des stocks multi-magasins et livraison intégrée.
Audit de l'opération hors ligne, modèle d'inventaire par magasin, parcours client pour les parents aux États-Unis et en UE, cadrage RGPD et CCPA, planification de la soumission App Store et Google Play.
Squelette Symfony, REST API typée, catalogue ElasticSearch, modèle de disponibilité par magasin, moteur de workflow de commandes, cache Redis, squelette de synchronisation bidirectionnelle des stocks.
Client iOS Swift et client Android Kotlin développés en parallèle, UX catalogue intelligent, paiement en deux taps, notifications push, intégration Apple Pay et Google Play Billing.
Panneau d'administration React avec contrôle d'accès par rôle, tableau de bord commandes, intégration API prestataire de livraison, journal de réconciliation, durcissement prêt pour l'audit, échafaudage de préparation tierce.
Soumission App Store + Google Play sur les storefronts américains et européens, déploiement des connecteurs d'inventaire dans les magasins physiques, intégration de l'équipe opérationnelle, tableaux de bord analytiques.
Le workflow de commandes de Malish est la partie du build qui se capitalise opérationnellement. Le backend Symfony héberge un moteur de workflow qui fait progresser les commandes à travers les états passée, préparée, prête, expédiée et livrée, avec des garde-fous de transition explicites et une diffusion webhook vers les terminaux du personnel des magasins physiques et le canal push de l'acheteur. L'intégration de l'API du prestataire de livraison assure la passation au livreur : lorsqu'une commande entre dans l'état « prête », le backend demande un livreur au prestataire intégré, transmet le payload d'adresse et écoute les mises à jour de statut qui se propagent vers l'acheteur en quasi-temps réel. Les flux paiement à la livraison en espèces et par carte sont pris en charge aux côtés du paiement intégré pour les profils d'acheteurs où ce choix reste pertinent. Le panneau d'administration React encapsule le workflow avec un modèle de contrôle d'accès par rôle — associé de magasin, responsable de magasin, opérations centrales, finance — et une piste d'audit qui survit aux changements d'équipe. La gestion flexible des produits et des catégories permet à l'équipe métier d'ajouter une marque, une catégorie, une tranche d'âge ou une collection saisonnière sans faire appel à un développeur ; la même surface d'administration porte les campagnes promotionnelles, la programmation des bannières et la vue acheteur de type CRM que l'équipe opérationnelle utilise pour les actions de réachat. L'ajout d'un nouveau magasin à la chaîne représente une modification de configuration d'une page dans ce même panneau d'administration : une ligne, un connecteur d'inventaire, un polygone de zone de livraison, et le magasin apparaît dans le catalogue multi-magasins sans déploiement.
Malish a été lancé sur l'App Store d'Apple et Google Play avec des storefronts actifs aux États-Unis et dans l'Union européenne pour les chaînes retail qui s'étendent en ligne. La même architecture sert une chaîne de produits pour enfants multi-magasins en Californie, New York, Texas, Floride ou Washington aux États-Unis, et aux Pays-Bas, en Allemagne, en France, en Irlande ou en Suède dans l'UE, sans dupliquer la base de code par région. Les flux de consentement sont adaptés par région au niveau du client : les acheteurs de l'UE et de l'EEE reçoivent un écran de consentement granulaire de type RGPD avec des interrupteurs séparés pour toute analytique produit optionnelle ; les acheteurs de Californie reçoivent une divulgation de type CCPA « Ne pas vendre ou partager mes informations personnelles » dans le même flux. Les pratiques de traitement des données sont alignées sur le RGPD pour les utilisateurs européens et sur le patchwork de confidentialité des États américains — CCPA / CPRA (Californie), VCDPA (Virginie), CPA (Colorado), CTDPA (Connecticut), UCPA (Utah), TDPSA (Texas) et Oregon CPA. Étant donné que le modèle de données minimise les données personnelles par conception et ne sollicite explicitement aucune information identifiant les enfants, la conformité régionale se réduit à une divulgation honnête et un flux de consentement clair plutôt qu'à une ségrégation des données par juridiction.
L'infrastructure a été déployée en parallèle dans les régions UE et États-Unis — Pays-Bas, Allemagne, France, Suède et Irlande pour la couverture UE ; Est et Ouest des États-Unis pour l'Amérique du Nord — afin que les applications servent les deux marchés avec une faible latence dès le lancement. La classification d'âge App Store et la classification de contenu Google Play ont toutes deux été calibrées pour le jeu de fonctionnalités retail de produits pour enfants, et la politique de confidentialité intégrée a été rédigée pour documenter l'architecture ci-dessus, en citant directement les obligations RGPD et les obligations CCPA californien. L'équipe d'ingénierie derrière ce build est répartie sur le fuseau CET et travaille en journée CET avec un chevauchement côte Est des États-Unis (9h–13h ET) pour les stand-ups, la chorégraphie des révisions de stores et la réponse aux incidents — le fuseau horaire qui permet à un opérateur retail américain et à une équipe d'ingénierie européenne de partager quatre heures de chevauchement en direct chaque jour. La marketplace sert les audiences américaines et européennes comme une surface unifiée.
La feuille de route active de développement logiciel sur mesure pour Malish comprend un sous-système de fidélité avec une hiérarchisation par magasin et un portefeuille de récompenses accessible aux parents, une surface de localisation de magasins avec les horaires en temps réel et la réservation de créneaux de retrait, un modèle de zone de livraison élargi pour l'exécution inter-magasins et un niveau grossiste pour les clients B2B dans le segment américain et européen de la petite enfance. Une surface web complémentaire est prévue comme extension de la deuxième phase — partageant le backend Symfony et la spécification de design-tokens avec les clients natifs — pour capter le trafic de recherche sur ordinateur sans obliger les parents à quitter le mobile. Les plans d'infrastructure incluent une automatisation plus poussée du journal de réconciliation, un système d'alerte interne pour les désalignements de stocks et une future évaluation d'aptitude indépendante intégrée à la feuille de route cloud & DevOps.
Si vous planifiez une marketplace native iOS + Android, une chaîne retail multi-magasins qui passe en ligne, ou tout produit de consommation où la synchronisation des stocks et la finition de la plateforme doivent s'articuler ensemble pour des audiences aux États-Unis et en UE, nous avons livré ce stack de bout en bout et pouvons réduire significativement le délai de build. L'équipe d'ingénierie derrière ce projet est au sein d'YuSMP Group. Nous travaillons à prix fixe pour les MVP bien cadrés et sur des équipes de développement dédiées pour la livraison continue, avec une journée de travail CET et une fenêtre garantie de chevauchement côte Est des États-Unis (9h–13h ET) pour les stand-ups, démonstrations et réponses aux incidents.
Une marketplace locale native iOS + Android avec un backend Symfony, un catalogue ElasticSearch, un paiement en deux taps et un panneau d'administration de base coûte généralement entre 140 000 € et 310 000 € pour un MVP. L'ajout d'une synchronisation bidirectionnelle des stocks avec les magasins physiques, de l'intégration d'un service de livraison, d'un accès admin par rôle, d'une recherche flexible propulsée par ElasticSearch et d'une console d'administration de niveau CRM durcie porte un produit complet entre 360 000 € et 680 000 €. Les principaux postes de coût sont la couche de synchronisation des stocks, la logique de catalogue multi-magasins et la chorégraphie de soumission et de révision sur l'App Store et Google Play.
Swift natif sur iOS et Kotlin sur Android offrent l'expérience idiomatique à la plateforme qu'un acheteur retail ressent dès les trois premiers taps — retours haptiques précis, navigation native au système, accessibilité prévisible. Flutter est une alternative légitime lorsque la marque accepte explicitement une légère interface en décalage et privilégie la vélocité d'une base de code unique. Les plateformes marketplace SaaS enferment la marque dans des règles d'inventaire définies par le fournisseur et des contraintes d'intégration — fatal pour une chaîne dont l'avantage concurrentiel repose sur le réseau de magasins physiques et son propre assortiment. Pour Malish, le natif l'a emporté sur la finition retail et la flexibilité d'intégration.
Une synchronisation bidirectionnelle des stocks robuste est une décision d'architecture. Chaque magasin physique dispose d'un connecteur typé qui émet des mises à jour webhook lors des changements de stock ; le backend Symfony ingère, réconcilie et propage vers le catalogue mobile. Le catalogue calcule la disponibilité par magasin plutôt qu'un chiffre unique pour toute la chaîne, de sorte qu'un acheteur qui retire en magasin voit le stock de ce magasin. Le panneau d'administration expose le journal de réconciliation afin qu'un opérateur puisse résoudre une divergence en quelques minutes plutôt que de réconcilier deux systèmes manuellement.
Un tunnel de paiement en deux taps réduit les décisions de l'acheteur à la surface minimale crédible : le premier tap confirme le panier avec l'adresse de livraison par défaut et le moyen de paiement enregistré ; le deuxième tap passe la commande avec une étape de révision finale. Les cartes enregistrées, Apple Pay et Google Play Billing pré-remplissent la surface de paiement ; l'autocomplétion d'adresse pré-remplit la surface de livraison ; et un interrupteur de substitution permet à l'acheteur de pré-autoriser un échange pour un article en rupture de stock. Ce flux est la référence absolue pour les applications retail à réachat répété.
Un MVP ciblé avec des clients natifs Swift et Kotlin, un backend Symfony, une recherche ElasticSearch, un paiement en deux taps et des outils d'administration de base prend généralement 14 à 22 semaines. L'ajout d'une synchronisation bidirectionnelle des stocks avec les magasins physiques, de l'intégration d'un service de livraison, d'un accès admin par rôle, d'un tableau de bord analytique et d'un sous-système de fidélité ajoute 8 à 14 semaines. La phase de durcissement prête pour l'audit — soumission App Store et Google Play, passation KYC pour les paiements, révision d'aptitude tierce — devrait être budgétée à 3 à 5 semaines de travail dédié.
Cas associés

Application client, application préparateur, panneau admin pour une chaîne alimentaire régionale — logistique conçue de zéro.
Voir le cas →
Découverte pour une paire d'applications de livraison de fleurs — catalogue conscient du stock, paiement en trois étapes, inventaire fleuriste.
Voir le cas →
Marketplace de pièces auto avec CRM vendeurs — recherche VIN, inventaire multi-sites.
Voir le cas →Partagez quelques détails et un consultant senior vous répondra dans un délai d’un jour ouvrable.