Journal

Quand le client change, la plateforme doit suivre

Kooko a commencé par livrer le repas du soir à des particuliers, avant de servir des groupes de collègues, puis leurs employeurs. Cinq ans et quatre architectures nous ont appris quand faire évoluer un système — et quand cesser de le prolonger.

Tous les articlesArchitectureMigrationCommerce
Publié le
28 avril 2026
Lire
7 min de lecture
Écrit par
Eric Chautems
Sommaire

Sur cette page

Kooko livrait les plats de restaurants lausannois. Ils étaient cuisinés sur place, transportés à vélo par des coursiers salariés et conditionnés dans des emballages compostables. Au départ, nous livrions le repas du soir à des particuliers. Puis les commandes sont devenues collectives, le midi a remplacé le soir et les entreprises sont devenues nos clientes.

Kooko était aussi notre propre société. Nous l’avons cofondée et avons développé chacune de ses versions. Ce récit n’est donc pas celui d’un mandat classique, mais celui de cinq années pendant lesquelles le métier a évolué plus vite que la plateforme. Elles nous ont surtout appris qu’une bonne architecture ne le reste pas éternellement : il suffit parfois que le client change pour qu’elle ne réponde plus au bon problème.

Au début, nous livrions le dîner d’une personne

La première promesse était volontairement étroite : Lausanne, le soir, des plats préparés par les restaurants de la ville et livrés à vélo. Nous ne cherchions pas encore à bâtir une place de marché universelle. Il fallait lancer rapidement, limiter les frais d’infrastructure et rendre un petit catalogue instantané sur mobile.

Nous avons donc compilé toute la boutique avec Gatsby. Sylius fournissait les produits, les restaurants, les catégories et les canaux de vente au moment du build. Capacitor emballait ensuite le même résultat pour le web, l’App Store et le Play Store.

gatsby-config.js
{ resolve: "gatsby-source-custom-api",
options: { url: process.env.GATSBY_SYLIUS_CHANNEL_URL, rootKey: "SyliusChannel" } },
{ resolve: "gatsby-source-custom-api",
options: { url: process.env.GATSBY_SYLIUS_PRODUCT_URL, rootKey: "SyliusProductBeta" } },
{ resolve: "gatsby-source-custom-api",
options: { url: process.env.GATSBY_SYLIUS_VENDOR_LAUSANNE, rootKey: "SyliusVendor" } },

Un catalogue statique peut sembler étrange lorsque les restaurants modifient régulièrement leur carte. Nous avions prévu une autre voie que la publication d’une nouvelle version mobile : chaque build produisait un paquet web téléchargeable, et l’application vérifiait sa disponibilité pendant la navigation. Une nouvelle carte demandait ainsi un build et une mise à jour légère, pas un nouveau passage par les boutiques d’applications.

Un restaurant ne devrait pas attendre Apple pour modifier sa carte.

Seuls les stocks, le panier et le paiement restaient dynamiques. Pour une seule ville et un unique service quotidien, cette solution était rapide, peu coûteuse et suffisamment simple. Ses limites correspondaient encore à celles du métier : le soir était inscrit dans le build et un panier ne pouvait contenir les plats que d’un restaurant. Une cuisine, un sac, un vélo — à l’époque, cela avait tout son sens.

Puis la commande est devenue collective

Le minimum de commande a changé la donne. Une personne seule l’atteignait rarement ; trois collègues réunis autour d’une table, presque toujours. Mais trois collègues ne choisissent pas forcément le même restaurant, et un panier rempli à plusieurs ne peut pas rester enfermé dans le navigateur de l’un d’eux.

La deuxième application Kooko s’est donc construite autour d’une commande partageable, enregistrée côté serveur. Une personne lançait le panier, envoyait le lien à ses collègues et chacun y ajoutait son repas, y compris depuis un autre restaurant. La commande pouvait être confirmée dès que le groupe atteignait le minimum.

La deuxième application Kooko en mode clair, avec l’adresse de livraison, le choix du soir et un plat prêt à être commandé.Le même écran de commande Kooko en mode sombre, avec une mise en page identique et des couleurs adaptées.

Nous avons également séparé l’éditorial du transactionnel. Strapi permettait à l’équipe de faire évoluer les cartes et les pages des restaurants au rythme du contenu. Medusa gardait la responsabilité des produits, des prix, des paniers et des paiements. Chaque restaurant disposait de sa propre boutique et de ses accès, tandis qu’une relation légère reliait sa carte éditoriale aux produits vendus.

Quand toute une table remplit le panier, celui-ci devient une fonctionnalité du produit.

