555Transition
Marketplace de circuits courts entre producteurs et consommateursFull Stack, 2026

- 7
- espaces applicatifs
- 2 pays, 2 devises
- 1 274 tests automatisés
555transition met en relation les habitants d'un territoire avec les producteurs et artisans qui les entourent. La plateforme réunit sept espaces cloisonnés : un site public, un espace consommateur avec panier et commandes à retirer chez le producteur, un espace professionnel pour gérer sa boutique et ses préparateurs, un espace associatif avec adhésions et événements, un espace santé doublé d'une carte des pharmacies de garde, un back-office d'administration et un espace réservé aux mairies. Chaque structure est vérifiée auprès des registres officiels à l'inscription puis validée manuellement. L'accès aux fonctionnalités est conditionné à un abonnement géré par Stripe, avec facturation française conforme. Le projet couvre la France et la Suisse, en euros comme en francs suisses.
Contexte
Le client souhaitait sortir du modèle des plateformes de livraison nationales, jugées trop éloignées du terrain. Son objectif est de faire produire localement ce qui manque dans un rayon restreint, pas de créer un catalogue généraliste. Le projet est parti d'une maquette fonctionnelle sans base de données, qu'il a fallu transformer en plateforme réelle.
Objectifs
- Permettre à un habitant de trouver les producteurs autour de lui et de commander en retrait direct
- Donner à chaque producteur une boutique autonome, avec ses produits, ses créneaux et ses clients
- Ouvrir la plateforme aux associations et aux professionnels de santé, avec leurs propres règles
- Vérifier l'identité des structures auprès des registres officiels avant toute publication
- Financer le service par des abonnements, avec facturation conforme à la réglementation française
- Couvrir la France et la Suisse, chacune avec sa devise, ses formats et son registre d'entreprises
- Offrir une application mobile sans redévelopper l'interface
Défis techniques
Sept espaces cloisonnés sur une seule application
Un consommateur, un producteur, une association, un praticien et un administrateur n'ont ni les mêmes pages, ni les mêmes droits, ni la même charte. Dupliquer l'interface cinq fois était intenable à maintenir.
Un composant de mise en page unique reçoit une variante et en dérive la couleur, la navigation et les onglets. Une liste blanche de segments par espace permet de rediriger un utilisateur vers la page équivalente du sien plutôt que de le bloquer. Les gardes serveur vérifient le rôle à chaque rendu de layout.
Recherche géographique sur index spatial
Chaque écran filtre par distance, du fil d'accueil à la carte en passant par l'annuaire et les événements. Calculer la distance en mémoire aurait écroulé les temps de réponse dès quelques centaines de fiches.
Les adresses sont converties en coordonnées via la Base Adresse Nationale pour la France et OpenStreetMap pour la Suisse, puis stockées en PostGIS avec un index géographique. Les requêtes de distance et de rayon sont déléguées à la base, avec mise en cache des géocodages pendant sept jours.
Accès conditionné à l'abonnement
Une structure validée ne doit pas accéder aux fonctionnalités tant qu'elle n'a pas souscrit, sans pour autant être enfermée dans une impasse ni perdre ses données.
Une barrière serveur évalue l'abonnement à chaque rendu et restreint la navigation aux pages de souscription, de facturation et de réglages. Le menu est réduit aux mêmes pages pour ne pas proposer de liens inopérants, et les routes d'écriture refusent les requêtes en parallèle.
Facturation française adossée à Stripe
Stripe émet ses propres factures, qui ne répondent pas aux obligations françaises de numérotation séquentielle ni au détail de TVA attendu.
Les webhooks de paiement déclenchent la génération d'une facture maison, avec numérotation séquentielle, ventilation hors taxes et TVA figées au moment de l'émission, archivage du document et envoi au client. Le traitement est idempotent, un même événement rejoué ne crée pas de doublon.
Vérification des structures auprès des registres officiels
N'importe qui pouvait déclarer n'importe quelle entreprise. Il fallait empêcher l'usurpation sans transformer l'inscription en parcours du combattant.
L'identifiant déclaré est confronté au registre du pays, annuaire des entreprises pour la France et Zefix pour la Suisse, avec mise en cache des réponses. L'écran de validation affiche côte à côte l'identifiant saisi à la main et celui renvoyé par le registre, et signale tout écart avant activation du compte.
Notifications sur quatre canaux depuis un point unique
Une même information doit atteindre l'utilisateur dans l'application, par email, par notification navigateur et sur mobile, en respectant ses préférences et sans le submerger.
Un répartiteur central lit les préférences, applique une limitation anti-spam, puis alimente les quatre canaux à partir d'un catalogue de modèles. Les liens sont transposés vers l'espace réel du destinataire, un professionnel ne recevant pas un lien vers l'espace consommateur.
Deux pays, deux devises, deux grilles tarifaires
La Suisse impose ses propres formats d'identifiant, de code postal et de téléphone, son registre d'entreprises et une facturation en francs suisses.
Un référentiel de pays centralise formats, devise et activation, et pilote aussi bien la détection du visiteur que les validations de formulaire. La grille tarifaire est déclinée par pays et par audience, et les tarifs Stripe sont créés dans la devise du plan.
Application mobile sans réécriture de l'interface
Le client voulait une présence sur les magasins d'applications sans financer un second développement complet.
Une enveloppe React Native affiche le site dans une vue web et ajoute ce que le web ne sait pas faire seul : notifications push via Firebase, attestation d'intégrité de l'application et gestion des appareils. Le site détecte qu'il tourne dans l'application pour adapter son affichage.
Vues de l'application

Site public : le réseau social local, avec inscription et vidéo de présentation 
Espace santé : carte des praticiens et pharmacies de garde, avec numéros d'urgence 
Espace professionnel : produits, commandes clients, préparateurs et statistiques 
Version mobile : producteurs autour du foyer, rayon de recherche réglable
Technologies
- Next.js 15.5
- React 19
- TypeScript 5
- PostgreSQL
- PostGIS 3.5
- Drizzle ORM
- Better Auth
- Stripe
- Tailwind CSS 4
- MinIO (S3)
- Leaflet
- Firebase Cloud Messaging
- React Native
- Vitest
- Playwright
- Docker