L’écran de découverte de Kooko en mode clair, avec une carte de Lausanne, des filtres par cuisine et les restaurants partenaires.Le même écran de découverte des restaurants en mode sombre, avec la carte, les filtres et la grille de partenaires.

L’interface a évolué avec la manière de commander. La première application demandait quel plat manger ce soir. La deuxième aidait un groupe à choisir parmi plusieurs cuisines et restaurants. Nous n’avons pas changé de technologie par envie de reconstruire, mais parce que le comportement des clients avait réellement changé.

L’employeur est devenu le client

L’étape suivante est venue de l’économie des tournées. Livrer cinquante repas à cinquante domiciles exige cinquante trajets. Les déposer dans un seul immeuble de bureaux n’en demande qu’un. Cet écart a fait basculer Kooko de la livraison de repas aux particuliers vers une offre de restauration destinée aux entreprises.

Ajouter un simple compte professionnel à la boutique publique n’aurait pas suffi. Chaque société devait retrouver ses propres restaurants, ses tarifs négociés, ses moyens de paiement et ses règles de commande. Nous avons créé un portail dédié dont le contexte commençait dans l’adresse : le segment de l’entreprise déterminait son catalogue, son groupe client, son abonnement et son parcours de paiement.

src/utils/routing/navigation.ts
company: defineRoute('/[companySlug]', {
params: z.object({ companySlug: z.string() }),
}),
cart: defineRoute('/[companySlug]/cart', {
params: z.object({ companySlug: z.string() }),
search: z.object({ cart_id: z.string().optional() }).default({}),
}),

Les collaborateurs accédaient ainsi à une expérience propre à leur entreprise. Certaines sociétés réglaient sur facture ; d’autres proposaient la carte ou Twint. Le choix de restaurants pouvait être restreint aux environs immédiats du bureau ou couvrir un secteur plus large. Quant à la commande partagée de l’application précédente, elle est devenue un système de devis et de précommandes adapté aux validations d’une entreprise.

La FAQ de Kooko affichée sous forme de questions repliées sur un téléphone.La FAQ de Kooko affichée sous forme de questions repliées sur un téléphone.

Téléphone390px

L’offre de repas au bureau de Kooko présentée sur une tablette.L’offre de repas au bureau de Kooko présentée sur une tablette.

Tablette834px

Le catalogue des restaurants Kooko affiché en grille dans un navigateur de bureau.Le catalogue des restaurants Kooko affiché en grille dans un navigateur de bureau.

Ordinateur1440px

Trois pages, trois largeursLe site public expliquait le service et présentait les restaurants. Le portail, lui, portait le catalogue, les prix et les règles de commande propres à chaque entreprise.

L’automatisation derrière ce portail était l’une des grandes réussites du projet. Une société qui nous contactait depuis le site pouvait être qualifiée, devenir un prospect, recevoir sa propre fiche et son portail, puis commencer avec une sélection de restaurants proches de ses bureaux.

La page de contact de Kooko demandant le nom de l’entreprise, les coordonnées de la personne de contact et le nombre de collaborateurs à servir.
FigureLe point d’entrée public d’une entreprise. En coulisses, le processus préparait la fiche prospect, le portail et le catalogue de restaurants pertinent.

Mais chaque réponse apportée au métier avait aussi alourdi le système. ERPNext gérait les abonnements, les règles tarifaires et les stocks. Medusa s’occupait du commerce, Strapi du contenu, Directus des opérations, de la logistique et des vues internes. n8n assurait les échanges entre les quatre. Cette architecture était pertinente pour vérifier que les entreprises voulaient réellement acheter ce service. Elle ne l’était plus lorsqu’il a fallu envisager l’ouverture de plusieurs villes.

Genève nous a obligés à reformuler le problème

À la question « combien coûte Genève ? », notre architecture répondait : un nouveau déploiement, une nouvelle instance de commerce, un nouveau schéma et un nouveau portail. Nous avions transformé chaque marché en infrastructure ; grandir signifiait recopier le système.

Défilez latéralement, ou utilisez les flèches.

  • Une proposition d’architecture Kooko de 2022 avec un back-end et une base PostgreSQL distincts pour chaque client, à côté d’un noyau partagé.
    En 2022, chaque client recevait son propre back-end et sa propre base de données.
  • Une proposition d’infrastructure Kooko de 2025 avec un déploiement commerce, un schéma et un portail distincts pour chaque région.
    En 2025, chaque ville impliquait encore une nouvelle instance de commerce, un schéma et un portail.
GalerieÀ trois ans d’intervalle, deux plans ont rencontré la même limite : chaque étape de croissance exigeait de dupliquer l’infrastructure.

Les outils confortaient cette vision. La première version majeure de Medusa ne prévoyait qu’une boutique par installation. Nous avions déjà dû retirer une contrainte de base de données pour héberger plusieurs restaurants. C’était un signal très clair : le modèle de Kooko avait dépassé celui que la plateforme savait représenter.

Un deuxième marché devrait ajouter des données, pas de l’infrastructure.

La quatrième architecture est partie de ce principe. Une ville, un restaurant, une entreprise, un coursier, une carte ou un devis devaient devenir des fiches au sein d’une même plateforme. Les relations devaient remplacer les synchronisations, et l’ouverture d’une ville devait relever de la configuration plutôt que d’un déploiement parallèle.

Une carte de modules reliant les entreprises, les cartes, la livraison, les vendeurs de la place de marché et les devis au cœur du système de commerce.
FigureLa quatrième architecture décrivait Kooko avec des modules métier et leurs relations, plutôt qu’avec plusieurs services reliés par des tâches de synchronisation.

Cette fois, notre ambition était d’écrire moins. La deuxième version de Medusa fournissait un socle de commerce modulaire. Mercur prenait déjà en charge les vendeurs, la séparation des commandes et les reversements. Une base B2B existante couvrait les entreprises, les collaborateurs, les validations et les devis. Notre travail consistait à réunir ces éléments et à ne développer que ce qui appartenait vraiment à Kooko : les cartes, les coursiers et les tournées.

La plateforme Kooko envisagée, reliant Next.js et Payload CMS aux modules Medusa et Mercur pour les entreprises, restaurants, commandes, vendeurs et paiements.
FigureLe contenu et le commerce conservaient des responsabilités distinctes, mais des identifiants remplaçaient les copies. Nous supprimions des synchronisations entières au lieu de chercher à mieux les orchestrer.
Une carte de navigation où Lausanne, Genève et Vevey donnent accès aux routes propres aux entreprises, coursiers, administrateurs et restaurants de chaque marché.
FigureVilles, entreprises, coursiers et restaurants se résolvaient tous en fiches dans la même plateforme. Genève aurait été un marché et un chemin, pas une seconde copie de Kooko.

Ce que Kooko a changé dans notre manière de construire

Genève devait valider ce quatrième modèle avant que Lausanne ne rejoigne la nouvelle plateforme. Kooko a cessé son activité avant ce lancement. Cette architecture est donc restée un projet plutôt qu’une réussite en production, mais le raisonnement qui l’a façonnée compte parmi les enseignements les plus utiles de l’aventure.

Ces cinq années nous ont appris qu’une architecture n’est pas l’expression définitive d’une préférence technique. Elle répond à une clientèle, à une circulation de l’argent et à ce que l’entreprise doit pouvoir répéter. L’application statique convenait à une ville et à une offre du soir. Le panier partagé répondait aux commandes entre collègues. Le portail professionnel a permis de valider le modèle B2B. La plateforme multimarche n’est devenue nécessaire que lorsque Genève a révélé le coût réel de la duplication.

Cette expérience guide encore nos choix. Pour le Cabinet des Alpettes, la bonne réponse était le CMS le plus léger capable de rendre le cabinet autonome. Pour Autocorner, il fallait une couche de données commune pour réunir marques, centres et stock en temps réel. Kooko nous a appris à reconnaître cette différence suffisamment tôt — et à ne construire que la plateforme dont la prochaine étape réelle a besoin.

Journal

À lire aussi

  • Comment le web est devenu incontournable

    Chaque plateforme imposait autrefois son langage, ses outils et son déploiement. Le web s’en est affranchi jusqu’à devenir incontournable, y compris là où il excellait le moins, sans jamais nous livrer l’architecture qui devait accompagner cette victoire.

    ArchitectureOpen source12 min de lecture
  • La stack web a enfin gagné en maturité

    La dernière décennie n’a pas couronné un framework. Elle a produit de meilleurs runtimes, des applications plus légères, des standards communs et des workflows durables. Il reste encore à réunir ces fondations dans une même plateforme.

    ArchitectureOpen sourceDéploiement21 min de lecture
  • Quand contenu et processus métier se rencontrent

    Le site d’Autocorner est devenu le socle d’un projet plus vaste : formulaires réutilisables, disponibilités réelles, notifications et outils internes qui relient parcours client et travail quotidien.

    ArchitectureContenuCommerce6 min de lecture

Prochaine étape

Le problème vous parle ?

Si l’un de ces cas ressemble à votre système, la première conversation ne coûte rien.